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

Artifact e5f0cf649eb1477c7a57c9e30516aeead9d9d3f8229f4bbf782365665eb0f556:


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 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72   op;.  if( pExpr
0600: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e  ->flags & EP_Gen
0610: 65 72 69 63 20 29 20 72 65 74 75 72 6e 20 30 3b  eric ) return 0;
0620: 0a 20 20 77 68 69 6c 65 28 20 45 78 70 72 48 61  .  while( ExprHa
0630: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0640: 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20 20   EP_Skip) ){.   
0650: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0660: 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
0670: 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 45  ;.    pExpr = pE
0680: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
0690: 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30  assert( pExpr!=0
06a0: 20 29 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70   );.  }.  op = p
06b0: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
06c0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
06d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
06e0: 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49 73  pr->flags&EP_xIs
06f0: 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72 65  Select );.    re
0700: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
0710: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
0720: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
0730: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
0740: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
0750: 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
0760: 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23 69 66   pExpr->op2;.#if
0770: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0780: 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d  _CAST.  if( op==
0790: 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61  TK_CAST ){.    a
07a0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
07b0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
07c0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
07d0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
07e0: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45  3AffinityType(pE
07f0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
0800: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
0810: 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f  if( (op==TK_AGG_
0820: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
0830: 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45 78 70  _COLUMN) && pExp
0840: 72 2d 3e 79 2e 70 54 61 62 20 29 7b 0a 20 20 20  r->y.pTab ){.   
0850: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0860: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0870: 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54 61 62  ty(pExpr->y.pTab
0880: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
0890: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d  );.  }.  if( op=
08a0: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
08b0: 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  N ){.    assert(
08c0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66   pExpr->pLeft->f
08d0: 6c 61 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63  lags&EP_xIsSelec
08e0: 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t );.    return 
08f0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
0900: 69 74 79 28 0a 20 20 20 20 20 20 20 20 70 45 78  ity(.        pEx
0910: 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65  pr->pLeft->x.pSe
0920: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
0930: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
0940: 70 45 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d  pExpr.    );.  }
0950: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d  .  return pExpr-
0960: 3e 61 66 66 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a  >affExpr;.}../*.
0970: 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61  ** Set the colla
0980: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
0990: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  r expression pEx
09a0: 70 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c  pr to be the col
09b0: 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
09c0: 63 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b  ce named by pTok
09d0: 65 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70  en.   Return a p
09e0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
09f0: 45 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a  Expr node that.*
0a00: 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
0a10: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
0a20: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  r..**.** If a me
0a30: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
0a40: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
0a50: 61 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72  at fact is recor
0a60: 64 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64  ded in pParse->d
0a70: 62 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78  b.** and the pEx
0a80: 70 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pr parameter is 
0a90: 72 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67  returned unchang
0aa0: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
0ab0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
0ac0: 74 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65  teToken(.  Parse
0ad0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
0ae0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
0af0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
0b00: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
0b10: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
0b20: 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65  "COLLATE" clause
0b30: 20 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73   to this express
0b40: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  ion */.  const T
0b50: 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c  oken *pCollName,
0b60: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c    /* Name of col
0b70: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
0b80: 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65  */.  int dequote
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0ba0: 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65   True to dequote
0bb0: 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b   pCollName */.){
0bc0: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65  .  if( pCollName
0bd0: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70  ->n>0 ){.    Exp
0be0: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
0bf0: 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
0c00: 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54  e->db, TK_COLLAT
0c10: 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65  E, pCollName, de
0c20: 71 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20  quote);.    if( 
0c30: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e  pNew ){.      pN
0c40: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70  ew->pLeft = pExp
0c50: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  r;.      pNew->f
0c60: 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61  lags |= EP_Colla
0c70: 74 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20  te|EP_Skip;.    
0c80: 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
0c90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
0ca0: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72  rn pExpr;.}.Expr
0cb0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64   *sqlite3ExprAdd
0cc0: 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61  CollateString(Pa
0cd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
0ce0: 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20  r *pExpr, const 
0cf0: 63 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b  char *zC){.  Tok
0d00: 65 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20  en s;.  assert( 
0d10: 7a 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  zC!=0 );.  sqlit
0d20: 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20  e3TokenInit(&s, 
0d30: 28 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65  (char*)zC);.  re
0d40: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
0d50: 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28  AddCollateToken(
0d60: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
0d70: 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s, 0);.}../*.** 
0d80: 53 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b  Skip over any TK
0d90: 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f  _COLLATE operato
0da0: 72 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  rs..*/.Expr *sql
0db0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
0dc0: 61 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29  ate(Expr *pExpr)
0dd0: 7b 0a 20 20 77 68 69 6c 65 28 20 70 45 78 70 72  {.  while( pExpr
0de0: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
0df0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b  rty(pExpr, EP_Sk
0e00: 69 70 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ip) ){.    asser
0e10: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
0e20: 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20  _COLLATE );.    
0e30: 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70  pExpr = pExpr->p
0e40: 4c 65 66 74 3b 0a 20 20 7d 20 20 20 0a 20 20 72  Left;.  }   .  r
0e50: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
0e60: 2f 2a 0a 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20  /*.** Skip over 
0e70: 61 6e 79 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f  any TK_COLLATE o
0e80: 70 65 72 61 74 6f 72 73 20 61 6e 64 2f 6f 72 20  perators and/or 
0e90: 61 6e 79 20 75 6e 6c 69 6b 65 6c 79 28 29 0a 2a  any unlikely().*
0ea0: 2a 20 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  * or likelihood(
0eb0: 29 20 6f 72 20 6c 69 6b 65 6c 79 28 29 20 66 75  ) or likely() fu
0ec0: 6e 63 74 69 6f 6e 73 20 61 74 20 74 68 65 20 72  nctions at the r
0ed0: 6f 6f 74 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 70  oot of an.** exp
0ee0: 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72  ression..*/.Expr
0ef0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69   *sqlite3ExprSki
0f00: 70 43 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b 65 6c  pCollateAndLikel
0f10: 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  y(Expr *pExpr){.
0f20: 20 20 77 68 69 6c 65 28 20 70 45 78 70 72 20 26    while( pExpr &
0f30: 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
0f40: 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69 70  y(pExpr, EP_Skip
0f50: 7c 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b  |EP_Unlikely) ){
0f60: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
0f70: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0f80: 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a  EP_Unlikely) ){.
0f90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
0fa0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0fb0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
0fc0: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ct) );.      ass
0fd0: 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ert( pExpr->x.pL
0fe0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
0ff0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1000: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
1010: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45  TION );.      pE
1020: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  xpr = pExpr->x.p
1030: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1040: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1050: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1060: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
1070: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20   );.      pExpr 
1080: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1090: 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72      }.  }   .  r
10a0: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
10b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
10c0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
10d0: 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  nce for the expr
10e0: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66  ession pExpr. If
10f0: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20  .** there is no 
1100: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
1110: 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75  g sequence, retu
1120: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  rn NULL..**.** S
1130: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
1140: 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29 0a  ExprNNCollSeq().
1150: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
1160: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29  3ExprNNCollSeq()
1170: 20 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20   works the same 
1180: 65 78 61 63 74 20 74 68 61 74 20 69 74 20 72 65  exact that it re
1190: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65 66  turns the.** def
11a0: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 69  ault collation i
11b0: 66 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20 64  f pExpr has no d
11c0: 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  efined collation
11d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
11e0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d  ating sequence m
11f0: 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69 6e  ight be determin
1200: 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20  ed by a COLLATE 
1210: 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20 62  operator.** or b
1220: 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  y the presence o
1230: 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  f a column with 
1240: 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74  a defined collat
1250: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
1260: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
1270: 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70 72  rs take first pr
1280: 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74 20  ecedence.  Left 
1290: 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a 2a  operands take.**
12a0: 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72   precedence over
12b0: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73 2e   right operands.
12c0: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
12d0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
12e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
12f0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73  xpr *pExpr){.  s
1300: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1310: 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c 53  rse->db;.  CollS
1320: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
1330: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70 72   Expr *p = pExpr
1340: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
1350: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e      int op = p->
1360: 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66  op;.    if( p->f
1370: 6c 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72 69  lags & EP_Generi
1380: 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  c ) break;.    i
1390: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
13a0: 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32  ER ) op = p->op2
13b0: 3b 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d 54  ;.    if( (op==T
13c0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  K_AGG_COLUMN || 
13d0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
13e0: 20 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52 29   op==TK_TRIGGER)
13f0: 0a 20 20 20 20 20 26 26 20 70 2d 3e 79 2e 70 54  .     && p->y.pT
1400: 61 62 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  ab!=0.    ){.   
1410: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
1420: 49 53 54 45 52 20 26 26 20 70 2d 3e 79 2e 70 54  ISTER && p->y.pT
1430: 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68  ab!=0 happens wh
1440: 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72 69  en pExpr was ori
1450: 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ginally.      **
1460: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74   a TK_COLUMN but
1470: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1480: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61  evaluated and ca
1490: 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74  ched in a regist
14a0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  er */.      int 
14b0: 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  j = p->iColumn;.
14c0: 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29        if( j>=0 )
14d0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
14e0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d  char *zColl = p-
14f0: 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  >y.pTab->aCol[j]
1500: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  .zColl;.        
1510: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
1520: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
1530: 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30  NC(db), zColl, 0
1540: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1550: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1560: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53    if( op==TK_CAS
1570: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55  T || op==TK_UPLU
1580: 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70  S ){.      p = p
1590: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63  ->pLeft;.      c
15a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
15b0: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f     if( op==TK_CO
15c0: 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 70  LLATE ){.      p
15d0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
15e0: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
15f0: 20 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e   ENC(db), 0, p->
1600: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1620: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26    if( p->flags &
1630: 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
1640: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66       if( p->pLef
1650: 74 20 26 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e  t && (p->pLeft->
1660: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
1670: 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  te)!=0 ){.      
1680: 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a    p = p->pLeft;.
1690: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16a0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 78 74       Expr *pNext
16b0: 20 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20    = p->pRight;. 
16c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 45 78         /* The Ex
16d0: 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65  pr.x union is ne
16e0: 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20  ver used at the 
16f0: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70  same time as Exp
1700: 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20  r.pRight */.    
1710: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78      assert( p->x
1720: 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e  .pList==0 || p->
1730: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
1740: 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61 67 73       /* p->flags
1750: 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c 61 74   holds EP_Collat
1760: 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74 2d 3e  e and p->pLeft->
1770: 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74 2e 20  flags does not. 
1780: 20 41 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   And.        ** 
1790: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63 61 6e  p->x.pSelect can
17a0: 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d 3e 78  not.  So if p->x
17b0: 2e 70 4c 65 66 74 20 65 78 69 73 74 73 2c 20 69  .pLeft exists, i
17c0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 0a 20  t must hold at. 
17d0: 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 73 74 20         ** least 
17e0: 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65 2e 20  one EP_Collate. 
17f0: 54 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Thus the followi
1800: 6e 67 20 74 77 6f 20 41 4c 57 41 59 53 2e 20 2a  ng two ALWAYS. *
1810: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  /.        if( p-
1820: 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 41  >x.pList!=0 && A
1830: 4c 57 41 59 53 28 21 45 78 70 72 48 61 73 50 72  LWAYS(!ExprHasPr
1840: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
1850: 53 65 6c 65 63 74 29 29 20 29 7b 0a 20 20 20 20  Select)) ){.    
1860: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1870: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1880: 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e 70 4c  ALWAYS(i<p->x.pL
1890: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69 2b 2b  ist->nExpr); i++
18a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
18b0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
18c0: 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  ty(p->x.pList->a
18d0: 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 43 6f  [i].pExpr, EP_Co
18e0: 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  llate) ){.      
18f0: 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
1900: 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  p->x.pList->a[i]
1910: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
1920: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1930: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1950: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65  .        p = pNe
1960: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
1970: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65  }else{.      bre
1980: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1990: 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b  if( sqlite3Check
19a0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
19b0: 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70  pColl) ){ .    p
19c0: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Coll = 0;.  }.  
19d0: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
19e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
19f0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1a00: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
1a10: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
1a20: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
1a30: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
1a40: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
1a50: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1a60: 20 74 68 65 0a 2a 2a 20 64 65 66 61 75 74 6c 20   the.** defautl 
1a70: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1a80: 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ce..**.** See al
1a90: 73 6f 3a 20 73 71 6c 69 74 65 33 45 78 70 72 43  so: sqlite3ExprC
1aa0: 6f 6c 6c 53 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54  ollSeq().**.** T
1ab0: 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  he sqlite3ExprCo
1ac0: 6c 6c 53 65 71 28 29 20 72 6f 75 74 69 6e 65 20  llSeq() routine 
1ad0: 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 65  works the same e
1ae0: 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a  xcept that it.**
1af0: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
1b00: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
1b10: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a  ined collation..
1b20: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
1b30: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b40: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b50: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1b60: 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 73 71 6c  CollSeq *p = sql
1b70: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1b80: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
1b90: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 70 20 3d    if( p==0 ) p =
1ba0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
1bb0: 6c 74 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  ltColl;.  assert
1bc0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( p!=0 );.  retu
1bd0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
1be0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1bf0: 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  e two expression
1c00: 73 20 68 61 76 65 20 65 71 75 69 76 61 6c 65 6e  s have equivalen
1c10: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
1c20: 65 6e 63 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ences..*/.int sq
1c30: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1c40: 4d 61 74 63 68 28 50 61 72 73 65 20 2a 70 50 61  Match(Parse *pPa
1c50: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20  rse, Expr *pE1, 
1c60: 45 78 70 72 20 2a 70 45 32 29 7b 0a 20 20 43 6f  Expr *pE2){.  Co
1c70: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 31 20 3d 20  llSeq *pColl1 = 
1c80: 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
1c90: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 31  lSeq(pParse, pE1
1ca0: 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  );.  CollSeq *pC
1cb0: 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 45 78  oll2 = sqlite3Ex
1cc0: 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72  prNNCollSeq(pPar
1cd0: 73 65 2c 20 70 45 32 29 3b 0a 20 20 72 65 74 75  se, pE2);.  retu
1ce0: 72 6e 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  rn sqlite3StrICm
1cf0: 70 28 70 43 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c  p(pColl1->zName,
1d00: 20 70 43 6f 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d   pColl2->zName)=
1d10: 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  =0;.}../*.** pEx
1d20: 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64  pr is an operand
1d30: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
1d40: 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32   operator.  aff2
1d50: 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20   is the.** type 
1d60: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
1d70: 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20  other operand.  
1d80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1d90: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  urns the.** type
1da0: 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73   affinity that s
1db0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
1dc0: 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  r the comparison
1dd0: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68   operator..*/.ch
1de0: 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  ar sqlite3Compar
1df0: 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  eAffinity(Expr *
1e00: 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32  pExpr, char aff2
1e10: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d  ){.  char aff1 =
1e20: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1e30: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69  nity(pExpr);.  i
1e40: 66 28 20 61 66 66 31 3e 53 51 4c 49 54 45 5f 41  f( aff1>SQLITE_A
1e50: 46 46 5f 4e 4f 4e 45 20 26 26 20 61 66 66 32 3e  FF_NONE && aff2>
1e60: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
1e70: 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73  ){.    /* Both s
1e80: 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70  ides of the comp
1e90: 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d  arison are colum
1ea0: 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e  ns. If one has n
1eb0: 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66  umeric.    ** af
1ec0: 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74  finity, use that
1ed0: 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  . Otherwise use 
1ee0: 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  no affinity..   
1ef0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
1f00: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
1f10: 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71  nity(aff1) || sq
1f20: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
1f30: 66 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a  finity(aff2) ){.
1f40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f50: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
1f60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f80: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a  AFF_BLOB;.    }.
1f90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1fa0: 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f  One side is a co
1fb0: 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20  lumn, the other 
1fc0: 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20  is not. Use the 
1fd0: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
1fe0: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1ff0: 20 61 66 66 31 3c 3d 53 51 4c 49 54 45 5f 41 46   aff1<=SQLITE_AF
2000: 46 5f 4e 4f 4e 45 20 7c 7c 20 61 66 66 32 3c 3d  F_NONE || aff2<=
2010: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
2020: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61  );.    return (a
2030: 66 66 31 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ff1<=SQLITE_AFF_
2040: 4e 4f 4e 45 20 3f 20 61 66 66 32 20 3a 20 61 66  NONE ? aff2 : af
2050: 66 31 29 20 7c 20 53 51 4c 49 54 45 5f 41 46 46  f1) | SQLITE_AFF
2060: 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _NONE;.  }.}../*
2070: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
2080: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
2090: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
20a0: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
20b0: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
20c0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
20d0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
20e0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
20f0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
2100: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
2110: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
2120: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
2130: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
2140: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
2150: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2160: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
2170: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
2180: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
2190: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
21a0: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
21b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
21c0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
21d0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
21e0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
21f0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2200: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
2210: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
2220: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
2230: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2240: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
2250: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
2260: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
2270: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
2280: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
2290: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
22a0: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
22b0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
22c0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
22d0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
22e0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
22f0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
2300: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
2310: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
2320: 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20 29  lse if( aff==0 )
2330: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
2340: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
2350: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
2360: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
2370: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
2380: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
2390: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
23a0: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
23b0: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
23c0: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
23d0: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
23e0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
23f0: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
2400: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
2410: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
2420: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
2430: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
2440: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
2450: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
2460: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
2470: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
2480: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
2490: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
24a0: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
24b0: 69 66 28 20 61 66 66 3c 53 51 4c 49 54 45 5f 41  if( aff<SQLITE_A
24c0: 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 72  FF_TEXT ){.    r
24d0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
24e0: 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  f( aff==SQLITE_A
24f0: 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 72  FF_TEXT ){.    r
2500: 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69 6e 69  eturn idx_affini
2510: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ty==SQLITE_AFF_T
2520: 45 58 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  EXT;.  }.  retur
2530: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
2540: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
2550: 66 66 69 6e 69 74 79 29 3b 0a 7d 0a 0a 2f 2a 0a  ffinity);.}../*.
2560: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 35  ** Return the P5
2570: 20 76 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75   value that shou
2580: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  ld be used for a
2590: 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73   binary comparis
25a0: 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50  on.** opcode (OP
25b0: 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29  _Eq, OP_Ge etc.)
25c0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
25d0: 20 70 45 78 70 72 31 20 61 6e 64 20 70 45 78 70   pExpr1 and pExp
25e0: 72 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  r2..*/.static u8
25f0: 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35   binaryCompareP5
2600: 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45  (Expr *pExpr1, E
2610: 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74  xpr *pExpr2, int
2620: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
2630: 75 38 20 61 66 66 20 3d 20 28 63 68 61 72 29 73  u8 aff = (char)s
2640: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
2650: 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66  ty(pExpr2);.  af
2660: 66 20 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43  f = (u8)sqlite3C
2670: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
2680: 45 78 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75  Expr1, aff) | (u
2690: 38 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20  8)jumpIfNull;.  
26a0: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
26b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
26c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c  inter to the col
26d0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
26e0: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
26f0: 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61  sed by.** a bina
2700: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  ry comparison op
2710: 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67  erator comparing
2720: 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
2730: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
2740: 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73  left hand expres
2750: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
2760: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79  ting sequence ty
2770: 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a  pe, then it is.*
2780: 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73  * used. Otherwis
2790: 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  e the collation 
27a0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
27b0: 20 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72   right hand expr
27c0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65  ession.** is use
27d0: 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c  d, or the defaul
27e0: 74 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65  t (BINARY) if ne
27f0: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
2800: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
2810: 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20  .** type..**.** 
2820: 41 72 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20  Argument pRight 
2830: 28 62 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20  (but not pLeft) 
2840: 6d 61 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f  may be a null po
2850: 69 6e 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63  inter. In this c
2860: 61 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  ase,.** it is no
2870: 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f  t considered..*/
2880: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
2890: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
28a0: 6c 6c 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a  llSeq(.  Parse *
28b0: 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20  pParse, .  Expr 
28c0: 2a 70 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20  *pLeft, .  Expr 
28d0: 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c  *pRight.){.  Col
28e0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61  lSeq *pColl;.  a
28f0: 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
2900: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61    if( pLeft->fla
2910: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
2920: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
2930: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2940: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  q(pParse, pLeft)
2950: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
2960: 69 67 68 74 20 26 26 20 28 70 52 69 67 68 74 2d  ight && (pRight-
2970: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
2980: 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ate)!=0 ){.    p
2990: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
29a0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
29b0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c  , pRight);.  }el
29c0: 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  se{.    pColl = 
29d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
29e0: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
29f0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c  );.    if( !pCol
2a00: 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  l ){.      pColl
2a10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2a20: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52  llSeq(pParse, pR
2a30: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ight);.    }.  }
2a40: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
2a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
2a60: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  te code for a co
2a70: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2a80: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2a90: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20   codeCompare(.  
2aa0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2ab0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
2ac0: 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72   (and code gener
2ad0: 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a  ating) context *
2ae0: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
2af0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66        /* The lef
2b00: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45  t operand */.  E
2b10: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20  xpr *pRight,    
2b20: 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70   /* The right op
2b30: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  erand */.  int o
2b40: 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20  pcode,       /* 
2b50: 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  The comparison o
2b60: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69  pcode */.  int i
2b70: 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20  n1, int in2, /* 
2b80: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
2b90: 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69   operands */.  i
2ba0: 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
2bb0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
2bc0: 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74   true.  */.  int
2bd0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
2be0: 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20  * If true, jump 
2bf0: 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  if either operan
2c00: 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  d is NULL */.){.
2c10: 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20    int p5;.  int 
2c20: 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  addr;.  CollSeq 
2c30: 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c  *p4;..  p4 = sql
2c40: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
2c50: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
2c60: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
2c70: 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f  .  p5 = binaryCo
2c80: 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70  mpareP5(pLeft, p
2c90: 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c  Right, jumpIfNul
2ca0: 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  l);.  addr = sql
2cb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
2cc0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70  Parse->pVdbe, op
2cd0: 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c  code, in2, dest,
2ce0: 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20   in1,.          
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43   (void*)p4, P4_C
2d10: 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74  OLLSEQ);.  sqlit
2d20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 70  e3VdbeChangeP5(p
2d30: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75  Parse->pVdbe, (u
2d40: 38 29 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20  8)p5);.  return 
2d50: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  addr;.}../*.** R
2d60: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 65 78  eturn true if ex
2d70: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
2d80: 73 20 61 20 76 65 63 74 6f 72 2c 20 6f 72 20 66  s a vector, or f
2d90: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
2da0: 2a 2a 0a 2a 2a 20 41 20 76 65 63 74 6f 72 20 69  **.** A vector i
2db0: 73 20 64 65 66 69 6e 65 64 20 61 73 20 61 6e 79  s defined as any
2dc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
2dd0: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 77 6f 20   results in two 
2de0: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 6f 6c 75 6d  or more.** colum
2df0: 6e 73 20 6f 66 20 72 65 73 75 6c 74 2e 20 20 45  ns of result.  E
2e00: 76 65 72 79 20 54 4b 5f 56 45 43 54 4f 52 20 6e  very TK_VECTOR n
2e10: 6f 64 65 20 69 73 20 61 6e 20 76 65 63 74 6f 72  ode is an vector
2e20: 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
2e30: 70 61 72 73 65 72 20 77 69 6c 6c 20 6e 6f 74 20  parser will not 
2e40: 67 65 6e 65 72 61 74 65 20 61 20 54 4b 5f 56 45  generate a TK_VE
2e50: 43 54 4f 52 20 77 69 74 68 20 66 65 77 65 72 20  CTOR with fewer 
2e60: 74 68 61 6e 20 74 77 6f 20 65 6e 74 72 69 65 73  than two entries
2e70: 2e 0a 2a 2a 20 42 75 74 20 61 20 54 4b 5f 53 45  ..** But a TK_SE
2e80: 4c 45 43 54 20 6d 69 67 68 74 20 62 65 20 65 69  LECT might be ei
2e90: 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72  ther a vector or
2ea0: 20 61 20 73 63 61 6c 61 72 2e 20 49 74 20 69 73   a scalar. It is
2eb0: 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e 73 69 64 65   only.** conside
2ec0: 72 65 64 20 61 20 76 65 63 74 6f 72 20 69 66 20  red a vector if 
2ed0: 69 74 20 68 61 73 20 74 77 6f 20 6f 72 20 6d 6f  it has two or mo
2ee0: 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  re result column
2ef0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2f00: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 45 78  3ExprIsVector(Ex
2f10: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 72 65  pr *pExpr){.  re
2f20: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
2f30: 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
2f40: 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  )>1;.}../*.** If
2f50: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2f60: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
2f70: 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f  ly argument is o
2f80: 66 20 74 79 70 65 20 54 4b 5f 56 45 43 54 4f 52  f type TK_VECTOR
2f90: 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20   .** return the 
2fa0: 6e 75 6d 62 65 72 20 6f 66 20 65 78 70 72 65 73  number of expres
2fb0: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 76 65 63  sions in the vec
2fc0: 74 6f 72 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  tor. Or, if the 
2fd0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
2fe0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 72   a sub-select, r
2ff0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
3000: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
3010: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 46  he sub-select. F
3020: 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20  or.** any other 
3030: 74 79 70 65 20 6f 66 20 65 78 70 72 65 73 73 69  type of expressi
3040: 6f 6e 2c 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f  on, return 1..*/
3050: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
3060: 56 65 63 74 6f 72 53 69 7a 65 28 45 78 70 72 20  VectorSize(Expr 
3070: 2a 70 45 78 70 72 29 7b 0a 20 20 75 38 20 6f 70  *pExpr){.  u8 op
3080: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
3090: 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
30a0: 54 45 52 20 29 20 6f 70 20 3d 20 70 45 78 70 72  TER ) op = pExpr
30b0: 2d 3e 6f 70 32 3b 0a 20 20 69 66 28 20 6f 70 3d  ->op2;.  if( op=
30c0: 3d 54 4b 5f 56 45 43 54 4f 52 20 29 7b 0a 20 20  =TK_VECTOR ){.  
30d0: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
30e0: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  x.pList->nExpr;.
30f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
3100: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
3110: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78   return pExpr->x
3120: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
3130: 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65  ->nExpr;.  }else
3140: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
3150: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
3160: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
3170: 20 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e   a subexpression
3180: 20 6f 66 20 70 56 65 63 74 6f 72 20 74 68 61 74   of pVector that
3190: 20 69 73 20 74 68 65 20 69 2d 74 68 0a 2a 2a 20   is the i-th.** 
31a0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65  column of the ve
31b0: 63 74 6f 72 20 28 6e 75 6d 62 65 72 65 64 20 73  ctor (numbered s
31c0: 74 61 72 74 69 6e 67 20 77 69 74 68 20 30 29 2e  tarting with 0).
31d0: 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73    The caller mus
31e0: 74 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74  t.** ensure that
31f0: 20 69 20 69 73 20 77 69 74 68 69 6e 20 72 61 6e   i is within ran
3200: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65  ge..**.** If pVe
3210: 63 74 6f 72 20 69 73 20 72 65 61 6c 6c 79 20 61  ctor is really a
3220: 20 73 63 61 6c 61 72 20 28 61 6e 64 20 22 73 63   scalar (and "sc
3230: 61 6c 61 72 22 20 68 65 72 65 20 69 6e 63 6c 75  alar" here inclu
3240: 64 65 73 20 73 75 62 71 75 65 72 69 65 73 0a 2a  des subqueries.*
3250: 2a 20 74 68 61 74 20 72 65 74 75 72 6e 20 61 20  * that return a 
3260: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 21 29 20  single column!) 
3270: 74 68 65 6e 20 72 65 74 75 72 6e 20 70 56 65 63  then return pVec
3280: 74 6f 72 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a  tor unmodified..
3290: 2a 2a 0a 2a 2a 20 70 56 65 63 74 6f 72 20 72 65  **.** pVector re
32a0: 74 61 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20  tains ownership 
32b0: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
32c0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  subexpression..*
32d0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76 65 63 74  *.** If the vect
32e0: 6f 72 20 69 73 20 61 20 28 53 45 4c 45 43 54 20  or is a (SELECT 
32f0: 2e 2e 2e 29 20 74 68 65 6e 20 74 68 65 20 65 78  ...) then the ex
3300: 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65  pression returne
3310: 64 20 69 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65  d is.** just the
3320: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   expression for 
3330: 74 68 65 20 69 2d 74 68 20 74 65 72 6d 20 6f 66  the i-th term of
3340: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
3350: 20 61 6e 64 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20   and may.** not 
3360: 62 65 20 72 65 61 64 79 20 66 6f 72 20 65 76 61  be ready for eva
3370: 6c 75 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20  luation because 
3380: 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  the table cursor
3390: 20 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20   has not yet.** 
33a0: 62 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 2e  been positioned.
33b0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
33c0: 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
33d0: 78 70 72 28 45 78 70 72 20 2a 70 56 65 63 74 6f  xpr(Expr *pVecto
33e0: 72 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73  r, int i){.  ass
33f0: 65 72 74 28 20 69 3c 73 71 6c 69 74 65 33 45 78  ert( i<sqlite3Ex
3400: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 56 65  prVectorSize(pVe
3410: 63 74 6f 72 29 20 29 3b 0a 20 20 69 66 28 20 73  ctor) );.  if( s
3420: 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
3430: 6f 72 28 70 56 65 63 74 6f 72 29 20 29 7b 0a 20  or(pVector) ){. 
3440: 20 20 20 61 73 73 65 72 74 28 20 70 56 65 63 74     assert( pVect
3450: 6f 72 2d 3e 6f 70 32 3d 3d 30 20 7c 7c 20 70 56  or->op2==0 || pV
3460: 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  ector->op==TK_RE
3470: 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 69 66  GISTER );.    if
3480: 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  ( pVector->op==T
3490: 4b 5f 53 45 4c 45 43 54 20 7c 7c 20 70 56 65 63  K_SELECT || pVec
34a0: 74 6f 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c  tor->op2==TK_SEL
34b0: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ECT ){.      ret
34c0: 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70  urn pVector->x.p
34d0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
34e0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
34f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
3500: 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70  urn pVector->x.p
3510: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
3520: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
3530: 74 75 72 6e 20 70 56 65 63 74 6f 72 3b 0a 7d 0a  turn pVector;.}.
3540: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
3550: 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20  nd return a new 
3560: 45 78 70 72 20 6f 62 6a 65 63 74 20 77 68 69 63  Expr object whic
3570: 68 20 77 68 65 6e 20 70 61 73 73 65 64 20 74 6f  h when passed to
3580: 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43  .** sqlite3ExprC
3590: 6f 64 65 28 29 20 77 69 6c 6c 20 67 65 6e 65 72  ode() will gener
35a0: 61 74 65 20 61 6c 6c 20 6e 65 63 65 73 73 61 72  ate all necessar
35b0: 79 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74  y code to comput
35c0: 65 0a 2a 2a 20 74 68 65 20 69 46 69 65 6c 64 2d  e.** the iField-
35d0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
35e0: 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69   vector expressi
35f0: 6f 6e 20 70 56 65 63 74 6f 72 2e 0a 2a 2a 0a 2a  on pVector..**.*
3600: 2a 20 49 74 20 69 73 20 6f 6b 20 66 6f 72 20 70  * It is ok for p
3610: 56 65 63 74 6f 72 20 74 6f 20 62 65 20 61 20 73  Vector to be a s
3620: 63 61 6c 61 72 20 28 61 73 20 6c 6f 6e 67 20 61  calar (as long a
3630: 73 20 69 46 69 65 6c 64 3d 3d 30 29 2e 20 20 0a  s iField==0).  .
3640: 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  ** In that case,
3650: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   this routine wo
3660: 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 33  rks like sqlite3
3670: 45 78 70 72 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a  ExprDup()..**.**
3680: 20 54 68 65 20 63 61 6c 6c 65 72 20 6f 77 6e 73   The caller owns
3690: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45 78   the returned Ex
36a0: 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 73  pr object and is
36b0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
36c0: 0a 2a 2a 20 65 6e 73 75 72 69 6e 67 20 74 68 61  .** ensuring tha
36d0: 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  t the returned v
36e0: 61 6c 75 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  alue eventually 
36f0: 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  gets freed..**.*
3700: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 72 65 74  * The caller ret
3710: 61 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f  ains ownership o
3720: 66 20 70 56 65 63 74 6f 72 2e 20 20 49 66 20 70  f pVector.  If p
3730: 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53  Vector is a TK_S
3740: 45 4c 45 43 54 2c 0a 2a 2a 20 74 68 65 6e 20 74  ELECT,.** then t
3750: 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65  he returned obje
3760: 63 74 20 77 69 6c 6c 20 72 65 66 65 72 65 6e 63  ct will referenc
3770: 65 20 70 56 65 63 74 6f 72 20 61 6e 64 20 73 6f  e pVector and so
3780: 20 70 56 65 63 74 6f 72 20 6d 75 73 74 20 72 65   pVector must re
3790: 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69 64 20 66 6f  main.** valid fo
37a0: 72 20 74 68 65 20 6c 69 66 65 20 6f 66 20 74 68  r the life of th
37b0: 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63  e returned objec
37c0: 74 2e 20 20 49 66 20 70 56 65 63 74 6f 72 20 69  t.  If pVector i
37d0: 73 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  s a TK_VECTOR.**
37e0: 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70   or a scalar exp
37f0: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 69 74  ression, then it
3800: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 20   can be deleted 
3810: 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 69 73 20  as soon as this 
3820: 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
3830: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 69 63  ns..**.** A tric
3840: 6b 20 74 6f 20 63 61 75 73 65 20 61 20 54 4b 5f  k to cause a TK_
3850: 53 45 4c 45 43 54 20 70 56 65 63 74 6f 72 20 74  SELECT pVector t
3860: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 74 6f 67  o be deleted tog
3870: 65 74 68 65 72 20 77 69 74 68 0a 2a 2a 20 74 68  ether with.** th
3880: 65 20 72 65 74 75 72 6e 65 64 20 45 78 70 72 20  e returned Expr 
3890: 6f 62 6a 65 63 74 20 69 73 20 74 6f 20 61 74 74  object is to att
38a0: 61 63 68 20 74 68 65 20 70 56 65 63 74 6f 72 20  ach the pVector 
38b0: 74 6f 20 74 68 65 20 70 52 69 67 68 74 20 66 69  to the pRight fi
38c0: 65 6c 64 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65  eld.** of the re
38d0: 74 75 72 6e 65 64 20 54 4b 5f 53 45 4c 45 43 54  turned TK_SELECT
38e0: 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6f 62 6a  _COLUMN Expr obj
38f0: 65 63 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ect..*/.Expr *sq
3900: 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63 74  lite3ExprForVect
3910: 6f 72 46 69 65 6c 64 28 0a 20 20 50 61 72 73 65  orField(.  Parse
3920: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3930: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
3940: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56  xt */.  Expr *pV
3950: 65 63 74 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20  ector,       /* 
3960: 54 68 65 20 76 65 63 74 6f 72 2e 20 20 4c 69 73  The vector.  Lis
3970: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
3980: 20 6f 72 20 61 20 73 75 62 2d 53 45 4c 45 43 54   or a sub-SELECT
3990: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64   */.  int iField
39a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
39b0: 69 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ich column of th
39c0: 65 20 76 65 63 74 6f 72 20 74 6f 20 72 65 74 75  e vector to retu
39d0: 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  rn */.){.  Expr 
39e0: 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 56 65  *pRet;.  if( pVe
39f0: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  ctor->op==TK_SEL
3a00: 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ECT ){.    asser
3a10: 74 28 20 70 56 65 63 74 6f 72 2d 3e 66 6c 61 67  t( pVector->flag
3a20: 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
3a30: 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 54   );.    /* The T
3a40: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
3a50: 45 78 70 72 20 6e 6f 64 65 3a 0a 20 20 20 20 2a  Expr node:.    *
3a60: 2a 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 3a 20  *.    ** pLeft: 
3a70: 20 20 20 20 20 20 20 20 20 20 70 56 65 63 74 6f            pVecto
3a80: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 54 4b 5f  r containing TK_
3a90: 53 45 4c 45 43 54 2e 20 20 4e 6f 74 20 64 65 6c  SELECT.  Not del
3aa0: 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 70 52 69  eted..    ** pRi
3ab0: 67 68 74 3a 20 20 20 20 20 20 20 20 20 20 6e 6f  ght:          no
3ac0: 74 20 75 73 65 64 2e 20 20 42 75 74 20 72 65 63  t used.  But rec
3ad0: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 64  ursively deleted
3ae0: 2e 0a 20 20 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e  ..    ** iColumn
3af0: 3a 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  :         Index 
3b00: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  of a column in p
3b10: 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 69 54  Vector.    ** iT
3b20: 61 62 6c 65 3a 20 20 20 20 20 20 20 20 20 20 30  able:          0
3b30: 20 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   or the number o
3b40: 66 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68 65  f columns on the
3b50: 20 4c 48 53 20 6f 66 20 61 6e 20 61 73 73 69 67   LHS of an assig
3b60: 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 70 4c 65  nment.    ** pLe
3b70: 66 74 2d 3e 69 54 61 62 6c 65 3a 20 20 20 46 69  ft->iTable:   Fi
3b80: 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rst in an array 
3b90: 6f 66 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  of register hold
3ba0: 69 6e 67 20 72 65 73 75 6c 74 2c 20 6f 72 20 30  ing result, or 0
3bb0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
3bc0: 20 20 20 20 20 20 20 20 20 69 66 20 74 68 65 20           if the 
3bd0: 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 79 65  result is not ye
3be0: 74 20 63 6f 6d 70 75 74 65 64 2e 0a 20 20 20 20  t computed..    
3bf0: 2a 2a 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  **.    ** sqlite
3c00: 33 45 78 70 72 44 65 6c 65 74 65 28 29 20 73 70  3ExprDelete() sp
3c10: 65 63 69 66 69 63 61 6c 6c 79 20 73 6b 69 70 73  ecifically skips
3c20: 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 64   the recursive d
3c30: 65 6c 65 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20  elete of.    ** 
3c40: 70 4c 65 66 74 20 6f 6e 20 54 4b 5f 53 45 4c 45  pLeft on TK_SELE
3c50: 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e  CT_COLUMN nodes.
3c60: 20 20 42 75 74 20 70 52 69 67 68 74 20 69 73 20    But pRight is 
3c70: 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f 20 70 56 65  followed, so pVe
3c80: 63 74 6f 72 0a 20 20 20 20 2a 2a 20 63 61 6e 20  ctor.    ** can 
3c90: 62 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 70  be attached to p
3ca0: 52 69 67 68 74 20 74 6f 20 63 61 75 73 65 20 74  Right to cause t
3cb0: 68 69 73 20 6e 6f 64 65 20 74 6f 20 74 61 6b 65  his node to take
3cc0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 0a 20 20   ownership of.  
3cd0: 20 20 2a 2a 20 70 56 65 63 74 6f 72 2e 20 20 54    ** pVector.  T
3ce0: 79 70 69 63 61 6c 6c 79 20 74 68 65 72 65 20 77  ypically there w
3cf0: 69 6c 6c 20 62 65 20 6d 75 6c 74 69 70 6c 65 20  ill be multiple 
3d00: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
3d10: 20 6e 6f 64 65 73 0a 20 20 20 20 2a 2a 20 77 69   nodes.    ** wi
3d20: 74 68 20 74 68 65 20 73 61 6d 65 20 70 4c 65 66  th the same pLef
3d30: 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  t pointer to the
3d40: 20 70 56 65 63 74 6f 72 2c 20 62 75 74 20 6f 6e   pVector, but on
3d50: 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 20  ly one of them. 
3d60: 20 20 20 2a 2a 20 77 69 6c 6c 20 6f 77 6e 20 74     ** will own t
3d70: 68 65 20 70 56 65 63 74 6f 72 2e 0a 20 20 20 20  he pVector..    
3d80: 2a 2f 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  */.    pRet = sq
3d90: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
3da0: 65 2c 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  e, TK_SELECT_COL
3db0: 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  UMN, 0, 0);.    
3dc0: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
3dd0: 20 20 70 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20    pRet->iColumn 
3de0: 3d 20 69 46 69 65 6c 64 3b 0a 20 20 20 20 20 20  = iField;.      
3df0: 70 52 65 74 2d 3e 70 4c 65 66 74 20 3d 20 70 56  pRet->pLeft = pV
3e00: 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  ector;.    }.   
3e10: 20 61 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30   assert( pRet==0
3e20: 20 7c 7c 20 70 52 65 74 2d 3e 69 54 61 62 6c 65   || pRet->iTable
3e30: 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==0 );.  }else{.
3e40: 20 20 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d      if( pVector-
3e50: 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29  >op==TK_VECTOR )
3e60: 20 70 56 65 63 74 6f 72 20 3d 20 70 56 65 63 74   pVector = pVect
3e70: 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  or->x.pList->a[i
3e80: 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20  Field].pExpr;.  
3e90: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
3ea0: 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
3eb0: 64 62 2c 20 70 56 65 63 74 6f 72 2c 20 30 29 3b  db, pVector, 0);
3ec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61  .    sqlite3Rena
3ed0: 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61  meTokenRemap(pPa
3ee0: 72 73 65 2c 20 70 52 65 74 2c 20 70 56 65 63 74  rse, pRet, pVect
3ef0: 6f 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  or);.  }.  retur
3f00: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
3f10: 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   If expression p
3f20: 45 78 70 72 20 69 73 20 6f 66 20 74 79 70 65 20  Expr is of type 
3f30: 54 4b 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65 72  TK_SELECT, gener
3f40: 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
3f50: 75 61 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74 75  uate.** it. Retu
3f60: 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
3f70: 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 73  in which the res
3f80: 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 28 6f  ult is stored (o
3f90: 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75  r, if the .** su
3fa0: 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
3fb0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
3fc0: 6f 6c 75 6d 6e 2c 20 74 68 65 20 66 69 72 73 74  olumn, the first
3fd0: 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20   in an array.** 
3fe0: 6f 66 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  of registers in 
3ff0: 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c 74  which the result
4000: 20 69 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a   is stored)..**.
4010: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 6e  ** If pExpr is n
4020: 6f 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65  ot a TK_SELECT e
4030: 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72  xpression, retur
4040: 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
4050: 6e 74 20 65 78 70 72 43 6f 64 65 53 75 62 73 65  nt exprCodeSubse
4060: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
4070: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
4080: 7b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 30 3b  {.  int reg = 0;
4090: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
40a0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
40b0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
40c0: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
40d0: 72 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  reg = sqlite3Cod
40e0: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
40f0: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 23  e, pExpr);.  }.#
4100: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
4110: 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  eg;.}../*.** Arg
4120: 75 6d 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f  ument pVector po
4130: 69 6e 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72  ints to a vector
4140: 20 65 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69   expression - ei
4150: 74 68 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52  ther a TK_VECTOR
4160: 0a 2a 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54  .** or TK_SELECT
4170: 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f   that returns mo
4180: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75  re than one colu
4190: 6d 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  mn. This functio
41a0: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  n returns.** the
41b0: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
41c0: 20 6f 66 20 61 20 72 65 67 69 73 74 65 72 20 74   of a register t
41d0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
41e0: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65   value of.** ele
41f0: 6d 65 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74  ment iField of t
4200: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  he vector..**.**
4210: 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61   If pVector is a
4220: 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65   TK_SELECT expre
4230: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65  ssion, then code
4240: 20 66 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76   for it must hav
4250: 65 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65  e .** already be
4260: 65 6e 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  en generated usi
4270: 6e 67 20 74 68 65 20 65 78 70 72 43 6f 64 65 53  ng the exprCodeS
4280: 75 62 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69  ubselect() routi
4290: 6e 65 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63  ne. In this.** c
42a0: 61 73 65 20 70 61 72 61 6d 65 74 65 72 20 72 65  ase parameter re
42b0: 67 53 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62  gSelect should b
42c0: 65 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  e the first in a
42d0: 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
42e0: 74 65 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ters.** containi
42f0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
4300: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
4310: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63  . .**.** If pVec
4320: 74 6f 72 20 69 73 20 6f 66 20 74 79 70 65 20 54  tor is of type T
4330: 4b 5f 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63  K_VECTOR, then c
4340: 6f 64 65 20 66 6f 72 20 74 68 65 20 72 65 71 75  ode for the requ
4350: 65 73 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69  ested field.** i
4360: 73 20 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20  s generated. In 
4370: 74 68 69 73 20 63 61 73 65 20 28 2a 70 52 65 67  this case (*pReg
4380: 46 72 65 65 29 20 6d 61 79 20 62 65 20 73 65 74  Free) may be set
4390: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
43a0: 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  f.** a temporary
43b0: 20 72 65 67 69 73 74 65 72 20 74 6f 20 62 65 20   register to be 
43c0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
43d0: 6c 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72  ler before retur
43e0: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  ning..**.** Befo
43f0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75  re returning, ou
4400: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 28  tput parameter (
4410: 2a 70 70 45 78 70 72 29 20 69 73 20 73 65 74 20  *ppExpr) is set 
4420: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a  to point to the.
4430: 2a 2a 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63  ** Expr object c
4440: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
4450: 65 6c 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66  element iElem of
4460: 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a   the vector..*/.
4470: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 56  static int exprV
4480: 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20  ectorRegister(. 
4490: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44b0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
44c0: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65  t */.  Expr *pVe
44d0: 63 74 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  ctor,           
44e0: 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72         /* Vector
44f0: 20 74 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d   to extract elem
4500: 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ent from */.  in
4510: 74 20 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20  t iField,       
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4530: 20 46 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63   Field to extrac
4540: 74 20 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a  t from pVector *
4550: 2f 0a 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63  /.  int regSelec
4560: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
4570: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20      /* First in 
4580: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
4590: 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70  rs */.  Expr **p
45a0: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
45b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
45c0: 45 78 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65  Expression eleme
45d0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nt */.  int *pRe
45e0: 67 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20  gFree           
45f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
4600: 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f  Temp register to
4610: 20 66 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38   free */.){.  u8
4620: 20 6f 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f   op = pVector->o
4630: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  p;.  assert( op=
4640: 3d 54 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70  =TK_VECTOR || op
4650: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c  ==TK_REGISTER ||
4660: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
4670: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
4680: 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a  EGISTER ){.    *
4690: 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ppExpr = sqlite3
46a0: 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
46b0: 70 72 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65  pr(pVector, iFie
46c0: 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ld);.    return 
46d0: 70 56 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b  pVector->iTable+
46e0: 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66  iField;.  }.  if
46f0: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
4700: 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d  ){.    *ppExpr =
4710: 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c   pVector->x.pSel
4720: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  ect->pEList->a[i
4730: 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20  Field].pExpr;.  
4740: 20 20 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c     return regSel
4750: 65 63 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a  ect+iField;.  }.
4760: 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63    *ppExpr = pVec
4770: 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  tor->x.pList->a[
4780: 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20  iField].pExpr;. 
4790: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
47a0: 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
47b0: 73 65 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65  se, *ppExpr, pRe
47c0: 67 46 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gFree);.}../*.**
47d0: 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   Expression pExp
47e0: 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f  r is a compariso
47f0: 6e 20 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65  n between two ve
4800: 63 74 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d  ctor values. Com
4810: 70 75 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75  pute.** the resu
4820: 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  lt of the compar
4830: 69 73 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e  ison (1, 0, or N
4840: 55 4c 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74  ULL) and write t
4850: 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  hat.** result in
4860: 74 6f 20 72 65 67 69 73 74 65 72 20 64 65 73 74  to register dest
4870: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
4880: 65 72 20 6d 75 73 74 20 73 61 74 69 73 66 79 20  er must satisfy 
4890: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  the following pr
48a0: 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a  econditions:.**.
48b0: 2a 2a 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e  **    if pExpr->
48c0: 6f 70 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20  op==TK_IS:      
48d0: 6f 70 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35  op==TK_EQ and p5
48e0: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a  ==SQLITE_NULLEQ.
48f0: 2a 2a 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e  **    if pExpr->
4900: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20  op==TK_ISNOT:   
4910: 6f 70 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35  op==TK_NE and p5
4920: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a  ==SQLITE_NULLEQ.
4930: 2a 2a 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a  **    otherwise:
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4950: 6f 70 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e  op==pExpr->op an
4960: 64 20 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69  d p5==0.*/.stati
4970: 63 20 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f  c void codeVecto
4980: 72 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  rCompare(.  Pars
4990: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
49a0: 20 20 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61    /* Code genera
49b0: 74 6f 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  tor context */. 
49c0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
49d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
49e0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
49f0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
4a00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4a10: 20 57 72 69 74 65 20 72 65 73 75 6c 74 73 20 69   Write results i
4a20: 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65  nto this registe
4a30: 72 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20  r */.  u8 op,   
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4a50: 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  Comparison opera
4a60: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20  tor */.  u8 p5  
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4a80: 2a 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20  * SQLITE_NULLEQ 
4a90: 6f 72 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20  or zero */.){.  
4aa0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
4ab0: 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20  ->pVdbe;.  Expr 
4ac0: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
4ad0: 70 4c 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70  pLeft;.  Expr *p
4ae0: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
4af0: 52 69 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65  Right;.  int nLe
4b00: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
4b10: 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
4b20: 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  );.  int i;.  in
4b30: 74 20 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20  t regLeft = 0;. 
4b40: 20 69 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20   int regRight = 
4b50: 30 3b 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70  0;.  u8 opx = op
4b60: 3b 0a 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65  ;.  int addrDone
4b70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
4b80: 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
4b90: 0a 0a 20 20 69 66 28 20 6e 4c 65 66 74 21 3d 73  ..  if( nLeft!=s
4ba0: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
4bb0: 53 69 7a 65 28 70 52 69 67 68 74 29 20 29 7b 0a  Size(pRight) ){.
4bc0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4bd0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77  Msg(pParse, "row
4be0: 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29   value misused")
4bf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
4c00: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  }.  assert( pExp
4c10: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20  r->op==TK_EQ || 
4c20: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
4c30: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70   .       || pExp
4c40: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20  r->op==TK_IS || 
4c50: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4c60: 4e 4f 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  NOT .       || p
4c70: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
4c80: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4c90: 5f 47 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  _GT .       || p
4ca0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
4cb0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4cc0: 5f 47 45 20 0a 20 20 29 3b 0a 20 20 61 73 73 65  _GE .  );.  asse
4cd0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f  rt( pExpr->op==o
4ce0: 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d  p || (pExpr->op=
4cf0: 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d 3d 54 4b  =TK_IS && op==TK
4d00: 5f 45 51 29 0a 20 20 20 20 20 20 20 20 20 20 20  _EQ).           
4d10: 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d   || (pExpr->op==
4d20: 54 4b 5f 49 53 4e 4f 54 20 26 26 20 6f 70 3d 3d  TK_ISNOT && op==
4d30: 54 4b 5f 4e 45 29 20 29 3b 0a 20 20 61 73 73 65  TK_NE) );.  asse
4d40: 72 74 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78  rt( p5==0 || pEx
4d50: 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20  pr->op!=op );.  
4d60: 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51 4c 49  assert( p5==SQLI
4d70: 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78  TE_NULLEQ || pEx
4d80: 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20  pr->op==op );.. 
4d90: 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 53 54   p5 |= SQLITE_ST
4da0: 4f 52 45 50 32 3b 0a 20 20 69 66 28 20 6f 70 78  OREP2;.  if( opx
4db0: 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70 78 20 3d 20  ==TK_LE ) opx = 
4dc0: 54 4b 5f 4c 54 3b 0a 20 20 69 66 28 20 6f 70 78  TK_LT;.  if( opx
4dd0: 3d 3d 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20  ==TK_GE ) opx = 
4de0: 54 4b 5f 47 54 3b 0a 0a 20 20 72 65 67 4c 65 66  TK_GT;..  regLef
4df0: 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73  t = exprCodeSubs
4e00: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c  elect(pParse, pL
4e10: 65 66 74 29 3b 0a 20 20 72 65 67 52 69 67 68 74  eft);.  regRight
4e20: 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73 65   = exprCodeSubse
4e30: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 52 69  lect(pParse, pRi
4e40: 67 68 74 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  ght);..  for(i=0
4e50: 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65 78 69 74 73  ; 1 /*Loop exits
4e60: 20 62 79 20 22 62 72 65 61 6b 22 2a 2f 3b 20 69   by "break"*/; i
4e70: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  ++){.    int reg
4e80: 46 72 65 65 31 20 3d 20 30 2c 20 72 65 67 46 72  Free1 = 0, regFr
4e90: 65 65 32 20 3d 20 30 3b 0a 20 20 20 20 45 78 70  ee2 = 0;.    Exp
4ea0: 72 20 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20  r *pL, *pR; .   
4eb0: 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20   int r1, r2;.   
4ec0: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
4ed0: 20 69 3c 6e 4c 65 66 74 20 29 3b 0a 20 20 20 20   i<nLeft );.    
4ee0: 72 31 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52  r1 = exprVectorR
4ef0: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
4f00: 70 4c 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66  pLeft, i, regLef
4f10: 74 2c 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65  t, &pL, &regFree
4f20: 31 29 3b 0a 20 20 20 20 72 32 20 3d 20 65 78 70  1);.    r2 = exp
4f30: 72 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28  rVectorRegister(
4f40: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
4f50: 69 2c 20 72 65 67 52 69 67 68 74 2c 20 26 70 52  i, regRight, &pR
4f60: 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
4f70: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
4f80: 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f 70  arse, pL, pR, op
4f90: 78 2c 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c  x, r1, r2, dest,
4fa0: 20 70 35 29 3b 0a 20 20 20 20 74 65 73 74 63 61   p5);.    testca
4fb0: 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
4fc0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4fd0: 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
4fe0: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4ff0: 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
5000: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
5010: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
5020: 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
5030: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
5040: 4f 50 5f 47 74 29 3b 0a 20 20 20 20 74 65 73 74  OP_Gt);.    test
5050: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
5060: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
5070: 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
5080: 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f    testcase(op==O
5090: 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Eq); VdbeCover
50a0: 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45  ageIf(v,op==OP_E
50b0: 71 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  q);.    testcase
50c0: 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
50d0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
50e0: 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71  ==OP_Ne);.    sq
50f0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5100: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
5110: 72 65 65 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ree1);.    sqlit
5120: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
5130: 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
5140: 32 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  2);.    if( i==n
5150: 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20  Left-1 ){.      
5160: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5170: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20   if( opx==TK_EQ 
5180: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5190: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
51a0: 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64  _IfNot, dest, ad
51b0: 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76  drDone); VdbeCov
51c0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
51d0: 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45  p5 |= SQLITE_KEE
51e0: 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  PNULL;.    }else
51f0: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20   if( opx==TK_NE 
5200: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5210: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5220: 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44  _If, dest, addrD
5230: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
5240: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20  ge(v);.      p5 
5250: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
5260: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
5270: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d       assert( op=
5280: 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b  =TK_LT || op==TK
5290: 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45  _GT || op==TK_LE
52a0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b   || op==TK_GE );
52b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
52c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45  beAddOp2(v, OP_E
52d0: 6c 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64  lseNotEq, 0, add
52e0: 72 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  rDone);.      Vd
52f0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
5300: 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20  op==TK_LT);.    
5310: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
5320: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a  (v, op==TK_GT);.
5330: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
5340: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
5350: 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  E);.      VdbeCo
5360: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
5370: 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66  TK_GE);.      if
5380: 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f  ( i==nLeft-2 ) o
5390: 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20  px = op;.    }. 
53a0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
53b0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
53c0: 61 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69  addrDone);.}..#i
53d0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
53e0: 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20  R_DEPTH>0./*.** 
53f0: 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d  Check that argum
5400: 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c  ent nHeight is l
5410: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
5420: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
5430: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
5440: 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66  epth allowed. If
5450: 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76   it is not, leav
5460: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
5470: 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e  ge in.** pParse.
5480: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
5490: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50  xprCheckHeight(P
54a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
54b0: 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e  t nHeight){.  in
54c0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
54d0: 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74  ;.  int mxHeight
54e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
54f0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5500: 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a  IT_EXPR_DEPTH];.
5510: 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78    if( nHeight>mx
5520: 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  Height ){.    sq
5530: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5540: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45  arse, .       "E
5550: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69  xpression tree i
5560: 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78  s too large (max
5570: 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c  imum depth %d)",
5580: 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b   mxHeight.    );
5590: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
55a0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
55b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
55c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
55d0: 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65  ee functions, he
55e0: 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65  ightOfExpr(), he
55f0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29  ightOfExprList()
5600: 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66  .** and heightOf
5610: 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73  Select(), are us
5620: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
5630: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5640: 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70  ht.** of any exp
5650: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5660: 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73  erenced by the s
5670: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
5680: 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  as the.** first 
5690: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
56a0: 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20  If this maximum 
56b0: 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65  height is greate
56c0: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
56d0: 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64  nt value pointed
56e0: 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67  .** to by pnHeig
56f0: 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70  ht, the second p
5700: 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73  arameter, then s
5710: 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20  et *pnHeight to 
5720: 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  that.** value..*
5730: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
5740: 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20  ightOfExpr(Expr 
5750: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
5760: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
5770: 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68     if( p->nHeigh
5780: 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20  t>*pnHeight ){. 
5790: 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d       *pnHeight =
57a0: 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20   p->nHeight;.   
57b0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
57c0: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
57d0: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
57e0: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
57f0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5800: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
5810: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
5820: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65  ; i++){.      he
5830: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b  ightOfExpr(p->a[
5840: 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67  i].pExpr, pnHeig
5850: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ht);.    }.  }.}
5860: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5870: 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65  ghtOfSelect(Sele
5880: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74  ct *pSelect, int
5890: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53   *pnHeight){.  S
58a0: 65 6c 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28  elect *p;.  for(
58b0: 70 3d 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d  p=pSelect; p; p=
58c0: 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
58d0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
58e0: 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74  pWhere, pnHeight
58f0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
5900: 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
5910: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
5920: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5930: 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29  Limit, pnHeight)
5940: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5950: 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
5960: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5970: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5980: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70  t(p->pGroupBy, p
5990: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
59a0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
59b0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65  ->pOrderBy, pnHe
59c0: 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
59d0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
59e0: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
59f0: 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  e in the structu
5a00: 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  re passed as an 
5a10: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e  .** argument. An
5a20: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
5a30: 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78   no children, Ex
5a40: 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20  pr.pList or .** 
5a50: 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d  Expr.pSelect mem
5a60: 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74  ber has a height
5a70: 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72   of 1. Any other
5a80: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68   expression.** h
5a90: 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61  as a height equa
5aa0: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
5ab0: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f   height of any o
5ac0: 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ther .** referen
5ad0: 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e  ced Expr plus on
5ae0: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72  e..**.** Also pr
5af0: 6f 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61  opagate EP_Propa
5b00: 67 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72  gate flags up fr
5b10: 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  om Expr.x.pList 
5b20: 74 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a  to Expr.flags,.*
5b30: 2a 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65  * if appropriate
5b40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5b50: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45   exprSetHeight(E
5b60: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  xpr *p){.  int n
5b70: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
5b80: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5b90: 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  eft, &nHeight);.
5ba0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5bb0: 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67  ->pRight, &nHeig
5bc0: 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ht);.  if( ExprH
5bd0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5be0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
5bf0: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
5c00: 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  t(p->x.pSelect, 
5c10: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c  &nHeight);.  }el
5c20: 73 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73  se if( p->x.pLis
5c30: 74 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f  t ){.    heightO
5c40: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70  fExprList(p->x.p
5c50: 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  List, &nHeight);
5c60: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d  .    p->flags |=
5c70: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
5c80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
5c90: 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29  lags(p->x.pList)
5ca0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67  ;.  }.  p->nHeig
5cb0: 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31  ht = nHeight + 1
5cc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
5cd0: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
5ce0: 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74  variable using t
5cf0: 68 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74  he exprSetHeight
5d00: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a  () function. If.
5d10: 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73  ** the height is
5d20: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
5d30: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
5d40: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  d expression dep
5d50: 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  th,.** leave an 
5d60: 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
5d70: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
5d80: 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f  agate all EP_Pro
5d90: 70 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f  pagate flags fro
5da0: 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69  m the Expr.x.pLi
5db0: 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e  st into.** Expr.
5dc0: 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20  flags. .*/.void 
5dd0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
5de0: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72  ightAndFlags(Par
5df0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
5e00: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72   *p){.  if( pPar
5e10: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
5e20: 6e 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67  n;.  exprSetHeig
5e30: 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ht(p);.  sqlite3
5e40: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
5e50: 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67  pParse, p->nHeig
5e60: 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ht);.}../*.** Re
5e70: 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
5e80: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65   height of any e
5e90: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72  xpression tree r
5ea0: 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20  eferenced.** by 
5eb0: 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  the select state
5ec0: 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61  ment passed as a
5ed0: 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  n argument..*/.i
5ee0: 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
5ef0: 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63  ExprHeight(Selec
5f00: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  t *p){.  int nHe
5f10: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
5f20: 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e  htOfSelect(p, &n
5f30: 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72  Height);.  retur
5f40: 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c  n nHeight;.}.#el
5f50: 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65  se /* ABOVE:  He
5f60: 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74  ight enforcement
5f70: 20 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57   enabled.  BELOW
5f80: 3a 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65  : Height enforce
5f90: 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a  ment off */./*.*
5fa0: 2a 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20  * Propagate all 
5fb0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
5fc0: 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  gs from the Expr
5fd0: 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a  .x.pList into.**
5fe0: 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f   Expr.flags. .*/
5ff0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
6000: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
6010: 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  gs(Parse *pParse
6020: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
6030: 28 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73  ( p && p->x.pLis
6040: 74 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  t && !ExprHasPro
6050: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
6060: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d  elect) ){.    p-
6070: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f  >flags |= EP_Pro
6080: 70 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33  pagate & sqlite3
6090: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d  ExprListFlags(p-
60a0: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  >x.pList);.  }.}
60b0: 0a 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74  .#define exprSet
60c0: 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66  Height(y).#endif
60d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45   /* SQLITE_MAX_E
60e0: 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a  XPR_DEPTH>0 */..
60f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6100: 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61  ne is the core a
6110: 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70  llocator for Exp
6120: 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43  r nodes..**.** C
6130: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
6140: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61  xpression node a
6150: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
6160: 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f  ter to it.  Memo
6170: 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e  ry.** for this n
6180: 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20  ode and for the 
6190: 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20  pToken argument 
61a0: 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  is a single allo
61b0: 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e  cation.** obtain
61c0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
61d0: 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20  bMalloc().  The 
61e0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
61f0: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
6200: 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
6210: 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e  re the node even
6220: 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65  tually gets free
6230: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75  d..**.** If dequ
6240: 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ote is true, the
6250: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20  n the token (if 
6260: 69 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65  it exists) is de
6270: 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65  quoted..** If de
6280: 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20  quote is false, 
6290: 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20  no dequoting is 
62a0: 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20  performed.  The 
62b0: 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d  deQuote.** param
62c0: 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20  eter is ignored 
62d0: 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  if pToken is NUL
62e0: 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65  L or if the toke
62f0: 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70  n does not.** ap
6300: 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65  pear to be quote
6310: 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65  d.  If the quote
6320: 73 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f  s were of the fo
6330: 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65  rm "..." (double
6340: 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e  -quotes).** then
6350: 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65   the EP_DblQuote
6360: 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e  d flag is set on
6370: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6380: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63  node..**.** Spec
6390: 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70  ial case:  If op
63a0: 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64  ==TK_INTEGER and
63b0: 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74   pToken points t
63c0: 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a  o a string that.
63d0: 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c  ** can be transl
63e0: 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62  ated into a 32-b
63f0: 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  it integer, then
6400: 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f   the token is no
6410: 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75  t.** stored in u
6420: 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61  .zToken.  Instea
6430: 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  d, the integer v
6440: 61 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e  alues is written
6450: 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75  .** into u.iValu
6460: 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74  e and the EP_Int
6470: 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65  Value flag is se
6480: 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f  t.  No extra sto
6490: 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63  rage.** is alloc
64a0: 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
64b0: 20 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e   integer text an
64c0: 64 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c  d the dequote fl
64d0: 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ag is ignored..*
64e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
64f0: 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69  xprAlloc(.  sqli
6500: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
6510: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
6520: 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  r sqlite3DbMallo
6530: 63 52 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e  cRawNN() */.  in
6540: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
6550: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6560: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6570: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
6580: 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  ken,    /* Token
6590: 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68   argument.  Migh
65a0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  t be NULL */.  i
65b0: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
65c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
65d0: 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a  o dequote */.){.
65e0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
65f0: 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  int nExtra = 0;.
6600: 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30    int iValue = 0
6610: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
6620: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b  =0 );.  if( pTok
6630: 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70  en ){.    if( op
6640: 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20  !=TK_INTEGER || 
6650: 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20  pToken->z==0.   
6660: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
6670: 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e  3GetInt32(pToken
6680: 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30  ->z, &iValue)==0
6690: 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   ){.      nExtra
66a0: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a   = pToken->n+1;.
66b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 56        assert( iV
66c0: 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d  alue>=0 );.    }
66d0: 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71  .  }.  pNew = sq
66e0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
66f0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  NN(db, sizeof(Ex
6700: 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69  pr)+nExtra);.  i
6710: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d  f( pNew ){.    m
6720: 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
6730: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
6740: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38    pNew->op = (u8
6750: 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  )op;.    pNew->i
6760: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66  Agg = -1;.    if
6770: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
6780: 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20    if( nExtra==0 
6790: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
67a0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
67b0: 56 61 6c 75 65 7c 45 50 5f 4c 65 61 66 7c 28 69  Value|EP_Leaf|(i
67c0: 56 61 6c 75 65 3f 45 50 5f 49 73 54 72 75 65 3a  Value?EP_IsTrue:
67d0: 45 50 5f 49 73 46 61 6c 73 65 29 3b 0a 20 20 20  EP_IsFalse);.   
67e0: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61       pNew->u.iVa
67f0: 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20  lue = iValue;.  
6800: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6810: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
6820: 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  n = (char*)&pNew
6830: 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  [1];.        ass
6840: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d  ert( pToken->z!=
6850: 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d  0 || pToken->n==
6860: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
6870: 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d   pToken->n ) mem
6880: 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  cpy(pNew->u.zTok
6890: 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  en, pToken->z, p
68a0: 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20  Token->n);.     
68b0: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
68c0: 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30  n[pToken->n] = 0
68d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
68e0: 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33  quote && sqlite3
68f0: 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e  Isquote(pNew->u.
6900: 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20  zToken[0]) ){.  
6910: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
6920: 65 71 75 6f 74 65 45 78 70 72 28 70 4e 65 77 29  equoteExpr(pNew)
6930: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6940: 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53 51    }.    }.#if SQ
6950: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
6960: 50 54 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e  PTH>0.    pNew->
6970: 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e  nHeight = 1;.#en
6980: 64 69 66 20 20 0a 20 20 7d 0a 20 20 72 65 74 75  dif  .  }.  retu
6990: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
69a0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
69b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
69c0: 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72   from a zero-ter
69d0: 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74 68  minated token th
69e0: 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64  at has.** alread
69f0: 79 20 62 65 65 6e 20 64 65 71 75 6f 74 65 64 2e  y been dequoted.
6a00: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
6a10: 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  3Expr(.  sqlite3
6a20: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
6a30: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73   /* Handle for s
6a40: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
6a50: 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c  ro() (may be nul
6a60: 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  l) */.  int op, 
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a80: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70  /* Expression op
6a90: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
6aa0: 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20  char *zToken    
6ab0: 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d    /* Token argum
6ac0: 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e  ent.  Might be N
6ad0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65  ULL */.){.  Toke
6ae0: 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f  n x;.  x.z = zTo
6af0: 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 73 71 6c  ken;.  x.n = sql
6b00: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f  ite3Strlen30(zTo
6b10: 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  ken);.  return s
6b20: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
6b30: 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a  db, op, &x, 0);.
6b40: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20  }../*.** Attach 
6b50: 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61  subtrees pLeft a
6b60: 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65  nd pRight to the
6b70: 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74   Expr node pRoot
6b80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74  ..**.** If pRoot
6b90: 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
6ba0: 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20  s that a memory 
6bb0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
6bc0: 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a   has occurred..*
6bd0: 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  * In that case, 
6be0: 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72  delete the subtr
6bf0: 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ees pLeft and pR
6c00: 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ight..*/.void sq
6c10: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
6c20: 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74  ubtrees(.  sqlit
6c30: 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a  e3 *db,.  Expr *
6c40: 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70  pRoot,.  Expr *p
6c50: 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52  Left,.  Expr *pR
6c60: 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52  ight.){.  if( pR
6c70: 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  oot==0 ){.    as
6c80: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
6c90: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
6ca0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6cb0: 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  db, pLeft);.    
6cc0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6cd0: 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  e(db, pRight);. 
6ce0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
6cf0: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
6d00: 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20  pRoot->pRight = 
6d10: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52  pRight;.      pR
6d20: 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  oot->flags |= EP
6d30: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 52 69  _Propagate & pRi
6d40: 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  ght->flags;.    
6d50: 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20  }.    if( pLeft 
6d60: 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  ){.      pRoot->
6d70: 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20  pLeft = pLeft;. 
6d80: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67       pRoot->flag
6d90: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
6da0: 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  e & pLeft->flags
6db0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72  ;.    }.    expr
6dc0: 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29  SetHeight(pRoot)
6dd0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
6de0: 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20  llocate an Expr 
6df0: 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73  node which joins
6e00: 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20   as many as two 
6e10: 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20  subtrees..**.** 
6e20: 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  One or both of t
6e30: 68 65 20 73 75 62 74 72 65 65 73 20 63 61 6e 20  he subtrees can 
6e40: 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e  be NULL.  Return
6e50: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
6e60: 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f  e new.** Expr no
6e70: 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f  de.  Or, if an O
6e80: 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
6e90: 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d   set pParse->db-
6ea0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a  >mallocFailed,.*
6eb0: 2a 20 66 72 65 65 20 74 68 65 20 73 75 62 74 72  * free the subtr
6ec0: 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ees and return N
6ed0: 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ULL..*/.Expr *sq
6ee0: 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61  lite3PExpr(.  Pa
6ef0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
6f00: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
6f10: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
6f20: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
6f30: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6f40: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6f50: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
6f60: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20          /* Left 
6f70: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
6f80: 72 20 2a 70 52 69 67 68 74 20 20 20 20 20 20 20  r *pRight       
6f90: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70       /* Right op
6fa0: 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78  erand */.){.  Ex
6fb0: 70 72 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  pr *p;.  p = sql
6fc0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
6fd0: 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  N(pParse->db, si
6fe0: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 69  zeof(Expr));.  i
6ff0: 66 28 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73  f( p ){.    mems
7000: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
7010: 45 78 70 72 29 29 3b 0a 20 20 20 20 70 2d 3e 6f  Expr));.    p->o
7020: 70 20 3d 20 6f 70 20 26 20 30 78 66 66 3b 0a 20  p = op & 0xff;. 
7030: 20 20 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b     p->iAgg = -1;
7040: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7050: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70  AttachSubtrees(p
7060: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c  Parse->db, p, pL
7070: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
7080: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
7090: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
70a0: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20   p->nHeight);.  
70b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
70c0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
70d0: 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74 29 3b  rse->db, pLeft);
70e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
70f0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
7100: 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  b, pRight);.  }.
7110: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
7120: 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74  *.** Add pSelect
7130: 20 74 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70   to the Expr.x.p
7140: 53 65 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f  Select field.  O
7150: 72 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 4e  r, if pExpr is N
7160: 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61  ULL (due.** do a
7170: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
7180: 6f 6e 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e  on failure) then
7190: 20 64 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c   delete the pSel
71a0: 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76  ect object..*/.v
71b0: 6f 69 64 20 73 71 6c 69 74 65 33 50 45 78 70 72  oid sqlite3PExpr
71c0: 41 64 64 53 65 6c 65 63 74 28 50 61 72 73 65 20  AddSelect(Parse 
71d0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
71e0: 45 78 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  Expr, Select *pS
71f0: 65 6c 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45  elect){.  if( pE
7200: 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72  xpr ){.    pExpr
7210: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53  ->x.pSelect = pS
7220: 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53  elect;.    ExprS
7230: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
7240: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45  , EP_xIsSelect|E
7250: 50 5f 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20  P_Subquery);.   
7260: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
7270: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50  eightAndFlags(pP
7280: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
7290: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
72a0: 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
72b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
72c0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
72d0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
72e0: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  b, pSelect);.  }
72f0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  .}.../*.** Join 
7300: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
7310: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
7320: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
7330: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
7340: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
7350: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
7360: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
7370: 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64  **.** If one sid
7380: 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
7390: 66 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f  f the AND is kno
73a0: 77 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20  wn to be false, 
73b0: 74 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20  then instead.** 
73c0: 6f 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  of returning an 
73d0: 41 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  AND expression, 
73e0: 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f  just return a co
73f0: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
7400: 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75  n with.** a valu
7410: 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45  e of false..*/.E
7420: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
7430: 41 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  And(Parse *pPars
7440: 65 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  e, Expr *pLeft, 
7450: 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20  Expr *pRight){. 
7460: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7470: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
7480: 20 70 4c 65 66 74 3d 3d 30 20 20 29 7b 0a 20 20   pLeft==0  ){.  
7490: 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b    return pRight;
74a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
74b0: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ght==0 ){.    re
74c0: 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65  turn pLeft;.  }e
74d0: 6c 73 65 20 69 66 28 20 45 78 70 72 41 6c 77 61  lse if( ExprAlwa
74e0: 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c  ysFalse(pLeft) |
74f0: 7c 20 45 78 70 72 41 6c 77 61 79 73 46 61 6c 73  | ExprAlwaysFals
7500: 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  e(pRight) ){.   
7510: 20 73 71 6c 69 74 65 33 45 78 70 72 55 6e 6d 61   sqlite3ExprUnma
7520: 70 41 6e 64 44 65 6c 65 74 65 28 70 50 61 72 73  pAndDelete(pPars
7530: 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  e, pLeft);.    s
7540: 71 6c 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41  qlite3ExprUnmapA
7550: 6e 64 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c  ndDelete(pParse,
7560: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
7570: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
7580: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
7590: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
75a0: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
75b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
75c0: 75 72 6e 20 73 71 6c 69 74 65 33 50 45 78 70 72  urn sqlite3PExpr
75d0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c  (pParse, TK_AND,
75e0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
75f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
7600: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
7610: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f  pression node fo
7620: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  r a function wit
7630: 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72  h multiple.** ar
7640: 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72  guments..*/.Expr
7650: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e   *sqlite3ExprFun
7660: 63 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a  ction(.  Parse *
7670: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
7680: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
7690: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
76a0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pList,      /* 
76b0: 41 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f  Argument list */
76c0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  .  Token *pToken
76d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
76e0: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
76f0: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 69 73 74 69   */.  int eDisti
7700: 6e 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53  nct         /* S
7710: 46 5f 44 69 73 74 69 6e 63 74 20 6f 72 20 53 46  F_Distinct or SF
7720: 5f 41 4c 4c 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a  _ALL or 0 */.){.
7730: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
7740: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7750: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
7760: 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20  rt( pToken );.  
7770: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
7780: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46  prAlloc(db, TK_F
7790: 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c  UNCTION, pToken,
77a0: 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d   1);.  if( pNew=
77b0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
77c0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
77d0: 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41  db, pList); /* A
77e0: 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  void memory leak
77f0: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
7800: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
7810: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   0;.  }.  if( pL
7820: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 45  ist && pList->nE
7830: 78 70 72 20 3e 20 70 50 61 72 73 65 2d 3e 64 62  xpr > pParse->db
7840: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
7850: 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
7860: 52 47 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  RG] ){.    sqlit
7870: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7880: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67  e, "too many arg
7890: 75 6d 65 6e 74 73 20 6f 6e 20 66 75 6e 63 74 69  uments on functi
78a0: 6f 6e 20 25 54 22 2c 20 70 54 6f 6b 65 6e 29 3b  on %T", pToken);
78b0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70  .  }.  pNew->x.p
78c0: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
78d0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
78e0: 70 4e 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63  pNew, EP_HasFunc
78f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  );.  assert( !Ex
7900: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
7910: 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  ew, EP_xIsSelect
7920: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ) );.  sqlite3Ex
7930: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
7940: 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ags(pParse, pNew
7950: 29 3b 0a 20 20 69 66 28 20 65 44 69 73 74 69 6e  );.  if( eDistin
7960: 63 74 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ct==SF_Distinct 
7970: 29 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74  ) ExprSetPropert
7980: 79 28 70 4e 65 77 2c 20 45 50 5f 44 69 73 74 69  y(pNew, EP_Disti
7990: 6e 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  nct);.  return p
79a0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  New;.}../*.** As
79b0: 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20  sign a variable 
79c0: 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70  number to an exp
79d0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63  ression that enc
79e0: 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a  odes a wildcard.
79f0: 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ** in the origin
7a00: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
7a10: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  .  .**.** Wildca
7a20: 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  rds consisting o
7a30: 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61  f a single "?" a
7a40: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
7a50: 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a  next sequential.
7a60: 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  ** variable numb
7a70: 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  er..**.** Wildca
7a80: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
7a90: 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67  "?nnn" are assig
7aa0: 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22  ned the number "
7ab0: 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a  nnn".  We make.*
7ac0: 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20  * sure "nnn" is 
7ad0: 6e 6f 74 20 74 6f 6f 20 62 69 67 20 74 6f 20 61  not too big to a
7ae0: 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66  void a denial of
7af0: 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20   service attack 
7b00: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  when.** the SQL 
7b10: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20  statement comes 
7b20: 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c  from an external
7b30: 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57   source..**.** W
7b40: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
7b50: 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61  form ":aaa", "@a
7b60: 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61  aa", or "$aaa" a
7b70: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
7b80: 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  same number.** a
7b90: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69  s the previous i
7ba0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73  nstance of the s
7bb0: 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f  ame wildcard.  O
7bc0: 72 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  r if this is the
7bd0: 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e   first.** instan
7be0: 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61  ce of the wildca
7bf0: 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71  rd, the next seq
7c00: 75 65 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65  uential variable
7c10: 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73   number is.** as
7c20: 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  signed..*/.void 
7c30: 73 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67  sqlite3ExprAssig
7c40: 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65  nVarNumber(Parse
7c50: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
7c60: 70 45 78 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20  pExpr, u32 n){. 
7c70: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7c80: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e  Parse->db;.  con
7c90: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e  st char *z;.  yn
7ca0: 56 61 72 20 78 3b 0a 0a 20 20 69 66 28 20 70 45  Var x;..  if( pE
7cb0: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
7cc0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
7cd0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
7ce0: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
7cf0: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
7d00: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
7d10: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
7d20: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
7d30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
7d40: 30 5d 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  0]!=0 );.  asser
7d50: 74 28 20 6e 3d 3d 28 75 33 32 29 73 71 6c 69 74  t( n==(u32)sqlit
7d60: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b  e3Strlen30(z) );
7d70: 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29  .  if( z[1]==0 )
7d80: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
7d90: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
7da0: 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e  ".  Assign the n
7db0: 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ext variable num
7dc0: 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ber */.    asser
7dd0: 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a  t( z[0]=='?' );.
7de0: 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28      x = (ynVar)(
7df0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b  ++pParse->nVar);
7e00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
7e10: 74 20 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20  t doAdd = 0;.   
7e20: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29   if( z[0]=='?' )
7e30: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
7e40: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
7e50: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
7e60: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
7e70: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a  eger and.      *
7e80: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
7e90: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7ea0: 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a  */.      i64 i;.
7eb0: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20        int bOk;. 
7ec0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b       if( n==2 ){
7ed0: 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d   /*OPTIMIZATION-
7ee0: 49 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20  IF-TRUE*/.      
7ef0: 20 20 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20    i = z[1]-'0'; 
7f00: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
7f10: 61 73 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20  ase of ?N for a 
7f20: 73 69 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a  single digit N *
7f30: 2f 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20  /.        bOk = 
7f40: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
7f50: 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d          bOk = 0=
7f60: 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26  =sqlite3Atoi64(&
7f70: 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53  z[1], &i, n-1, S
7f80: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
7f90: 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
7fa0: 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ase( i==0 );.   
7fb0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
7fc0: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
7fd0: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
7fe0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7ff0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
8000: 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
8010: 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69  case( i==db->aLi
8020: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8030: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
8040: 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ] );.      if( b
8050: 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20  Ok==0 || i<1 || 
8060: 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  i>db->aLimit[SQL
8070: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
8080: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
8090: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
80a0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
80b0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d  ariable number m
80c0: 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f  ust be between ?
80d0: 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20  1 and ?%d",.    
80e0: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d          db->aLim
80f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8100: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
8110: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
8120: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
8130: 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20   x = (ynVar)i;. 
8140: 20 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73       if( x>pPars
8150: 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20  e->nVar ){.     
8160: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20     pParse->nVar 
8170: 3d 20 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20  = (int)x;.      
8180: 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20    doAdd = 1;.   
8190: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
81a0: 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61  ite3VListNumToNa
81b0: 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  me(pParse->pVLis
81c0: 74 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, x)==0 ){.    
81d0: 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20      doAdd = 1;. 
81e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
81f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
8200: 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22  ards like ":aaa"
8210: 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61  , "$aaa" or "@aa
8220: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
8230: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
8240: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
8250: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
8260: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
8270: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
8280: 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68   name.      ** h
8290: 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65  as never appeare
82a0: 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20  d before, reuse 
82b0: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
82c0: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
82d0: 2f 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56  /.      x = (ynV
82e0: 61 72 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e  ar)sqlite3VListN
82f0: 61 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d  ameToNum(pParse-
8300: 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a  >pVList, z, n);.
8310: 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29        if( x==0 )
8320: 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 79  {.        x = (y
8330: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
8340: 6e 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64  nVar);.        d
8350: 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  oAdd = 1;.      
8360: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
8370: 64 6f 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70  doAdd ){.      p
8380: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20  Parse->pVList = 
8390: 73 71 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28  sqlite3VListAdd(
83a0: 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69  db, pParse->pVLi
83b0: 73 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20  st, z, n, x);.  
83c0: 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d    }.  }.  pExpr-
83d0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20  >iColumn = x;.  
83e0: 69 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74  if( x>db->aLimit
83f0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
8400: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
8410: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8420: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
8430: 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69  oo many SQL vari
8440: 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  ables");.  }.}..
8450: 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c  /*.** Recursivel
8460: 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72  y delete an expr
8470: 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
8480: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
8490: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69  INLINE void sqli
84a0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
84b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
84c0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
84d0: 20 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61   p!=0 );.  /* Sa
84e0: 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65  nity check: Asse
84f0: 72 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56  rt that the IntV
8500: 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  alue is non-nega
8510: 74 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74  tive if it exist
8520: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  s */.  assert( !
8530: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8540: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
8550: 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d  || p->u.iValue>=
8560: 30 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  0 );..  assert( 
8570: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
8580: 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20  (p, EP_WinFunc) 
8590: 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e 21 3d 30 20  || p->y.pWin!=0 
85a0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
85b0: 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  led );.  assert(
85c0: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54   p->op!=TK_FUNCT
85d0: 49 4f 4e 20 7c 7c 20 45 78 70 72 48 61 73 50 72  ION || ExprHasPr
85e0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
85f0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
8600: 64 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  d).          || 
8610: 70 2d 3e 79 2e 70 57 69 6e 3d 3d 30 20 7c 7c 20  p->y.pWin==0 || 
8620: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8630: 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  p, EP_WinFunc) )
8640: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
8650: 44 45 42 55 47 0a 20 20 69 66 28 20 45 78 70 72  DEBUG.  if( Expr
8660: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8670: 50 5f 4c 65 61 66 29 20 26 26 20 21 45 78 70 72  P_Leaf) && !Expr
8680: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8690: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
86a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
86b0: 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Left==0 );.    a
86c0: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
86d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
86e0: 74 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d  t( p->x.pSelect=
86f0: 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  =0 );.  }.#endif
8700: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
8710: 72 6f 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54  roperty(p, (EP_T
8720: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66  okenOnly|EP_Leaf
8730: 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  )) ){.    /* The
8740: 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73   Expr.x union is
8750: 20 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74   never used at t
8760: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
8770: 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20  Expr.pRight */. 
8780: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e     assert( p->x.
8790: 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pList==0 || p->p
87a0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
87b0: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20  if( p->pLeft && 
87c0: 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54  p->op!=TK_SELECT
87d0: 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65  _COLUMN ) sqlite
87e0: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62  3ExprDeleteNN(db
87f0: 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  , p->pLeft);.   
8800: 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29   if( p->pRight )
8810: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
8820: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
8830: 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20  (p, EP_WinFunc) 
8840: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8850: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8860: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20   p->pRight);.   
8870: 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48   }else if( ExprH
8880: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8890: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
88a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
88b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
88c0: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a   EP_WinFunc) );.
88d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
88e0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
88f0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
8900: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
8910: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8920: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  ete(db, p->x.pLi
8930: 73 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  st);.#ifndef SQL
8940: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
8950: 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45 78  UNC.      if( Ex
8960: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8970: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a   EP_WinFunc) ){.
8980: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
8990: 69 6e 64 6f 77 44 65 6c 65 74 65 28 64 62 2c 20  indowDelete(db, 
89a0: 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20 20  p->y.pWin);.    
89b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
89c0: 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48  .  }.  if( ExprH
89d0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
89e0: 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c  _MemToken) ) sql
89f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8a00: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69  ->u.zToken);.  i
8a10: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
8a20: 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63  rty(p, EP_Static
8a30: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
8a40: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
8a50: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
8a60: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71  te3ExprDelete(sq
8a70: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
8a80: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73  *p){.  if( p ) s
8a90: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8aa0: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  NN(db, p);.}../*
8ab0: 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 52   Invoke sqlite3R
8ac0: 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 29  enameExprUnmap()
8ad0: 20 61 6e 64 20 73 71 6c 69 74 65 33 45 78 70 72   and sqlite3Expr
8ae0: 44 65 6c 65 74 65 28 29 20 6f 6e 20 74 68 65 0a  Delete() on the.
8af0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ** expression..*
8b00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
8b10: 70 72 55 6e 6d 61 70 41 6e 64 44 65 6c 65 74 65  prUnmapAndDelete
8b20: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8b30: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
8b40: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f  p ){.    if( IN_
8b50: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
8b60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
8b70: 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50  nameExprUnmap(pP
8b80: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  arse, p);.    }.
8b90: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
8ba0: 65 6c 65 74 65 4e 4e 28 70 50 61 72 73 65 2d 3e  eleteNN(pParse->
8bb0: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  db, p);.  }.}../
8bc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
8bd0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
8be0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
8bf0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72  e expression str
8c00: 75 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65  ucture .** passe
8c10: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
8c20: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  rgument. This is
8c30: 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45   always one of E
8c40: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a  XPR_FULLSIZE,.**
8c50: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
8c60: 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  E or EXPR_TOKENO
8c70: 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74  NLYSIZE..*/.stat
8c80: 69 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63  ic int exprStruc
8c90: 74 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a  tSize(Expr *p){.
8ca0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
8cb0: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
8cc0: 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20  nOnly) ) return 
8cd0: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
8ce0: 5a 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  ZE;.  if( ExprHa
8cf0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8d00: 52 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72  Reduced) ) retur
8d10: 6e 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  n EXPR_REDUCEDSI
8d20: 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50  ZE;.  return EXP
8d30: 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f  R_FULLSIZE;.}../
8d40: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
8d50: 70 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e  pr*Size() routin
8d60: 65 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74  es each return t
8d70: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
8d80: 65 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74  es required.** t
8d90: 6f 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f  o store a copy o
8da0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
8db0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  or expression tr
8dc0: 65 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72  ee.  They differ
8dd0: 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20   in.** how much 
8de0: 6f 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d  of the tree is m
8df0: 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  easured..**.**  
8e00: 20 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75     dupedExprStru
8e10: 63 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a  ctSize()     Siz
8e20: 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78  e of only the Ex
8e30: 70 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  pr structure .**
8e40: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f       dupedExprNo
8e50: 64 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53  deSize()       S
8e60: 69 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70  ize of Expr + sp
8e70: 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a  ace for token.**
8e80: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69       dupedExprSi
8e90: 7a 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45  ze()           E
8ea0: 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75  xpr + token + su
8eb0: 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73  btree components
8ec0: 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
8ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
8f10: 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45  **.** The dupedE
8f20: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
8f30: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
8f40: 20 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65   two values OR-e
8f50: 64 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a  d together:  .**
8f60: 20 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72   (1) the space r
8f70: 65 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f  equired for a co
8f80: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
8f90: 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e  tructure only an
8fa0: 64 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50  d .** (2) the EP
8fb0: 5f 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20  _xxx flags that 
8fc0: 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68  indicate what th
8fd0: 65 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65  e structure size
8fe0: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54   should be..** T
8ff0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  he return values
9000: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
9010: 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58  f:.**.**      EX
9020: 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20  PR_FULLSIZE.**  
9030: 20 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44      EXPR_REDUCED
9040: 53 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75  SIZE   | EP_Redu
9050: 63 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  ced.**      EXPR
9060: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
9070: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a   EP_TokenOnly.**
9080: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
9090: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61  the structure ca
90a0: 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61  n be found by ma
90b0: 73 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e  sking the return
90c0: 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69   value.** of thi
90d0: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30  s routine with 0
90e0: 78 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73  xfff.  The flags
90f0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
9100: 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20   masking the.** 
9110: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74  return value wit
9120: 68 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  h EP_Reduced|EP_
9130: 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  TokenOnly..**.**
9140: 20 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20   Note that with 
9150: 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  flags==EXPRDUP_R
9160: 45 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74  EDUCE, this rout
9170: 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75  ines works on fu
9180: 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65  ll-size.** (unre
9190: 64 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65  duced) Expr obje
91a0: 63 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f  cts as they or o
91b0: 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72  riginally constr
91c0: 75 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72  ucted by the par
91d0: 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65  ser..** During e
91e0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
91f0: 69 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  is, extra inform
9200: 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65  ation is compute
9210: 64 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f  d and moved into
9220: 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20  .** later parts 
9230: 6f 66 20 74 68 65 20 45 78 70 72 20 6f 62 6a 65  of the Expr obje
9240: 63 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72  ct and that extr
9250: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69  a information mi
9260: 67 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a  ght get chopped.
9270: 2a 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78  ** off if the ex
9280: 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75  pression is redu
9290: 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ced.  Note also 
92a0: 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
92b0: 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65   work to.** make
92c0: 20 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55   an EXPRDUP_REDU
92d0: 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64  CE copy of a red
92e0: 75 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e  uced expression.
92f0: 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67    It is only leg
9300: 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20  al.** to reduce 
9310: 61 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65  a pristine expre
9320: 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20  ssion tree from 
9330: 74 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65  the parser.  The
9340: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a   implementation.
9350: 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53  ** of dupedExprS
9360: 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74  tructSize() cont
9370: 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73  ain multiple ass
9380: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
9390: 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a   that attempt.**
93a0: 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73   to enforce this
93b0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a   constraint..*/.
93c0: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
93d0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45  ExprStructSize(E
93e0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
93f0: 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b  s){.  int nSize;
9400: 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
9410: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
9420: 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20   || flags==0 ); 
9430: 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67  /* Only one flag
9440: 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a   value allowed *
9450: 2f 0a 20 20 61 73 73 65 72 74 28 20 45 58 50 52  /.  assert( EXPR
9460: 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66  _FULLSIZE<=0xfff
9470: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30   );.  assert( (0
9480: 78 66 66 66 20 26 20 28 45 50 5f 52 65 64 75 63  xfff & (EP_Reduc
9490: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
94a0: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d  )==0 );.  if( 0=
94b0: 3d 66 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d  =flags || p->op=
94c0: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
94d0: 4e 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  N .#ifndef SQLIT
94e0: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
94f0: 43 0a 20 20 20 7c 7c 20 45 78 70 72 48 61 73 50  C.   || ExprHasP
9500: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69  roperty(p, EP_Wi
9510: 6e 46 75 6e 63 29 0a 23 65 6e 64 69 66 0a 20 20  nFunc).#endif.  
9520: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  ){.    nSize = E
9530: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20  XPR_FULLSIZE;.  
9540: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
9550: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
9560: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
9570: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
9580: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
9590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
95a0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  p, EP_FromJoin) 
95b0: 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  ); .    assert( 
95c0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
95d0: 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  (p, EP_MemToken)
95e0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
95f0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
9600: 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  (p, EP_NoReduce)
9610: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   );.    if( p->p
9620: 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69  Left || p->x.pLi
9630: 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  st ){.      nSiz
9640: 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44  e = EXPR_REDUCED
9650: 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65  SIZE | EP_Reduce
9660: 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
9670: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
9680: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
9690: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 54    nSize = EXPR_T
96a0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
96b0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20  P_TokenOnly;.   
96c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
96d0: 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nSize;.}../*.** 
96e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
96f0: 74 75 72 6e 73 20 74 68 65 20 73 70 61 63 65 20  turns the space 
9700: 69 6e 20 62 79 74 65 73 20 72 65 71 75 69 72 65  in bytes require
9710: 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  d to store the c
9720: 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45  opy .** of the E
9730: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  xpr structure an
9740: 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  d a copy of the 
9750: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74  Expr.u.zToken st
9760: 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a 2a 2a  ring (if that.**
9770: 20 73 74 72 69 6e 67 20 69 73 20 64 65 66 69 6e   string is defin
9780: 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ed.).*/.static i
9790: 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65  nt dupedExprNode
97a0: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
97b0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
97c0: 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70  nByte = dupedExp
97d0: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66  rStructSize(p, f
97e0: 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b 0a 20  lags) & 0xfff;. 
97f0: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
9800: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
9810: 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54  alue) && p->u.zT
9820: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74  oken ){.    nByt
9830: 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
9840: 65 6e 33 30 4e 4e 28 70 2d 3e 75 2e 7a 54 6f 6b  en30NN(p->u.zTok
9850: 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74  en)+1;.  }.  ret
9860: 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  urn ROUND8(nByte
9870: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
9880: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
9890: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
98a0: 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c  to create a dupl
98b0: 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a  icate of the .**
98c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
98d0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
98e0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65  argument. The se
98f0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
9900: 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61   a.** mask conta
9910: 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58  ining EXPRDUP_XX
9920: 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  X flags..**.** T
9930: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
9940: 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65  d includes space
9950: 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70   to create a cop
9960: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
9970: 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61  ruct.** itself a
9980: 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65  nd the buffer re
9990: 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70  ferred to by Exp
99a0: 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61  r.u.zToken, if a
99b0: 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ny..**.** If the
99c0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
99d0: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
99e0: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
99f0: 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20  ue includes .** 
9a00: 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61  space to duplica
9a10: 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65  te all Expr node
9a20: 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f  s in the tree fo
9a30: 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65  rmed by Expr.pLe
9a40: 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e  ft .** and Expr.
9a50: 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73  pRight variables
9a60: 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e   (but not for an
9a70: 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69  y structures poi
9a80: 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64  nted to or .** d
9a90: 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68  escended from th
9aa0: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f  e Expr.x.pList o
9ab0: 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74  r Expr.x.pSelect
9ac0: 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a   variables)..*/.
9ad0: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
9ae0: 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70  ExprSize(Expr *p
9af0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
9b00: 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20  int nByte = 0;. 
9b10: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42   if( p ){.    nB
9b20: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e  yte = dupedExprN
9b30: 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  odeSize(p, flags
9b40: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
9b50: 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  &EXPRDUP_REDUCE 
9b60: 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
9b70: 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  = dupedExprSize(
9b80: 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29  p->pLeft, flags)
9b90: 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65   + dupedExprSize
9ba0: 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67  (p->pRight, flag
9bb0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  s);.    }.  }.  
9bc0: 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a  return nByte;.}.
9bd0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
9be0: 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
9bf0: 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  to sqlite3ExprDu
9c00: 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  p(), except that
9c10: 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a   if pzBuffer .**
9c20: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
9c30: 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61  n *pzBuffer is a
9c40: 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20  ssumed to point 
9c50: 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67  to a buffer larg
9c60: 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20  e enough .** to 
9c70: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f  store the copy o
9c80: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20  f expression p, 
9c90: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d  the copies of p-
9ca0: 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66  >u.zToken.** (if
9cb0: 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e   applicable), an
9cc0: 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  d the copies of 
9cd0: 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64  the p->pLeft and
9ce0: 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65   p->pRight expre
9cf0: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e  ssions,.** if an
9d00: 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  y. Before return
9d10: 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69  ing, *pzBuffer i
9d20: 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  s set to the fir
9d30: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
9d40: 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  .** portion of t
9d50: 68 65 20 62 75 66 66 65 72 20 63 6f 70 69 65 64  he buffer copied
9d60: 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75   into by this fu
9d70: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
9d80: 63 20 45 78 70 72 20 2a 65 78 70 72 44 75 70 28  c Expr *exprDup(
9d90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
9da0: 72 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61  r *p, int dupFla
9db0: 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65  gs, u8 **pzBuffe
9dc0: 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  r){.  Expr *pNew
9dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
9de0: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
9df0: 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20  /.  u8 *zAlloc; 
9e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
9e10: 6f 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77  ory space from w
9e20: 68 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78  hich to build Ex
9e30: 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  pr object */.  u
9e40: 33 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20  32 staticFlag;  
9e50: 20 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69       /* EP_Stati
9e60: 63 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f  c if space not o
9e70: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
9e80: 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  loc */..  assert
9e90: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
9ea0: 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65  ert( p );.  asse
9eb0: 72 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20  rt( dupFlags==0 
9ec0: 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50  || dupFlags==EXP
9ed0: 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20  RDUP_REDUCE );. 
9ee0: 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65   assert( pzBuffe
9ef0: 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73  r==0 || dupFlags
9f00: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
9f10: 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   );..  /* Figure
9f20: 20 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72   out where to wr
9f30: 69 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72  ite the new Expr
9f40: 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
9f50: 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b   if( pzBuffer ){
9f60: 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70  .    zAlloc = *p
9f70: 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61  zBuffer;.    sta
9f80: 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61  ticFlag = EP_Sta
9f90: 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tic;.  }else{.  
9fa0: 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74    zAlloc = sqlit
9fb0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
9fc0: 64 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a  db, dupedExprSiz
9fd0: 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b  e(p, dupFlags));
9fe0: 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20  .    staticFlag 
9ff0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20  = 0;.  }.  pNew 
a000: 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63  = (Expr *)zAlloc
a010: 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  ;..  if( pNew ){
a020: 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77  .    /* Set nNew
a030: 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
a040: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
a050: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  he structure poi
a060: 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  nted to.    ** b
a070: 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20  y pNew. This is 
a080: 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c  either EXPR_FULL
a090: 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43  SIZE, EXPR_REDUC
a0a0: 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a  EDSIZE or.    **
a0b0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
a0c0: 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73  IZE. nToken is s
a0d0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
a0e0: 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d   of bytes consum
a0f0: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
a100: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e   copy of the p->
a110: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
a120: 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f  (if any)..    */
a130: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
a140: 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20  ned nStructSize 
a150: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
a160: 74 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67  tSize(p, dupFlag
a170: 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  s);.    const in
a180: 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74  t nNewSize = nSt
a190: 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66  ructSize & 0xfff
a1a0: 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e  ;.    int nToken
a1b0: 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48  ;.    if( !ExprH
a1c0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
a1d0: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
a1e0: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
a1f0: 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69     nToken = sqli
a200: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75  te3Strlen30(p->u
a210: 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20  .zToken) + 1;.  
a220: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
a230: 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  Token = 0;.    }
a240: 0a 20 20 20 20 69 66 28 20 64 75 70 46 6c 61 67  .    if( dupFlag
a250: 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  s ){.      asser
a260: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
a270: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
a280: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65  )==0 );.      me
a290: 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20  mcpy(zAlloc, p, 
a2a0: 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d  nNewSize);.    }
a2b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20  else{.      u32 
a2c0: 6e 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70  nSize = (u32)exp
a2d0: 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a  rStructSize(p);.
a2e0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
a2f0: 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a  loc, p, nSize);.
a300: 20 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c        if( nSize<
a310: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b  EXPR_FULLSIZE ){
a320: 20 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74   .        memset
a330: 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c  (&zAlloc[nSize],
a340: 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   0, EXPR_FULLSIZ
a350: 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  E-nSize);.      
a360: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
a370: 53 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63  Set the EP_Reduc
a380: 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ed, EP_TokenOnly
a390: 2c 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20  , and EP_Static 
a3a0: 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74  flags appropriat
a3b0: 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77  ely. */.    pNew
a3c0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f  ->flags &= ~(EP_
a3d0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a3e0: 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45  Only|EP_Static|E
a3f0: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20  P_MemToken);.   
a400: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
a410: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45  nStructSize & (E
a420: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
a430: 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65  enOnly);.    pNe
a440: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74  w->flags |= stat
a450: 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20  icFlag;..    /* 
a460: 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54  Copy the p->u.zT
a470: 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20  oken string, if 
a480: 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
a490: 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  nToken ){.      
a4a0: 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70  char *zToken = p
a4b0: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  New->u.zToken = 
a4c0: 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e  (char*)&zAlloc[n
a4d0: 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20  NewSize];.      
a4e0: 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70  memcpy(zToken, p
a4f0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  ->u.zToken, nTok
a500: 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  en);.    }..    
a510: 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67  if( 0==((p->flag
a520: 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26  s|pNew->flags) &
a530: 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45   (EP_TokenOnly|E
a540: 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20  P_Leaf)) ){.    
a550: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
a560: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
a570: 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73   or pNew->x.pLis
a580: 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  t member. */.   
a590: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
a5a0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
a5b0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
a5c0: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65     pNew->x.pSele
a5d0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
a5e0: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70  ctDup(db, p->x.p
a5f0: 53 65 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73  Select, dupFlags
a600: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a610: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
a620: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
a630: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
a640: 2d 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c  ->x.pList, dupFl
a650: 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ags);.      }.  
a660: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c    }..    /* Fill
a670: 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20   in pNew->pLeft 
a680: 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  and pNew->pRight
a690: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70  . */.    if( Exp
a6a0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
a6b0: 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50  w, EP_Reduced|EP
a6c0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 57 69  _TokenOnly|EP_Wi
a6d0: 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  nFunc) ){.      
a6e0: 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45  zAlloc += dupedE
a6f0: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64  xprNodeSize(p, d
a700: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
a710: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
a720: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f  erty(pNew, EP_To
a730: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
a740: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
a750: 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65  ->pLeft = p->pLe
a760: 66 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  ft ?.           
a770: 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44             exprD
a780: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c  up(db, p->pLeft,
a790: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c   EXPRDUP_REDUCE,
a7a0: 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20   &zAlloc) : 0;. 
a7b0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
a7c0: 67 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20  ght = p->pRight 
a7d0: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
a7e0: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a7f0: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
a800: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
a810: 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20  &zAlloc) : 0;.  
a820: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
a830: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
a840: 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45  FUNC.      if( E
a850: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a860: 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b  , EP_WinFunc) ){
a870: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 79  .        pNew->y
a880: 2e 70 57 69 6e 20 3d 20 73 71 6c 69 74 65 33 57  .pWin = sqlite3W
a890: 69 6e 64 6f 77 44 75 70 28 64 62 2c 20 70 4e 65  indowDup(db, pNe
a8a0: 77 2c 20 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20  w, p->y.pWin);. 
a8b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45         assert( E
a8c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a8d0: 4e 65 77 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  New, EP_WinFunc)
a8e0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
a8f0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
a900: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a  T_WINDOWFUNC */.
a910: 20 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66        if( pzBuff
a920: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  er ){.        *p
a930: 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63  zBuffer = zAlloc
a940: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
a950: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
a960: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a970: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
a980: 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  EP_Leaf) ){.    
a990: 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70      if( pNew->op
a9a0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  ==TK_SELECT_COLU
a9b0: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
a9c0: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d  pNew->pLeft = p-
a9d0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  >pLeft;.        
a9e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 43 6f    assert( p->iCo
a9f0: 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  lumn==0 || p->pR
aa00: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
aa10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
aa20: 70 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d  pRight==0  || p-
aa30: 3e 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66  >pRight==p->pLef
aa40: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t );.        }el
aa50: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
aa60: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
aa70: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
aa80: 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  ->pLeft, 0);.   
aa90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
aaa0: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71  New->pRight = sq
aab0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
aac0: 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a   p->pRight, 0);.
aad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
aae0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
aaf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
ab00: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65   and return a de
ab10: 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f  ep copy of the o
ab20: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
ab30: 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61  the second .** a
ab40: 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f  rgument. If an O
ab50: 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  OM condition is 
ab60: 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c  encountered, NUL
ab70: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  L is returned.**
ab80: 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c   and the db->mal
ab90: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73  locFailed flag s
aba0: 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  et..*/.#ifndef S
abb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73  QLITE_OMIT_CTE.s
abc0: 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74 68  tatic With *with
abd0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
abe0: 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74   With *p){.  Wit
abf0: 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  h *pRet = 0;.  i
ac00: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
ac10: 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20  te3_int64 nByte 
ac20: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73  = sizeof(*p) + s
ac30: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
ac40: 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20   (p->nCte-1);.  
ac50: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
ac60: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
ac70: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
ac80: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69   pRet ){.      i
ac90: 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74  nt i;.      pRet
aca0: 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65  ->nCte = p->nCte
acb0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
acc0: 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
acd0: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  {.        pRet->
ace0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73  a[i].pSelect = s
acf0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
ad00: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c  db, p->a[i].pSel
ad10: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
ad20: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c   pRet->a[i].pCol
ad30: 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  s = sqlite3ExprL
ad40: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  istDup(db, p->a[
ad50: 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20  i].pCols, 0);.  
ad60: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
ad70: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
ad80: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e  DbStrDup(db, p->
ad90: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
ada0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
adb0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
adc0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
add0: 69 74 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65  ithDup(x,y) 0.#e
ade0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
adf0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
ae00: 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67  FUNC./*.** The g
ae10: 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f  atherSelectWindo
ae20: 77 73 28 29 20 70 72 6f 63 65 64 75 72 65 20 61  ws() procedure a
ae30: 6e 64 20 69 74 73 20 68 65 6c 70 65 72 20 72 6f  nd its helper ro
ae40: 75 74 69 6e 65 0a 2a 2a 20 67 61 74 68 65 72 53  utine.** gatherS
ae50: 65 6c 65 63 74 57 69 6e 64 6f 77 73 43 61 6c 6c  electWindowsCall
ae60: 62 61 63 6b 28 29 20 61 72 65 20 75 73 65 64 20  back() are used 
ae70: 74 6f 20 73 63 61 6e 20 61 6c 6c 20 74 68 65 20  to scan all the 
ae80: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61  expressions.** a
ae90: 6e 20 61 20 6e 65 77 6c 79 20 64 75 70 6c 69 63  n a newly duplic
aea0: 61 74 65 64 20 53 45 4c 45 43 54 20 73 74 61 74  ated SELECT stat
aeb0: 65 6d 65 6e 74 20 61 6e 64 20 67 61 74 68 65 72  ement and gather
aec0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 69 6e 64   all of the Wind
aed0: 6f 77 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 66 6f  ow.** objects fo
aee0: 75 6e 64 20 74 68 65 72 65 2c 20 61 73 73 65 6d  und there, assem
aef0: 62 6c 69 6e 67 20 74 68 65 6d 20 6f 6e 74 6f 20  bling them onto 
af00: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
af10: 61 74 20 53 65 6c 65 63 74 2d 3e 70 57 69 6e 2e  at Select->pWin.
af20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
af30: 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f  atherSelectWindo
af40: 77 73 43 61 6c 6c 62 61 63 6b 28 57 61 6c 6b 65  wsCallback(Walke
af50: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
af60: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20   *pExpr){.  if( 
af70: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55  pExpr->op==TK_FU
af80: 4e 43 54 49 4f 4e 20 26 26 20 45 78 70 72 48 61  NCTION && ExprHa
af90: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
afa0: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a   EP_WinFunc) ){.
afb0: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
afc0: 65 63 74 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  ect = pWalker->u
afd0: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 57 69  .pSelect;.    Wi
afe0: 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 70 45 78  ndow *pWin = pEx
aff0: 70 72 2d 3e 79 2e 70 57 69 6e 3b 0a 20 20 20 20  pr->y.pWin;.    
b000: 61 73 73 65 72 74 28 20 70 57 69 6e 20 29 3b 0a  assert( pWin );.
b010: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 57 69      assert( IsWi
b020: 6e 64 6f 77 46 75 6e 63 28 70 45 78 70 72 29 20  ndowFunc(pExpr) 
b030: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
b040: 57 69 6e 2d 3e 70 70 54 68 69 73 3d 3d 30 20 29  Win->ppThis==0 )
b050: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e  ;.    sqlite3Win
b060: 64 6f 77 4c 69 6e 6b 28 70 53 65 6c 65 63 74 2c  dowLink(pSelect,
b070: 20 70 57 69 6e 29 3b 0a 20 20 7d 0a 20 20 72 65   pWin);.  }.  re
b080: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
b090: 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  e;.}.static int 
b0a0: 67 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64  gatherSelectWind
b0b0: 6f 77 73 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  owsSelectCallbac
b0c0: 6b 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  k(Walker *pWalke
b0d0: 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
b0e0: 20 72 65 74 75 72 6e 20 70 3d 3d 70 57 61 6c 6b   return p==pWalk
b0f0: 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 20 3f 20  er->u.pSelect ? 
b100: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 3a 20 57  WRC_Continue : W
b110: 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 73 74 61 74  RC_Prune;.}.stat
b120: 69 63 20 76 6f 69 64 20 67 61 74 68 65 72 53 65  ic void gatherSe
b130: 6c 65 63 74 57 69 6e 64 6f 77 73 28 53 65 6c 65  lectWindows(Sele
b140: 63 74 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72  ct *p){.  Walker
b150: 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
b160: 6c 62 61 63 6b 20 3d 20 67 61 74 68 65 72 53 65  lback = gatherSe
b170: 6c 65 63 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62  lectWindowsCallb
b180: 61 63 6b 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ack;.  w.xSelect
b190: 43 61 6c 6c 62 61 63 6b 20 3d 20 67 61 74 68 65  Callback = gathe
b1a0: 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 53 65  rSelectWindowsSe
b1b0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 3b 0a 20 20  lectCallback;.  
b1c0: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
b1d0: 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 70 50 61 72  k2 = 0;.  w.pPar
b1e0: 73 65 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53  se = 0;.  w.u.pS
b1f0: 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c  elect = p;.  sql
b200: 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
b210: 77 2c 20 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  w, p);.}.#endif.
b220: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
b230: 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72  owing group of r
b240: 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65  outines make dee
b250: 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72  p copies of expr
b260: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72  essions,.** expr
b270: 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44  ession lists, ID
b280: 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65   lists, and sele
b290: 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
b2a0: 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a  The copies can.*
b2b0: 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79  * be deleted (by
b2c0: 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f   being passed to
b2d0: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
b2e0: 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f  e ...Delete() ro
b2f0: 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f  utines).** witho
b300: 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65  ut effecting the
b310: 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a   originals..**.*
b320: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
b330: 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73   list, ID, and s
b340: 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75  ource lists retu
b350: 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  rn by sqlite3Exp
b360: 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73  rListDup(),.** s
b370: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
b380: 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72  ), and sqlite3Sr
b390: 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e  cListDup() can n
b3a0: 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78  ot be further ex
b3b0: 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75  panded .** by su
b3c0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
b3d0: 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70  o sqlite*ListApp
b3e0: 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a  end() routines..
b3f0: 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73  **.** Any tables
b400: 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73   that the SrcLis
b410: 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  t might point to
b420: 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61   are not duplica
b430: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ted..**.** The f
b440: 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63  lags parameter c
b450: 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e  ontains a combin
b460: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50  ation of the EXP
b470: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
b480: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
b490: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
b4a0: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73   set, then the s
b4b0: 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
b4c0: 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61  d is a.** trunca
b4d0: 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ted version of t
b4e0: 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74  he usual Expr st
b4f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
b500: 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a  l be stored as.*
b510: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  * part of the in
b520: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
b530: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
b540: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
b550: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
b560: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
b570: 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  db, Expr *p, int
b580: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
b590: 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
b5a0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
b5b0: 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  DUCE );.  return
b5c0: 20 70 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c   p ? exprDup(db,
b5d0: 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20   p, flags, 0) : 
b5e0: 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73  0;.}.ExprList *s
b5f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
b600: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
b610: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
b620: 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69  flags){.  ExprLi
b630: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75  st *pNew;.  stru
b640: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
b650: 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74   *pItem, *pOldIt
b660: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  em;.  int i;.  E
b670: 78 70 72 20 2a 70 50 72 69 6f 72 53 65 6c 65 63  xpr *pPriorSelec
b680: 74 43 6f 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65  tCol = 0;.  asse
b690: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
b6a0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
b6b0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
b6c0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
b6d0: 4e 28 64 62 2c 20 73 71 6c 69 74 65 33 44 62 4d  N(db, sqlite3DbM
b6e0: 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 29  allocSize(db, p)
b6f0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
b700: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b710: 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e  New->nExpr = p->
b720: 6e 45 78 70 72 3b 0a 20 20 70 49 74 65 6d 20 3d  nExpr;.  pItem =
b730: 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64   pNew->a;.  pOld
b740: 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66  Item = p->a;.  f
b750: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
b760: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
b770: 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20  , pOldItem++){. 
b780: 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70     Expr *pOldExp
b790: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45  r = pOldItem->pE
b7a0: 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
b7b0: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 70 49 74  NewExpr;.    pIt
b7c0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  em->pExpr = sqli
b7d0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b7e0: 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b  OldExpr, flags);
b7f0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70  .    if( pOldExp
b800: 72 20 0a 20 20 20 20 20 26 26 20 70 4f 6c 64 45  r .     && pOldE
b810: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
b820: 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26  CT_COLUMN.     &
b830: 26 20 28 70 4e 65 77 45 78 70 72 20 3d 20 70 49  & (pNewExpr = pI
b840: 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d 30 20 0a  tem->pExpr)!=0 .
b850: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
b860: 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69  ert( pNewExpr->i
b870: 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30  Column==0 || i>0
b880: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e   );.      if( pN
b890: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
b8a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
b8b0: 73 65 72 74 28 20 70 4f 6c 64 45 78 70 72 2d 3e  sert( pOldExpr->
b8c0: 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78 70 72 2d  pLeft==pOldExpr-
b8d0: 3e 70 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20  >pRight );.     
b8e0: 20 20 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43     pPriorSelectC
b8f0: 6f 6c 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70  ol = pNewExpr->p
b900: 4c 65 66 74 20 3d 20 70 4e 65 77 45 78 70 72 2d  Left = pNewExpr-
b910: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 7d  >pRight;.      }
b920: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
b930: 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
b940: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
b950: 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 21 3d 30 20  em[-1].pExpr!=0 
b960: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
b970: 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f  t( pNewExpr->iCo
b980: 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e  lumn==pItem[-1].
b990: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31  pExpr->iColumn+1
b9a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
b9b0: 72 74 28 20 70 50 72 69 6f 72 53 65 6c 65 63 74  rt( pPriorSelect
b9c0: 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70  Col==pItem[-1].p
b9d0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  Expr->pLeft );. 
b9e0: 20 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 2d         pNewExpr-
b9f0: 3e 70 4c 65 66 74 20 3d 20 70 50 72 69 6f 72 53  >pLeft = pPriorS
ba00: 65 6c 65 63 74 43 6f 6c 3b 0a 20 20 20 20 20 20  electCol;.      
ba10: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65  }.    }.    pIte
ba20: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
ba30: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
ba40: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
ba50: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
ba60: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
ba70: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
ba80: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
ba90: 74 65 6d 2d 3e 73 6f 72 74 46 6c 61 67 73 20 3d  tem->sortFlags =
baa0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 46   pOldItem->sortF
bab0: 6c 61 67 73 3b 0a 20 20 20 20 70 49 74 65 6d 2d  lags;.    pItem-
bac0: 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70  >done = 0;.    p
bad0: 49 74 65 6d 2d 3e 62 4e 75 6c 6c 73 20 3d 20 70  Item->bNulls = p
bae0: 4f 6c 64 49 74 65 6d 2d 3e 62 4e 75 6c 6c 73 3b  OldItem->bNulls;
baf0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
bb00: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
bb10: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
bb20: 20 20 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65     pItem->bSorte
bb30: 72 52 65 66 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rRef = pOldItem-
bb40: 3e 62 53 6f 72 74 65 72 52 65 66 3b 0a 20 20 20  >bSorterRef;.   
bb50: 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64   pItem->u = pOld
bb60: 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72  Item->u;.  }.  r
bb70: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
bb80: 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c  *.** If cursors,
bb90: 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73   triggers, views
bba0: 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
bbb0: 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20  are all omitted 
bbc0: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c  from.** the buil
bbd0: 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20  d, then none of 
bbe0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
bbf0: 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66  utines, except f
bc00: 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65  or .** sqlite3Se
bc10: 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62  lectDup(), can b
bc20: 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65  e called. sqlite
bc30: 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20  3SelectDup() is 
bc40: 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c  sometimes.** cal
bc50: 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  led with a NULL 
bc60: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  argument..*/.#if
bc70: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
bc80: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
bc90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
bca0: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20  MIT_TRIGGER) \. 
bcb0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
bcc0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
bcd0: 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  ).SrcList *sqlit
bce0: 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c  e3SrcListDup(sql
bcf0: 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
bd00: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
bd10: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  {.  SrcList *pNe
bd20: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  w;.  int i;.  in
bd30: 74 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72  t nByte;.  asser
bd40: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
bd50: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
bd60: 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  0;.  nByte = siz
bd70: 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53  eof(*p) + (p->nS
bd80: 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d  rc>0 ? sizeof(p-
bd90: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72  >a[0]) * (p->nSr
bda0: 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65  c-1) : 0);.  pNe
bdb0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
bdc0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79  locRawNN(db, nBy
bdd0: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  te );.  if( pNew
bde0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
bdf0: 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70    pNew->nSrc = p
be00: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
be10: 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >nSrc;.  for(i=0
be20: 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b  ; i<p->nSrc; i++
be30: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
be40: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  cList_item *pNew
be50: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
be60: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
be70: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
be80: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
be90: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
bea0: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
beb0: 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49  >pSchema = pOldI
bec0: 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  tem->pSchema;.  
bed0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74    pNewItem->zDat
bee0: 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44  abase = sqlite3D
bef0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
bf00: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
bf10: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
bf20: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
bf30: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
bf40: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
bf50: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69    pNewItem->zAli
bf60: 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  as = sqlite3DbSt
bf70: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
bf80: 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
bf90: 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70  pNewItem->fg = p
bfa0: 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20  OldItem->fg;.   
bfb0: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73   pNewItem->iCurs
bfc0: 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  or = pOldItem->i
bfd0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77  Cursor;.    pNew
bfe0: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
bff0: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64  b = pOldItem->ad
c000: 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70  drFillSub;.    p
c010: 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  NewItem->regRetu
c020: 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72  rn = pOldItem->r
c030: 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  egReturn;.    if
c040: 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69  ( pNewItem->fg.i
c050: 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20  sIndexedBy ){.  
c060: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
c070: 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71  .zIndexedBy = sq
c080: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
c090: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a  , pOldItem->u1.z
c0a0: 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20  IndexedBy);.    
c0b0: 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  }.    pNewItem->
c0c0: 70 49 42 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49  pIBIndex = pOldI
c0d0: 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20  tem->pIBIndex;. 
c0e0: 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d     if( pNewItem-
c0f0: 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
c100: 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  .      pNewItem-
c110: 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a  >u1.pFuncArg = .
c120: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c130: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
c140: 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46   pOldItem->u1.pF
c150: 75 6e 63 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a  uncArg, flags);.
c160: 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
c170: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
c180: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
c190: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
c1a0: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54  {.      pTab->nT
c1b0: 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20  abRef++;.    }. 
c1c0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65     pNewItem->pSe
c1d0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
c1e0: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  lectDup(db, pOld
c1f0: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66  Item->pSelect, f
c200: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lags);.    pNewI
c210: 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74  tem->pOn = sqlit
c220: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
c230: 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61  ldItem->pOn, fla
c240: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  gs);.    pNewIte
c250: 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69  m->pUsing = sqli
c260: 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c  te3IdListDup(db,
c270: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e   pOldItem->pUsin
c280: 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  g);.    pNewItem
c290: 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64  ->colUsed = pOld
c2a0: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
c2b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
c2c0: 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  ;.}.IdList *sqli
c2d0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c  te3IdListDup(sql
c2e0: 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
c2f0: 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a   *p){.  IdList *
c300: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
c310: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
c320: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
c330: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
c340: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c350: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
c360: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
c370: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
c380: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49  rn 0;.  pNew->nI
c390: 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e  d = p->nId;.  pN
c3a0: 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  ew->a = sqlite3D
c3b0: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
c3c0: 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70   p->nId*sizeof(p
c3d0: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
c3e0: 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20   pNew->a==0 ){. 
c3f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c400: 4e 4e 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  NN(db, pNew);.  
c410: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
c420: 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    /* Note that b
c430: 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65 20  ecause the size 
c440: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  of the allocatio
c450: 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20  n for p->a[] is 
c460: 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61  not.  ** necessa
c470: 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66 20  rily a power of 
c480: 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c 69  two, sqlite3IdLi
c490: 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20 6e  stAppend() may n
c4a0: 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a  ot be called.  *
c4b0: 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63 61  * on the duplica
c4c0: 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  te created by th
c4d0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a  is function. */.
c4e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
c4f0: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
c500: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
c510: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
c520: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
c530: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
c540: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
c550: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
c560: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
c570: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
c580: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
c590: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
c5a0: 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d  ->idx = pOldItem
c5b0: 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ->idx;.  }.  ret
c5c0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
c5d0: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
c5e0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
c5f0: 2c 20 53 65 6c 65 63 74 20 2a 70 44 75 70 2c 20  , Select *pDup, 
c600: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65  int flags){.  Se
c610: 6c 65 63 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a  lect *pRet = 0;.
c620: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 78 74 20    Select *pNext 
c630: 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 2a  = 0;.  Select **
c640: 70 70 20 3d 20 26 70 52 65 74 3b 0a 20 20 53 65  pp = &pRet;.  Se
c650: 6c 65 63 74 20 2a 70 3b 0a 0a 20 20 61 73 73 65  lect *p;..  asse
c660: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 66  rt( db!=0 );.  f
c670: 6f 72 28 70 3d 70 44 75 70 3b 20 70 3b 20 70 3d  or(p=pDup; p; p=
c680: 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
c690: 53 65 6c 65 63 74 20 2a 70 4e 65 77 20 3d 20 73  Select *pNew = s
c6a0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c6b0: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  wNN(db, sizeof(*
c6c0: 70 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  p) );.    if( pN
c6d0: 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ew==0 ) break;. 
c6e0: 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20     pNew->pEList 
c6f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
c700: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
c710: 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  st, flags);.    
c720: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
c730: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64  ite3SrcListDup(d
c740: 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67  b, p->pSrc, flag
c750: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57  s);.    pNew->pW
c760: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
c770: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68  prDup(db, p->pWh
c780: 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ere, flags);.   
c790: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
c7a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
c7b0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f  tDup(db, p->pGro
c7c0: 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  upBy, flags);.  
c7d0: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
c7e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c7f0: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
c800: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c810: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
c820: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c830: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
c840: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c850: 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  ew->op = p->op;.
c860: 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
c870: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 70 4e 65  = pNext;.    pNe
c880: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  w->pPrior = 0;. 
c890: 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20     pNew->pLimit 
c8a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c8b0: 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  (db, p->pLimit, 
c8c0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c8d0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
c8e0: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
c8f0: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73  = 0;.    pNew->s
c900: 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
c910: 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73  Flags & ~SF_Uses
c920: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 70  Ephemeral;.    p
c930: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
c940: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70  m[0] = -1;.    p
c950: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
c960: 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70  m[1] = -1;.    p
c970: 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  New->nSelectRow 
c980: 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  = p->nSelectRow;
c990: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  .    pNew->pWith
c9a0: 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c 20 70   = withDup(db, p
c9b0: 2d 3e 70 57 69 74 68 29 3b 0a 23 69 66 6e 64 65  ->pWith);.#ifnde
c9c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
c9d0: 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 70 4e 65  NDOWFUNC.    pNe
c9e0: 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20  w->pWin = 0;.   
c9f0: 20 70 4e 65 77 2d 3e 70 57 69 6e 44 65 66 6e 20   pNew->pWinDefn 
ca00: 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c  = sqlite3WindowL
ca10: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  istDup(db, p->pW
ca20: 69 6e 44 65 66 6e 29 3b 0a 20 20 20 20 69 66 28  inDefn);.    if(
ca30: 20 70 2d 3e 70 57 69 6e 20 26 26 20 64 62 2d 3e   p->pWin && db->
ca40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
ca50: 29 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69  ) gatherSelectWi
ca60: 6e 64 6f 77 73 28 70 4e 65 77 29 3b 0a 23 65 6e  ndows(pNew);.#en
ca70: 64 69 66 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65  dif.    pNew->se
ca80: 6c 49 64 20 3d 20 70 2d 3e 73 65 6c 49 64 3b 0a  lId = p->selId;.
ca90: 20 20 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a      *pp = pNew;.
caa0: 20 20 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e      pp = &pNew->
cab0: 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78  pPrior;.    pNex
cac0: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20  t = pNew;.  }.. 
cad0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
cae0: 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71  #else.Select *sq
caf0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
cb00: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
cb10: 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  ct *p, int flags
cb20: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
cb30: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  0 );.  return 0;
cb40: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
cb50: 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
cb60: 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ent to the end o
cb70: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
cb80: 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20  list.  If pList 
cb90: 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20  is.** initially 
cba0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74  NULL, then creat
cbb0: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
cbc0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  on list..**.** T
cbd0: 68 65 20 70 4c 69 73 74 20 61 72 67 75 6d 65 6e  he pList argumen
cbe0: 74 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  t must be either
cbf0: 20 4e 55 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74   NULL or a point
cc00: 65 72 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73  er to an ExprLis
cc10: 74 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  t.** obtained fr
cc20: 6f 6d 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  om a prior call 
cc30: 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  to sqlite3ExprLi
cc40: 73 74 41 70 70 65 6e 64 28 29 2e 20 20 54 68 69  stAppend().  Thi
cc50: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79  s routine.** may
cc60: 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74   not be used wit
cc70: 68 20 61 6e 20 45 78 70 72 4c 69 73 74 20 6f 62  h an ExprList ob
cc80: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
cc90: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29  te3ExprListDup()
cca0: 2e 0a 2a 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68  ..** Reason:  Th
ccb0: 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d  is routine assum
ccc0: 65 73 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  es that the numb
ccd0: 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70  er of slots in p
cce0: 4c 69 73 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20  List->a[].** is 
ccf0: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20  a power of two. 
cd00: 20 54 68 61 74 20 69 73 20 74 72 75 65 20 66 6f   That is true fo
cd10: 72 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  r sqlite3ExprLis
cd20: 74 41 70 70 65 6e 64 28 29 20 72 65 74 75 72 6e  tAppend() return
cd30: 73 0a 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20  s.** but is not 
cd40: 6e 65 63 65 73 73 61 72 69 6c 79 20 74 72 75 65  necessarily true
cd50: 20 66 72 6f 6d 20 74 68 65 20 72 65 74 75 72 6e   from the return
cd60: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
cd70: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a  3ExprListDup()..
cd80: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
cd90: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
cda0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65  or occurs, the e
cdb0: 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72  ntire list is fr
cdc0: 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20  eed and.** NULL 
cdd0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
cde0: 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74   non-NULL is ret
cdf0: 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69  urned, then it i
ce00: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
ce10: 74 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74  that the new ent
ce20: 72 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ry was successfu
ce30: 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f  lly appended..*/
ce40: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
ce50: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
ce60: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
ce70: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
ce80: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
ce90: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
cea0: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
ceb0: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
cec0: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
ced0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
cee0: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
cef0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
cf00: 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e   to be appended.
cf10: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
cf20: 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  /.){.  struct Ex
cf30: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
cf40: 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
cf50: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
cf60: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
cf70: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  );.  if( pList==
cf80: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
cf90: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
cfa0: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
cfb0: 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20  (ExprList) );.  
cfc0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
cfd0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
cfe0: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
cff0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b  List->nExpr = 0;
d000: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c  .  }else if( (pL
d010: 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c  ist->nExpr & (pL
d020: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d  ist->nExpr-1))==
d030: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  0 ){.    ExprLis
d040: 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65  t *pNew;.    pNe
d050: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
d060: 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 20  lloc(db, pList, 
d070: 0a 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66  .         sizeof
d080: 28 2a 70 4c 69 73 74 29 2b 28 32 2a 28 73 71 6c  (*pList)+(2*(sql
d090: 69 74 65 33 5f 69 6e 74 36 34 29 70 4c 69 73 74  ite3_int64)pList
d0a0: 2d 3e 6e 45 78 70 72 2d 31 29 2a 73 69 7a 65 6f  ->nExpr-1)*sizeo
d0b0: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
d0c0: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
d0d0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
d0e0: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
d0f0: 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20   pList = pNew;. 
d100: 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c   }.  pItem = &pL
d110: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
d120: 78 70 72 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74  xpr++];.  assert
d130: 28 20 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63  ( offsetof(struc
d140: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c  t ExprList_item,
d150: 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65 6f 66 28 70  zName)==sizeof(p
d160: 49 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 3b 0a  Item->pExpr) );.
d170: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
d180: 6f 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69  of(struct ExprLi
d190: 73 74 5f 69 74 65 6d 2c 70 45 78 70 72 29 3d 3d  st_item,pExpr)==
d1a0: 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  0 );.  memset(&p
d1b0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69  Item->zName,0,si
d1c0: 7a 65 6f 66 28 2a 70 49 74 65 6d 29 2d 6f 66 66  zeof(*pItem)-off
d1d0: 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70  setof(struct Exp
d1e0: 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65  rList_item,zName
d1f0: 29 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78  ));.  pItem->pEx
d200: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 72 65  pr = pExpr;.  re
d210: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f  turn pList;..no_
d220: 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41  mem:     .  /* A
d230: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
d240: 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61  ory if malloc ha
d250: 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73  s failed. */.  s
d260: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
d270: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73  (db, pExpr);.  s
d280: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
d290: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
d2a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
d2b0: 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61  /*.** pColumns a
d2c0: 6e 64 20 70 45 78 70 72 20 66 6f 72 6d 20 61 20  nd pExpr form a 
d2d0: 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e  vector assignmen
d2e0: 74 20 77 68 69 63 68 20 69 73 20 70 61 72 74 20  t which is part 
d2f0: 6f 66 20 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c  of the SET.** cl
d300: 61 75 73 65 20 6f 66 20 61 6e 20 55 50 44 41 54  ause of an UPDAT
d310: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69  E statement.  Li
d320: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
d330: 20 20 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20        (a,b,c) = 
d340: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
d350: 72 33 29 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61  r3).** Or:    (a
d360: 2c 62 2c 63 29 20 3d 20 28 53 45 4c 45 43 54 20  ,b,c) = (SELECT 
d370: 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29  x,y,z FROM ....)
d380: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  .**.** For each 
d390: 74 65 72 6d 20 6f 66 20 74 68 65 20 76 65 63 74  term of the vect
d3a0: 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61  or assignment, a
d3b0: 70 70 65 6e 64 20 6e 65 77 20 65 6e 74 72 69 65  ppend new entrie
d3c0: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72  s to the.** expr
d3d0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73  ession list pLis
d3e0: 74 2e 20 20 49 6e 20 74 68 65 20 63 61 73 65 20  t.  In the case 
d3f0: 6f 66 20 61 20 73 75 62 71 75 65 72 79 20 6f 6e  of a subquery on
d400: 20 74 68 65 20 52 48 53 2c 20 61 70 70 65 6e 64   the RHS, append
d410: 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  .** TK_SELECT_CO
d420: 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 73  LUMN expressions
d430: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
d440: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
d450: 70 65 6e 64 56 65 63 74 6f 72 28 0a 20 20 50 61  pendVector(.  Pa
d460: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
d470: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
d480: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
d490: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
d4a0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
d4b0: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
d4c0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
d4d0: 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75  .  IdList *pColu
d4e0: 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73  mns,      /* Lis
d4f0: 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48  t of names of LH
d500: 53 20 6f 66 20 74 68 65 20 61 73 73 69 67 6e 6d  S of the assignm
d510: 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ent */.  Expr *p
d520: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
d530: 2f 2a 20 56 65 63 74 6f 72 20 65 78 70 72 65 73  /* Vector expres
d540: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
d550: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
d560: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
d570: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d580: 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  >db;.  int n;.  
d590: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 46 69  int i;.  int iFi
d5a0: 72 73 74 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  rst = pList ? pL
d5b0: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  ist->nExpr : 0;.
d5c0: 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61    /* pColumns ca
d5d0: 6e 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64  n only be NULL d
d5e0: 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74  ue to an OOM but
d5f0: 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75   an OOM will cau
d600: 73 65 20 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20  se an.  ** exit 
d610: 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f  prior to this ro
d620: 75 74 69 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f  utine being invo
d630: 6b 65 64 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ked */.  if( NEV
d640: 45 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20  ER(pColumns==0) 
d650: 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70  ) goto vector_ap
d660: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66  pend_error;.  if
d670: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 67 6f 74  ( pExpr==0 ) got
d680: 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f  o vector_append_
d690: 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20  error;..  /* If 
d6a0: 74 68 65 20 52 48 53 20 69 73 20 61 20 76 65 63  the RHS is a vec
d6b0: 74 6f 72 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  tor, then we can
d6c0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 63 68 65   immediately che
d6d0: 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 0a  ck to see that .
d6e0: 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66    ** the size of
d6f0: 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53   the RHS and LHS
d700: 20 6d 61 74 63 68 2e 20 20 42 75 74 20 69 66 20   match.  But if 
d710: 74 68 65 20 52 48 53 20 69 73 20 61 20 53 45 4c  the RHS is a SEL
d720: 45 43 54 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63  ECT, .  ** wildc
d730: 61 72 64 73 20 28 22 2a 22 29 20 69 6e 20 74 68  ards ("*") in th
d740: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
d750: 74 68 65 20 53 45 4c 45 43 54 20 6d 75 73 74 20  the SELECT must 
d760: 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
d770: 72 65 0a 20 20 2a 2a 20 77 65 20 63 61 6e 20 64  re.  ** we can d
d780: 6f 20 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b  o the size check
d790: 2c 20 73 6f 20 64 65 66 65 72 20 74 68 65 20 73  , so defer the s
d7a0: 69 7a 65 20 63 68 65 63 6b 20 75 6e 74 69 6c 20  ize check until 
d7b0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e  code generation.
d7c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
d7d0: 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54  r->op!=TK_SELECT
d7e0: 20 26 26 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49   && pColumns->nI
d7f0: 64 21 3d 28 6e 3d 73 71 6c 69 74 65 33 45 78 70  d!=(n=sqlite3Exp
d800: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
d810: 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r)) ){.    sqlit
d820: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d830: 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61  e, "%d columns a
d840: 73 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65  ssigned %d value
d850: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
d860: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73          pColumns
d870: 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67  ->nId, n);.    g
d880: 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e  oto vector_appen
d890: 64 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  d_error;.  }..  
d8a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75  for(i=0; i<pColu
d8b0: 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  mns->nId; i++){.
d8c0: 20 20 20 20 45 78 70 72 20 2a 70 53 75 62 45 78      Expr *pSubEx
d8d0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
d8e0: 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70  ForVectorField(p
d8f0: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 69 29  Parse, pExpr, i)
d900: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
d910: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
d920: 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73  end(pParse, pLis
d930: 74 2c 20 70 53 75 62 45 78 70 72 29 3b 0a 20 20  t, pSubExpr);.  
d940: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
d950: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
d960: 73 74 2d 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73  st->nExpr==iFirs
d970: 74 2b 69 2b 31 20 29 3b 0a 20 20 20 20 20 20 70  t+i+1 );.      p
d980: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
d990: 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
d9a0: 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a  pColumns->a[i].z
d9b0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Name;.      pCol
d9c0: 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  umns->a[i].zName
d9d0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
d9e0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
d9f0: 6f 63 46 61 69 6c 65 64 20 26 26 20 70 45 78 70  ocFailed && pExp
da00: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
da10: 20 26 26 20 41 4c 57 41 59 53 28 70 4c 69 73 74   && ALWAYS(pList
da20: 21 3d 30 29 20 29 7b 0a 20 20 20 20 45 78 70 72  !=0) ){.    Expr
da30: 20 2a 70 46 69 72 73 74 20 3d 20 70 4c 69 73 74   *pFirst = pList
da40: 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70  ->a[iFirst].pExp
da50: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
da60: 46 69 72 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  First!=0 );.    
da70: 61 73 73 65 72 74 28 20 70 46 69 72 73 74 2d 3e  assert( pFirst->
da80: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op==TK_SELECT_CO
da90: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20  LUMN );.     .  
daa0: 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 53    /* Store the S
dab0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
dac0: 69 6e 20 70 52 69 67 68 74 20 73 6f 20 69 74 20  in pRight so it 
dad0: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20  will be deleted 
dae0: 77 68 65 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69  when.    ** sqli
daf0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
db00: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f  e() is called */
db10: 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 70 52 69  .    pFirst->pRi
db20: 67 68 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  ght = pExpr;.   
db30: 20 70 45 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20   pExpr = 0;..   
db40: 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65   /* Remember the
db50: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 4c 48 53   size of the LHS
db60: 20 69 6e 20 69 54 61 62 6c 65 20 73 6f 20 74 68   in iTable so th
db70: 61 74 20 77 65 20 63 61 6e 20 63 68 65 63 6b 20  at we can check 
db80: 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
db90: 52 48 53 20 61 6e 64 20 4c 48 53 20 73 69 7a 65  RHS and LHS size
dba0: 73 20 6d 61 74 63 68 20 64 75 72 69 6e 67 20 63  s match during c
dbb0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20  ode generation. 
dbc0: 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 69  */.    pFirst->i
dbd0: 54 61 62 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73  Table = pColumns
dbe0: 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74  ->nId;.  }..vect
dbf0: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a  or_append_error:
dc00: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 55 6e  .  sqlite3ExprUn
dc10: 6d 61 70 41 6e 64 44 65 6c 65 74 65 28 70 50 61  mapAndDelete(pPa
dc20: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 73  rse, pExpr);.  s
dc30: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
dc40: 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29  te(db, pColumns)
dc50: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
dc60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
dc70: 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 66 6f  he sort order fo
dc80: 72 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65  r the last eleme
dc90: 6e 74 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  nt on the given 
dca0: 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ExprList..*/.voi
dcb0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
dcc0: 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 45 78  tSetSortOrder(Ex
dcd0: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 69  prList *p, int i
dce0: 53 6f 72 74 4f 72 64 65 72 2c 20 69 6e 74 20 65  SortOrder, int e
dcf0: 4e 75 6c 6c 73 29 7b 0a 20 20 73 74 72 75 63 74  Nulls){.  struct
dd00: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
dd10: 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 3d 3d  pItem;.  if( p==
dd20: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
dd30: 73 65 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30  sert( p->nExpr>0
dd40: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53   );..  assert( S
dd50: 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e  QLITE_SO_UNDEFIN
dd60: 45 44 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53  ED<0 && SQLITE_S
dd70: 4f 5f 41 53 43 3d 3d 30 20 26 26 20 53 51 4c 49  O_ASC==0 && SQLI
dd80: 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a  TE_SO_DESC>0 );.
dd90: 20 20 61 73 73 65 72 74 28 20 69 53 6f 72 74 4f    assert( iSortO
dda0: 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder==SQLITE_SO_
ddb0: 55 4e 44 45 46 49 4e 45 44 20 0a 20 20 20 20 20  UNDEFINED .     
ddc0: 20 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d    || iSortOrder=
ddd0: 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 0a  =SQLITE_SO_ASC .
dde0: 20 20 20 20 20 20 20 7c 7c 20 69 53 6f 72 74 4f         || iSortO
ddf0: 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder==SQLITE_SO_
de00: 44 45 53 43 20 0a 20 20 29 3b 0a 20 20 61 73 73  DESC .  );.  ass
de10: 65 72 74 28 20 65 4e 75 6c 6c 73 3d 3d 53 51 4c  ert( eNulls==SQL
de20: 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44  ITE_SO_UNDEFINED
de30: 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 75 6c   .       || eNul
de40: 6c 73 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  ls==SQLITE_SO_AS
de50: 43 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 75  C .       || eNu
de60: 6c 6c 73 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 44  lls==SQLITE_SO_D
de70: 45 53 43 20 0a 20 20 29 3b 0a 0a 20 20 70 49 74  ESC .  );..  pIt
de80: 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45  em = &p->a[p->nE
de90: 78 70 72 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74  xpr-1];.  assert
dea0: 28 20 70 49 74 65 6d 2d 3e 62 4e 75 6c 6c 73 3d  ( pItem->bNulls=
deb0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f 72  =0 );.  if( iSor
dec0: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
ded0: 4f 5f 55 4e 44 45 46 49 4e 45 44 20 29 7b 0a 20  O_UNDEFINED ){. 
dee0: 20 20 20 69 53 6f 72 74 4f 72 64 65 72 20 3d 20     iSortOrder = 
def0: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 0a 20  SQLITE_SO_ASC;. 
df00: 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74   }.  pItem->sort
df10: 46 6c 61 67 73 20 3d 20 28 75 38 29 69 53 6f 72  Flags = (u8)iSor
df20: 74 4f 72 64 65 72 3b 0a 0a 20 20 69 66 28 20 65  tOrder;..  if( e
df30: 4e 75 6c 6c 73 21 3d 53 51 4c 49 54 45 5f 53 4f  Nulls!=SQLITE_SO
df40: 5f 55 4e 44 45 46 49 4e 45 44 20 29 7b 0a 20 20  _UNDEFINED ){.  
df50: 20 20 70 49 74 65 6d 2d 3e 62 4e 75 6c 6c 73 20    pItem->bNulls 
df60: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 69 53 6f  = 1;.    if( iSo
df70: 72 74 4f 72 64 65 72 21 3d 65 4e 75 6c 6c 73 20  rtOrder!=eNulls 
df80: 29 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  ){.      pItem->
df90: 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 4b 45 59  sortFlags |= KEY
dfa0: 49 4e 46 4f 5f 4f 52 44 45 52 5f 42 49 47 4e 55  INFO_ORDER_BIGNU
dfb0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  LL;.    }.  }.}.
dfc0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
dfd0: 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  xprList.a[].zNam
dfe0: 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  e element of the
dff0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
e000: 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20  dded item.** on 
e010: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
e020: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ist..**.** pList
e030: 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66   might be NULL f
e040: 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20  ollowing an OOM 
e050: 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d  error.  But pNam
e060: 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
e070: 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61  e.** NULL.  If a
e080: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
e090: 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50  on fails, the pP
e0a0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
e0b0: 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69  Failed flag.** i
e0c0: 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  s set..*/.void s
e0d0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
e0e0: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
e0f0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
e100: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
e110: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
e120: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
e130: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
e140: 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61  h to add the spa
e150: 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  n. */.  Token *p
e160: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
e170: 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64  /* Name to be ad
e180: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71  ded */.  int deq
e190: 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20  uote            
e1a0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73   /* True to caus
e1b0: 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65  e the name to be
e1c0: 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a   dequoted */.){.
e1d0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
e1e0: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
e1f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
e200: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
e210: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
e220: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
e230: 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  tem;.    assert(
e240: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
e250: 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26  );.    pItem = &
e260: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
e270: 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73  nExpr-1];.    as
e280: 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61  sert( pItem->zNa
e290: 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74  me==0 );.    pIt
e2a0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
e2b0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 50 61  te3DbStrNDup(pPa
e2c0: 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e  rse->db, pName->
e2d0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
e2e0: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 29 20    if( dequote ) 
e2f0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70  sqlite3Dequote(p
e300: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
e310: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
e320: 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20  OBJECT ){.      
e330: 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
e340: 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76  enMap(pParse, (v
e350: 6f 69 64 2a 29 70 49 74 65 6d 2d 3e 7a 4e 61 6d  oid*)pItem->zNam
e360: 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, pName);.    }
e370: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
e380: 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  t the ExprList.a
e390: 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74  [].zSpan element
e3a0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
e3b0: 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d  ently added item
e3c0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65  .** on the expre
e3d0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
e3e0: 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65  * pList might be
e3f0: 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20   NULL following 
e400: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
e410: 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20  ut pSpan should 
e420: 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c  never be.** NULL
e430: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
e440: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
e450: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d   the pParse->db-
e460: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
e470: 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f  ag.** is set..*/
e480: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
e490: 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20  rListSetSpan(.  
e4a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e4b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e4c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e4d0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
e4e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
e4f0: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20  to which to add 
e500: 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 63  the span. */.  c
e510: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72  onst char *zStar
e520: 74 2c 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20  t,     /* Start 
e530: 6f 66 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 20  of the span */. 
e540: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
e550: 64 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  d        /* End 
e560: 6f 66 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 29  of the span */.)
e570: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
e580: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
e590: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
e5a0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
e5b0: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
e5c0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
e5d0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
e5e0: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69  em *pItem = &pLi
e5f0: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
e600: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
e610: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
e620: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
e630: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
e640: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
e650: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
e660: 69 74 65 33 44 62 53 70 61 6e 44 75 70 28 64 62  ite3DbSpanDup(db
e670: 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b  , zStart, zEnd);
e680: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
e690: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e6a0: 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74  list pEList cont
e6b0: 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69  ains more than i
e6c0: 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a  Limit elements,.
e6d0: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
e6e0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
e6f0: 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rse..*/.void sql
e700: 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
e710: 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65  kLength(.  Parse
e720: 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72   *pParse,.  Expr
e730: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20  List *pEList,.  
e740: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a  const char *zObj
e750: 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20  ect.){.  int mx 
e760: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
e770: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
e780: 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73  T_COLUMN];.  tes
e790: 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26  tcase( pEList &&
e7a0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
e7b0: 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  mx );.  testcase
e7c0: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
e7d0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20  st->nExpr==mx+1 
e7e0: 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
e7f0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
e800: 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >mx ){.    sqlit
e810: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
e820: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
e830: 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62  umns in %s", zOb
e840: 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ject);.  }.}../*
e850: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
e860: 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tire expression 
e870: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
e880: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
e890: 76 6f 69 64 20 65 78 70 72 4c 69 73 74 44 65 6c  void exprListDel
e8a0: 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64  eteNN(sqlite3 *d
e8b0: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
e8c0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70  st){.  int i = p
e8d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73  List->nExpr;.  s
e8e0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
e8f0: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 20 70 4c  tem *pItem =  pL
e900: 69 73 74 2d 3e 61 3b 0a 20 20 61 73 73 65 72 74  ist->a;.  assert
e910: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
e920: 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71   );.  do{.    sq
e930: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
e940: 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  db, pItem->pExpr
e950: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
e960: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
e970: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
e980: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
e990: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20  tem->zSpan);.   
e9a0: 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 7d 77 68 69   pItem++;.  }whi
e9b0: 6c 65 28 20 2d 2d 69 3e 30 20 29 3b 0a 20 20 73  le( --i>0 );.  s
e9c0: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
e9d0: 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69  b, pList);.}.voi
e9e0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
e9f0: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
ea00: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
ea10: 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69  List){.  if( pLi
ea20: 73 74 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c  st ) exprListDel
ea30: 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29  eteNN(db, pList)
ea40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ea50: 6e 20 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52  n the bitwise-OR
ea60: 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61   of all Expr.fla
ea70: 67 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  gs fields in the
ea80: 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69   given.** ExprLi
ea90: 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  st..*/.u32 sqlit
eaa0: 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28  e3ExprListFlags(
eab0: 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a  const ExprList *
eac0: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
ead0: 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20  .  u32 m = 0;.  
eae0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
eaf0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
eb00: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
eb10: 2b 2b 29 7b 0a 20 20 20 20 20 45 78 70 72 20 2a  ++){.     Expr *
eb20: 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
eb30: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
eb40: 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30  assert( pExpr!=0
eb50: 20 29 3b 0a 20 20 20 20 20 6d 20 7c 3d 20 70 45   );.     m |= pE
eb60: 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a  xpr->flags;.  }.
eb70: 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f    return m;.}../
eb80: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 53  *.** This is a S
eb90: 45 4c 45 43 54 2d 6e 6f 64 65 20 63 61 6c 6c 62  ELECT-node callb
eba0: 61 63 6b 20 66 6f 72 20 74 68 65 20 65 78 70 72  ack for the expr
ebb0: 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72 20 74 68  ession walker th
ebc0: 61 74 0a 2a 2a 20 61 6c 77 61 79 73 20 22 66 61  at.** always "fa
ebd0: 69 6c 73 22 2e 20 20 42 79 20 22 66 61 69 6c 22  ils".  By "fail"
ebe0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 77   in this case, w
ebf0: 65 20 6d 65 61 6e 20 73 65 74 0a 2a 2a 20 70 57  e mean set.** pW
ec00: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20  alker->eCode to 
ec10: 7a 65 72 6f 20 61 6e 64 20 61 62 6f 72 74 2e 0a  zero and abort..
ec20: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62  **.** This callb
ec30: 61 63 6b 20 69 73 20 75 73 65 64 20 62 79 20 6d  ack is used by m
ec40: 75 6c 74 69 70 6c 65 20 65 78 70 72 65 73 73 69  ultiple expressi
ec50: 6f 6e 20 77 61 6c 6b 65 72 73 2e 0a 2a 2f 0a 69  on walkers..*/.i
ec60: 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
ec70: 57 61 6c 6b 46 61 69 6c 28 57 61 6c 6b 65 72 20  WalkFail(Walker 
ec80: 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
ec90: 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
eca0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
ecb0: 6f 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b  otUsed);.  pWalk
ecc0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
ecd0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
ece0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  t;.}../*.** If t
ecf0: 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73 73  he input express
ed00: 69 6f 6e 20 69 73 20 61 6e 20 49 44 20 77 69 74  ion is an ID wit
ed10: 68 20 74 68 65 20 6e 61 6d 65 20 22 74 72 75 65  h the name "true
ed20: 22 20 6f 72 20 22 66 61 6c 73 65 22 0a 2a 2a 20  " or "false".** 
ed30: 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 69 74 20  then convert it 
ed40: 69 6e 74 6f 20 61 6e 20 54 4b 5f 54 52 55 45 46  into an TK_TRUEF
ed50: 41 4c 53 45 20 74 65 72 6d 2e 20 20 52 65 74 75  ALSE term.  Retu
ed60: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a  rn non-zero if.*
ed70: 2a 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  * the conversion
ed80: 20 68 61 70 70 65 6e 65 64 2c 20 61 6e 64 20 7a   happened, and z
ed90: 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
eda0: 73 73 69 6f 6e 20 69 73 20 75 6e 61 6c 74 65 72  ssion is unalter
edb0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
edc0: 65 33 45 78 70 72 49 64 54 6f 54 72 75 65 46 61  e3ExprIdToTrueFa
edd0: 6c 73 65 28 45 78 70 72 20 2a 70 45 78 70 72 29  lse(Expr *pExpr)
ede0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  {.  assert( pExp
edf0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20  r->op==TK_ID || 
ee00: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  pExpr->op==TK_ST
ee10: 52 49 4e 47 20 29 3b 0a 20 20 69 66 28 20 21 45  RING );.  if( !E
ee20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
ee30: 45 78 70 72 2c 20 45 50 5f 51 75 6f 74 65 64 29  Expr, EP_Quoted)
ee40: 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 53  .   && (sqlite3S
ee50: 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e  trICmp(pExpr->u.
ee60: 7a 54 6f 6b 65 6e 2c 20 22 74 72 75 65 22 29 3d  zToken, "true")=
ee70: 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
ee80: 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
ee90: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61  r->u.zToken, "fa
eea0: 6c 73 65 22 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  lse")==0).  ){. 
eeb0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
eec0: 4b 5f 54 52 55 45 46 41 4c 53 45 3b 0a 20 20 20  K_TRUEFALSE;.   
eed0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
eee0: 28 70 45 78 70 72 2c 20 70 45 78 70 72 2d 3e 75  (pExpr, pExpr->u
eef0: 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 20 3f 20  .zToken[4]==0 ? 
ef00: 45 50 5f 49 73 54 72 75 65 20 3a 20 45 50 5f 49  EP_IsTrue : EP_I
ef10: 73 46 61 6c 73 65 29 3b 0a 20 20 20 20 72 65 74  sFalse);.    ret
ef20: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
ef30: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
ef40: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  The argument mus
ef50: 74 20 62 65 20 61 20 54 4b 5f 54 52 55 45 46 41  t be a TK_TRUEFA
ef60: 4c 53 45 20 45 78 70 72 20 6e 6f 64 65 2e 20 20  LSE Expr node.  
ef70: 52 65 74 75 72 6e 20 31 20 69 66 20 69 74 20 69  Return 1 if it i
ef80: 73 20 54 52 55 45 0a 2a 2a 20 61 6e 64 20 30 20  s TRUE.** and 0 
ef90: 69 66 20 69 74 20 69 73 20 46 41 4c 53 45 2e 0a  if it is FALSE..
efa0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
efb0: 70 72 54 72 75 74 68 56 61 6c 75 65 28 63 6f 6e  prTruthValue(con
efc0: 73 74 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  st Expr *pExpr){
efd0: 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
efe0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
eff0: 65 28 28 45 78 70 72 2a 29 70 45 78 70 72 29 3b  e((Expr*)pExpr);
f000: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
f010: 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c  ->op==TK_TRUEFAL
f020: 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  SE );.  assert( 
f030: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
f040: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
f050: 74 72 75 65 22 29 3d 3d 30 0a 20 20 20 20 20 20  true")==0.      
f060: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
f070: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
f080: 65 6e 2c 22 66 61 6c 73 65 22 29 3d 3d 30 20 29  en,"false")==0 )
f090: 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72  ;.  return pExpr
f0a0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30  ->u.zToken[4]==0
f0b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45  ;.}../*.** If pE
f0c0: 78 70 72 20 69 73 20 61 6e 20 41 4e 44 20 6f 72  xpr is an AND or
f0d0: 20 4f 52 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   OR expression, 
f0e0: 74 72 79 20 74 6f 20 73 69 6d 70 6c 69 66 79 20  try to simplify 
f0f0: 69 74 20 62 79 20 65 6c 69 6d 69 6e 61 74 69 6e  it by eliminatin
f100: 67 0a 2a 2a 20 74 65 72 6d 73 20 74 68 61 74 20  g.** terms that 
f110: 61 72 65 20 61 6c 77 61 79 73 20 74 72 75 65 20  are always true 
f120: 6f 72 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72  or false.  Retur
f130: 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64  n the simplified
f140: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
f150: 4f 72 20 72 65 74 75 72 6e 20 74 68 65 20 6f 72  Or return the or
f160: 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f  iginal expressio
f170: 6e 20 69 66 20 6e 6f 20 73 69 6d 70 6c 69 66 69  n if no simplifi
f180: 63 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62  cation is possib
f190: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  le..**.** Exampl
f1a0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 78  es:.**.**     (x
f1b0: 3c 31 30 29 20 41 4e 44 20 74 72 75 65 20 20 20  <10) AND true   
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20               => 
f1d0: 20 20 28 78 3c 31 30 29 0a 2a 2a 20 20 20 20 20    (x<10).**     
f1e0: 28 78 3c 31 30 29 20 41 4e 44 20 66 61 6c 73 65  (x<10) AND false
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d                 =
f200: 3e 20 20 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  >   false.**    
f210: 20 28 78 3c 31 30 29 20 41 4e 44 20 28 79 3d 32   (x<10) AND (y=2
f220: 32 20 4f 52 20 66 61 6c 73 65 29 20 20 20 20 20  2 OR false)     
f230: 3d 3e 20 20 20 28 78 3c 31 30 29 20 41 4e 44 20  =>   (x<10) AND 
f240: 28 79 3d 32 32 29 0a 2a 2a 20 20 20 20 20 28 78  (y=22).**     (x
f250: 3c 31 30 29 20 41 4e 44 20 28 79 3d 32 32 20 4f  <10) AND (y=22 O
f260: 52 20 74 72 75 65 29 20 20 20 20 20 20 3d 3e 20  R true)      => 
f270: 20 20 28 78 3c 31 30 29 0a 2a 2a 20 20 20 20 20    (x<10).**     
f280: 28 79 3d 32 32 29 20 4f 52 20 74 72 75 65 20 20  (y=22) OR true  
f290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d                 =
f2a0: 3e 20 20 20 74 72 75 65 0a 2a 2f 0a 45 78 70 72  >   true.*/.Expr
f2b0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53 69 6d   *sqlite3ExprSim
f2c0: 70 6c 69 66 69 65 64 41 6e 64 4f 72 28 45 78 70  plifiedAndOr(Exp
f2d0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73  r *pExpr){.  ass
f2e0: 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
f2f0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
f300: 3d 3d 54 4b 5f 41 4e 44 20 7c 7c 20 70 45 78 70  ==TK_AND || pExp
f310: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a  r->op==TK_OR ){.
f320: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
f330: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 69   = sqlite3ExprSi
f340: 6d 70 6c 69 66 69 65 64 41 6e 64 4f 72 28 70 45  mplifiedAndOr(pE
f350: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
f360: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
f370: 73 71 6c 69 74 65 33 45 78 70 72 53 69 6d 70 6c  sqlite3ExprSimpl
f380: 69 66 69 65 64 41 6e 64 4f 72 28 70 45 78 70 72  ifiedAndOr(pExpr
f390: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  ->pLeft);.    if
f3a0: 28 20 45 78 70 72 41 6c 77 61 79 73 54 72 75 65  ( ExprAlwaysTrue
f3b0: 28 70 4c 65 66 74 29 20 7c 7c 20 45 78 70 72 41  (pLeft) || ExprA
f3c0: 6c 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68  lwaysFalse(pRigh
f3d0: 74 29 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  t) ){.      pExp
f3e0: 72 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  r = pExpr->op==T
f3f0: 4b 5f 41 4e 44 20 3f 20 70 52 69 67 68 74 20 3a  K_AND ? pRight :
f400: 20 70 4c 65 66 74 3b 0a 20 20 20 20 7d 65 6c 73   pLeft;.    }els
f410: 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73  e if( ExprAlways
f420: 54 72 75 65 28 70 52 69 67 68 74 29 20 7c 7c 20  True(pRight) || 
f430: 45 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  ExprAlwaysFalse(
f440: 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20  pLeft) ){.      
f450: 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 6f  pExpr = pExpr->o
f460: 70 3d 3d 54 4b 5f 41 4e 44 20 3f 20 70 4c 65 66  p==TK_AND ? pLef
f470: 74 20 3a 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t : pRight;.    
f480: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
f490: 45 78 70 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Expr;.}.../*.** 
f4a0: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
f4b0: 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61  re Walker callba
f4c0: 63 6b 73 20 75 73 65 64 20 74 6f 20 63 68 65 63  cks used to chec
f4d0: 6b 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f  k expressions to
f4e0: 0a 2a 2a 20 73 65 65 20 69 66 20 74 68 65 79 20  .** see if they 
f4f0: 61 72 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66  are "constant" f
f500: 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69  or some definiti
f510: 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20  on of constant. 
f520: 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65   The.** Walker.e
f530: 43 6f 64 65 20 76 61 6c 75 65 20 64 65 74 65 72  Code value deter
f540: 6d 69 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f  mines the type o
f550: 66 20 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20  f "constant" we 
f560: 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66  are looking.** f
f570: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  or..**.** These 
f580: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
f590: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d  s are used to im
f5a0: 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c  plement the foll
f5b0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
f5c0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
f5d0: 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20  nstant()        
f5e0: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
f5f0: 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20  r->eCode==1.**  
f600: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
f610: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
f620: 29 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c  )           pWal
f630: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a  ker->eCode==2.**
f640: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f650: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
f660: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57  )             pW
f670: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a  alker->eCode==3.
f680: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
f690: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
f6a0: 6e 63 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20  nction()        
f6b0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
f6c0: 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20  4 or 5.**.** In 
f6d0: 61 6c 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63  all cases, the c
f6e0: 61 6c 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c  allbacks set Wal
f6f0: 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20  ker.eCode=0 and 
f700: 61 62 6f 72 74 20 69 66 20 74 68 65 20 65 78 70  abort if the exp
f710: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f  ression.** is fo
f720: 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20  und to not be a 
f730: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20  constant..**.** 
f740: 54 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 49  The sqlite3ExprI
f750: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
f760: 69 6f 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f  ion() is used fo
f770: 72 20 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70  r evaluating exp
f780: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61  ressions.** in a
f790: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
f7a0: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61  atement.  The Wa
f7b0: 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65  lker.eCode value
f7c0: 20 69 73 20 35 20 77 68 65 6e 20 70 61 72 73 69   is 5 when parsi
f7d0: 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e  ng.** an existin
f7e0: 67 20 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77  g schema and 4 w
f7f0: 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  hen processing a
f800: 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20   new statement. 
f810: 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61   A bound.** para
f820: 6d 65 74 65 72 20 72 61 69 73 65 73 20 61 6e 20  meter raises an 
f830: 65 72 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74  error for new st
f840: 61 74 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73  atements, but is
f850: 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72   silently conver
f860: 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66  ted.** to NULL f
f870: 6f 72 20 65 78 69 73 74 69 6e 67 20 73 63 68 65  or existing sche
f880: 6d 61 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77  mas.  This allow
f890: 73 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  s sqlite_master 
f8a0: 74 61 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20  tables that .** 
f8b0: 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20  contain a bound 
f8c0: 70 61 72 61 6d 65 74 65 72 20 62 65 63 61 75 73  parameter becaus
f8d0: 65 20 74 68 65 79 20 77 65 72 65 20 67 65 6e 65  e they were gene
f8e0: 72 61 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76  rated by older v
f8f0: 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  ersions.** of SQ
f900: 4c 69 74 65 20 74 6f 20 62 65 20 70 61 72 73 65  Lite to be parse
f910: 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69  d by newer versi
f920: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69  ons of SQLite wi
f930: 74 68 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a  thout raising a.
f940: 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68  ** malformed sch
f950: 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74  ema error..*/.st
f960: 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
f970: 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b  eIsConstant(Walk
f980: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
f990: 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a  r *pExpr){..  /*
f9a0: 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f   If pWalker->eCo
f9b0: 64 65 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79  de is 2 then any
f9c0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70   term of the exp
f9d0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d  ression that com
f9e0: 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  es from.  ** the
f9f0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
fa00: 75 73 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a  uses of a left j
fa10: 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73  oin disqualifies
fa20: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
fa30: 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20    ** from being 
fa40: 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74  considered const
fa50: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57  ant. */.  if( pW
fa60: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20  alker->eCode==2 
fa70: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
fa80: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
fa90: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57  mJoin) ){.    pW
faa0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
fab0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
fac0: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73  _Abort;.  }..  s
fad0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
fae0: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69   ){.    /* Consi
faf0: 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  der functions to
fb00: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20   be constant if 
fb10: 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65  all their argume
fb20: 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  nts are constant
fb30: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68  .    ** and eith
fb40: 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  er pWalker->eCod
fb50: 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65  e==4 or 5 or the
fb60: 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68   function has th
fb70: 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  e.    ** SQLITE_
fb80: 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e  FUNC_CONST flag.
fb90: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
fba0: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
fbb0: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
fbc0: 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73  de>=4 || ExprHas
fbd0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45  Property(pExpr,E
fbe0: 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a  P_ConstFunc) ){.
fbf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
fc00: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
fc10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fc20: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
fc30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
fc40: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
fc50: 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65        }.    case
fc60: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 20 20 2f 2a   TK_ID:.      /*
fc70: 20 43 6f 6e 76 65 72 74 20 22 74 72 75 65 22 20   Convert "true" 
fc80: 6f 72 20 22 66 61 6c 73 65 22 20 69 6e 20 61 20  or "false" in a 
fc90: 44 45 46 41 55 4c 54 20 63 6c 61 75 73 65 20 69  DEFAULT clause i
fca0: 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  nto the.      **
fcb0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 54 4b 5f   appropriate TK_
fcc0: 54 52 55 45 46 41 4c 53 45 20 6f 70 65 72 61 74  TRUEFALSE operat
fcd0: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  or */.      if( 
fce0: 73 71 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54  sqlite3ExprIdToT
fcf0: 72 75 65 46 61 6c 73 65 28 70 45 78 70 72 29 20  rueFalse(pExpr) 
fd00: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
fd10: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
fd20: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
fd30: 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
fd40: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
fd50: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
fd60: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
fd70: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
fd80: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
fd90: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
fda0: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
fdb0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
fdc0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
fdd0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
fde0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
fdf0: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
fe00: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
fe10: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
fe20: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  UMN );.      if(
fe30: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
fe40: 28 70 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64  (pExpr, EP_Fixed
fe50: 43 6f 6c 29 20 26 26 20 70 57 61 6c 6b 65 72 2d  Col) && pWalker-
fe60: 3e 65 43 6f 64 65 21 3d 32 20 29 7b 0a 20 20 20  >eCode!=2 ){.   
fe70: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
fe80: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  Continue;.      
fe90: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  }.      if( pWal
fea0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26  ker->eCode==3 &&
feb0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
fec0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20  pWalker->u.iCur 
fed0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
fee0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
fef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
ff00: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
ff10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f  .    case TK_IF_
ff20: 4e 55 4c 4c 5f 52 4f 57 3a 0a 20 20 20 20 63 61  NULL_ROW:.    ca
ff30: 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 0a  se TK_REGISTER:.
ff40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ff50: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  pExpr->op==TK_RE
ff60: 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20  GISTER );.      
ff70: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
ff80: 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  >op==TK_IF_NULL_
ff90: 52 4f 57 20 29 3b 0a 20 20 20 20 20 20 70 57 61  ROW );.      pWa
ffa0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
ffb0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
ffc0: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 63 61 73  C_Abort;.    cas
ffd0: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20  e TK_VARIABLE:. 
ffe0: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
fff0: 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20  ->eCode==5 ){.  
10000 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c        /* Silentl
10010 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20  y convert bound 
10020 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
10030 61 70 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66  appear inside of
10040 20 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 20   CREATE.        
10050 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ** statements in
10060 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70  to a NULL when p
10070 61 72 73 69 6e 67 20 74 68 65 20 43 52 45 41 54  arsing the CREAT
10080 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74  E statement text
10090 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   out.        ** 
100a0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  of the sqlite_ma
100b0 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
100c0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
100d0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  = TK_NULL;.     
100e0 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b   }else if( pWalk
100f0 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a  er->eCode==4 ){.
10100 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75          /* A bou
10110 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20  nd parameter in 
10120 61 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  a CREATE stateme
10130 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  nt that originat
10140 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20  es from.        
10150 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ** sqlite3_prepa
10160 72 65 28 29 20 63 61 75 73 65 73 20 61 6e 20 65  re() causes an e
10170 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
10180 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
10190 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
101a0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
101b0 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
101c0 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
101d0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
101e0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
101f0 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
10200 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65   ); /* sqlite3Se
10210 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64  lectWalkFail() d
10220 69 73 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20  isallows */.    
10230 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
10240 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
10250 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65   ); /* sqlite3Se
10260 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64  lectWalkFail() d
10270 69 73 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20  isallows */.    
10280 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
10290 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61  tinue;.  }.}.sta
102a0 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f  tic int exprIsCo
102b0 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  nst(Expr *p, int
102c0 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69   initFlag, int i
102d0 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  Cur){.  Walker w
102e0 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e  ;.  w.eCode = in
102f0 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70  itFlag;.  w.xExp
10300 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
10310 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
10320 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
10330 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ack = sqlite3Sel
10340 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66  ectWalkFail;.#if
10350 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
10360 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
10370 62 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53  back2 = sqlite3S
10380 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32  electWalkAssert2
10390 3b 0a 23 65 6e 64 69 66 0a 20 20 77 2e 75 2e 69  ;.#endif.  w.u.i
103a0 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71  Cur = iCur;.  sq
103b0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
103c0 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
103d0 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .eCode;.}../*.**
103e0 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
103f0 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
10400 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
10410 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10420 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
10430 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
10440 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
10450 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a  nction calls..**
10460 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
10470 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
10480 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
10490 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
104a0 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
104b0 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
104c0 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
104d0 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
104e0 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
104f0 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
10500 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
10510 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
10520 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
10530 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c  xprIsConst(p, 1,
10540 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   0);.}../*.** Wa
10550 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
10560 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
10570 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a 0a 2a 2a  on-zero if.**.**
10580 20 20 20 28 31 29 20 74 68 65 20 65 78 70 72 65     (1) the expre
10590 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
105a0 74 2c 20 61 6e 64 0a 2a 2a 20 20 20 28 32 29 20  t, and.**   (2) 
105b0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 64  the expression d
105c0 6f 65 73 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  oes originate in
105d0 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
105e0 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20   clause.**      
105f0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
10600 20 61 6e 64 0a 2a 2a 20 20 20 28 33 29 20 74 68   and.**   (3) th
10610 65 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  e expression doe
10620 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
10630 79 20 45 50 5f 46 69 78 65 64 43 6f 6c 20 54 4b  y EP_FixedCol TK
10640 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 20 20 20 20 20  _COLUMN.**      
10650 20 6f 70 65 72 61 6e 64 73 20 63 72 65 61 74 65   operands create
10660 64 20 62 79 20 74 68 65 20 63 6f 6e 73 74 61 6e  d by the constan
10670 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70  t propagation op
10680 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  timization..**.*
10690 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
106a0 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65  ine returns true
106b0 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 74  , it indicates t
106c0 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
106d0 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 61 64 64  on.** can be add
106e0 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  ed to the pParse
106f0 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73  ->pConstExpr lis
10700 74 20 61 6e 64 20 65 76 61 6c 75 61 74 65 64 20  t and evaluated 
10710 6f 6e 63 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65  once when.** the
10720 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
10730 65 6e 74 20 73 74 61 72 74 73 20 75 70 2e 20 20  ent starts up.  
10740 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  See sqlite3ExprC
10750 6f 64 65 41 74 49 6e 69 74 28 29 2e 0a 2a 2f 0a  odeAtInit()..*/.
10760 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
10770 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
10780 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
10790 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
107a0 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  p, 2, 0);.}../*.
107b0 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
107c0 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
107d0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
107e0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
107f0 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f  s constant.** fo
10800 72 20 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77  r any single row
10810 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 69   of the table wi
10820 74 68 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20  th cursor iCur. 
10830 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
10840 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
10850 6f 6e 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65  on must not refe
10860 72 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74  r to any non-det
10870 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74  erministic funct
10880 69 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74  ion nor any.** t
10890 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  able other than 
108a0 69 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iCur..*/.int sql
108b0 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43  ite3ExprIsTableC
108c0 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c  onstant(Expr *p,
108d0 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65   int iCur){.  re
108e0 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
108f0 28 70 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a  (p, 3, iCur);.}.
10900 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57  ../*.** sqlite3W
10910 61 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61  alkExpr() callba
10920 63 6b 20 75 73 65 64 20 62 79 20 73 71 6c 69 74  ck used by sqlit
10930 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
10940 4f 72 47 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a  OrGroupBy()..*/.
10950 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e  static int exprN
10960 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47  odeIsConstantOrG
10970 72 6f 75 70 42 79 28 57 61 6c 6b 65 72 20 2a 70  roupBy(Walker *p
10980 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
10990 78 70 72 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  xpr){.  ExprList
109a0 20 2a 70 47 72 6f 75 70 42 79 20 3d 20 70 57 61   *pGroupBy = pWa
109b0 6c 6b 65 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79  lker->u.pGroupBy
109c0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
109d0 20 43 68 65 63 6b 20 69 66 20 70 45 78 70 72 20   Check if pExpr 
109e0 69 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20  is identical to 
109f0 61 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65 72  any GROUP BY ter
10a00 6d 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64  m. If so, consid
10a10 65 72 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74  er.  ** it const
10a20 61 6e 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ant.  */.  for(i
10a30 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; i<pGroupBy->
10a40 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
10a50 20 45 78 70 72 20 2a 70 20 3d 20 70 47 72 6f 75   Expr *p = pGrou
10a60 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  pBy->a[i].pExpr;
10a70 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10a80 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70  ExprCompare(0, p
10a90 45 78 70 72 2c 20 70 2c 20 2d 31 29 3c 32 20 29  Expr, p, -1)<2 )
10aa0 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
10ab0 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
10ac0 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57  ExprNNCollSeq(pW
10ad0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70  alker->pParse, p
10ae0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
10af0 69 74 65 33 49 73 42 69 6e 61 72 79 28 70 43 6f  ite3IsBinary(pCo
10b00 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ll) ){.        r
10b10 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
10b20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10b30 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
10b40 66 20 70 45 78 70 72 20 69 73 20 61 20 73 75 62  f pExpr is a sub
10b50 2d 73 65 6c 65 63 74 2e 20 49 66 20 73 6f 2c 20  -select. If so, 
10b60 63 6f 6e 73 69 64 65 72 20 69 74 20 76 61 72 69  consider it vari
10b70 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 45  able. */.  if( E
10b80 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
10b90 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
10ba0 63 74 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b  ct) ){.    pWalk
10bb0 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
10bc0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
10bd0 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ort;.  }..  retu
10be0 72 6e 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  rn exprNodeIsCon
10bf0 73 74 61 6e 74 28 70 57 61 6c 6b 65 72 2c 20 70  stant(pWalker, p
10c00 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
10c10 57 61 6c 6b 20 74 68 65 20 65 78 70 72 65 73 73  Walk the express
10c20 69 6f 6e 20 74 72 65 65 20 70 61 73 73 65 64 20  ion tree passed 
10c30 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
10c40 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 6e 6f  ument. Return no
10c50 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 66 20 74 68 65  n-zero.** if the
10c60 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 73   expression cons
10c70 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
10c80 20 63 6f 6e 73 74 61 6e 74 73 20 6f 72 20 63 6f   constants or co
10c90 70 69 65 73 20 6f 66 20 74 65 72 6d 73 20 0a 2a  pies of terms .*
10ca0 2a 20 69 6e 20 70 47 72 6f 75 70 42 79 20 74 68  * in pGroupBy th
10cb0 61 74 20 73 6f 72 74 20 77 69 74 68 20 74 68 65  at sort with the
10cc0 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f   BINARY collatio
10cd0 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  n sequence..**.*
10ce0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10cf0 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
10d00 69 6e 65 20 69 66 20 61 20 74 65 72 6d 20 6f 66  ine if a term of
10d10 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
10d20 73 65 20 63 61 6e 0a 2a 2a 20 62 65 20 70 72 6f  se can.** be pro
10d30 6d 6f 74 65 64 20 69 6e 74 6f 20 74 68 65 20 57  moted into the W
10d40 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 49 6e  HERE clause.  In
10d50 20 6f 72 64 65 72 20 66 6f 72 20 73 75 63 68 20   order for such 
10d60 61 20 70 72 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77  a promotion to w
10d70 6f 72 6b 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ork,.** the valu
10d80 65 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20  e of the HAVING 
10d90 63 6c 61 75 73 65 20 74 65 72 6d 20 6d 75 73 74  clause term must
10da0 20 62 65 20 74 68 65 20 73 61 6d 65 20 66 6f 72   be the same for
10db0 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 0a   all members of.
10dc0 2a 2a 20 61 20 22 67 72 6f 75 70 22 2e 20 20 54  ** a "group".  T
10dd0 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74  he requirement t
10de0 68 61 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  hat the GROUP BY
10df0 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 42 49   term must be BI
10e00 4e 41 52 59 0a 2a 2a 20 61 73 73 75 6d 65 73 20  NARY.** assumes 
10e10 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
10e20 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10e30 20 77 69 6c 6c 20 68 61 76 65 20 61 20 66 69 6e   will have a fin
10e40 65 72 2d 67 72 61 69 6e 65 64 0a 2a 2a 20 67 72  er-grained.** gr
10e50 6f 75 70 69 6e 67 20 74 68 61 6e 20 62 69 6e 61  ouping than bina
10e60 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ry.  In other wo
10e70 72 64 73 20 28 41 3d 42 20 43 4f 4c 4c 41 54 45  rds (A=B COLLATE
10e80 20 62 69 6e 61 72 79 29 20 69 6d 70 6c 69 65 73   binary) implies
10e90 0a 2a 2a 20 41 3d 42 20 69 6e 20 65 76 65 72 79  .** A=B in every
10ea0 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67   other collating
10eb0 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 65 20   sequence.  The 
10ec0 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74  requirement that
10ed0 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59   the.** GROUP BY
10ee0 20 62 65 20 42 49 4e 41 52 59 20 69 73 20 73 74   be BINARY is st
10ef0 72 69 63 74 65 72 20 74 68 61 6e 20 6e 65 63 65  ricter than nece
10f00 73 73 61 72 79 2e 20 20 49 74 20 77 6f 75 6c 64  ssary.  It would
10f10 20 61 6c 73 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f   also work.** to
10f20 20 70 72 6f 6d 6f 74 65 20 48 41 56 49 4e 47 20   promote HAVING 
10f30 63 6c 61 75 73 65 73 20 74 68 61 74 20 75 73 65  clauses that use
10f40 20 74 68 65 20 73 61 6d 65 20 61 6c 74 65 72 6e   the same altern
10f50 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 0a  ative collating.
10f60 2a 2a 20 73 65 71 75 65 6e 63 65 20 61 73 20 74  ** sequence as t
10f70 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
10f80 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6d 75  , but that is mu
10f90 63 68 20 68 61 72 64 65 72 20 74 6f 20 63 68 65  ch harder to che
10fa0 63 6b 2c 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69  ck,.** alternati
10fb0 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ve collating seq
10fc0 75 65 6e 63 65 73 20 61 72 65 20 75 6e 63 6f 6d  uences are uncom
10fd0 6d 6f 6e 2c 20 61 6e 64 20 74 68 69 73 20 69 73  mon, and this is
10fe0 20 6f 6e 6c 79 20 61 6e 0a 2a 2a 20 6f 70 74 69   only an.** opti
10ff0 6d 69 7a 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20  mization, so we 
11000 74 61 6b 65 20 74 68 65 20 65 61 73 79 20 77 61  take the easy wa
11010 79 20 6f 75 74 20 61 6e 64 20 73 69 6d 70 6c 79  y out and simply
11020 20 72 65 71 75 69 72 65 20 74 68 65 0a 2a 2a 20   require the.** 
11030 47 52 4f 55 50 20 42 59 20 74 6f 20 75 73 65 20  GROUP BY to use 
11040 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  the BINARY colla
11050 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
11060 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
11070 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  rIsConstantOrGro
11080 75 70 42 79 28 50 61 72 73 65 20 2a 70 50 61 72  upBy(Parse *pPar
11090 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 45 78 70  se, Expr *p, Exp
110a0 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 29  rList *pGroupBy)
110b0 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
110c0 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77  w.eCode = 1;.  w
110d0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
110e0 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
110f0 61 6e 74 4f 72 47 72 6f 75 70 42 79 3b 0a 20 20  antOrGroupBy;.  
11100 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
11110 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 47 72  k = 0;.  w.u.pGr
11120 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
11130 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
11140 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
11150 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
11160 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
11170 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  e;.}../*.** Walk
11180 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
11190 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
111a0 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
111b0 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
111c0 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
111d0 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
111e0 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
111f0 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
11200 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
11210 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
11220 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
11230 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
11240 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
11250 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
11260 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
11270 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
11280 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
11290 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
112a0 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
112b0 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
112c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
112d0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
112e0 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c  unction(Expr *p,
112f0 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61   u8 isInit){.  a
11300 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30  ssert( isInit==0
11310 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b   || isInit==1 );
11320 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
11330 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69  Const(p, 4+isIni
11340 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  t, 0);.}..#ifdef
11350 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
11360 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
11370 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
11380 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
11390 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
113a0 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ession contains 
113b0 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66  a.** subquery of
113c0 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74   some kind.  Ret
113d0 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 61  urn 0 if there a
113e0 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73  re no subqueries
113f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11400 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71  ExprContainsSubq
11410 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20  uery(Expr *p){. 
11420 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65   Walker w;.  w.e
11430 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45  Code = 1;.  w.xE
11440 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
11450 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
11460 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
11470 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
11480 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a  SelectWalkFail;.
11490 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
114a0 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  BUG.  w.xSelectC
114b0 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74  allback2 = sqlit
114c0 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65  e3SelectWalkAsse
114d0 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  rt2;.#endif.  sq
114e0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
114f0 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
11500 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e  .eCode==0;.}.#en
11510 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
11520 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63  e expression p c
11530 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  odes a constant 
11540 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20  integer that is 
11550 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20  small enough.** 
11560 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62  to fit in a 32-b
11570 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
11580 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65  rn 1 and put the
11590 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
115a0 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61  teger.** in *pVa
115b0 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70  lue.  If the exp
115c0 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61  ression is not a
115d0 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20  n integer or if 
115e0 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a  it is too big.**
115f0 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67   to fit in a sig
11600 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  ned 32-bit integ
11610 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64  er, return 0 and
11620 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75   leave *pValue u
11630 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
11640 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
11650 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69  teger(Expr *p, i
11660 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69  nt *pValue){.  i
11670 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28  nt rc = 0;.  if(
11680 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
11690 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 55 73 65  eturn 0;  /* Use
116a0 64 20 74 6f 20 6f 6e 6c 79 20 68 61 70 70 65 6e  d to only happen
116b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f 4f   following on OO
116c0 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  M */..  /* If an
116d0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
116e0 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61  n integer litera
116f0 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e 20 61  l that fits in a
11700 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20   signed 32-bit. 
11710 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65   ** integer, the
11720 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75  n the EP_IntValu
11730 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65  e flag will have
11740 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65   already been se
11750 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  t */.  assert( p
11760 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op!=TK_INTEGER
11770 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20   || (p->flags & 
11780 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a  EP_IntValue)!=0.
11790 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
117a0 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d  lite3GetInt32(p-
117b0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d  >u.zToken, &rc)=
117c0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  =0 );..  if( p->
117d0 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
117e0 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c  lue ){.    *pVal
117f0 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65  ue = p->u.iValue
11800 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
11810 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d    }.  switch( p-
11820 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
11830 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
11840 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78    rc = sqlite3Ex
11850 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
11860 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20  Left, pValue);. 
11870 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11880 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
11890 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INUS: {.      in
118a0 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73  t v;.      if( s
118b0 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
118c0 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76  ger(p->pLeft, &v
118d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
118e0 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38  ert( v!=(-214748
118f0 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20  3647-1) );.     
11900 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b     *pValue = -v;
11910 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
11920 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11930 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11940 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a  default: break;.
11950 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11970 20 46 41 4c 53 45 20 69 66 20 74 68 65 72 65 20   FALSE if there 
11980 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
11990 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
119a0 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   can be NULL..**
119b0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
119c0 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e  ssion might be N
119d0 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78  ULL or if the ex
119e0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20  pression is too 
119f0 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65  complex.** to te
11a00 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20  ll return TRUE. 
11a10 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
11a20 74 69 6e 65 20 69 73 20 75 73 65 64 20 61 73 20  tine is used as 
11a30 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  an optimization,
11a40 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75   to skip OP_IsNu
11a50 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68  ll opcodes.** wh
11a60 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  en we know that 
11a70 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62  a value cannot b
11a80 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20  e NULL.  Hence, 
11a90 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
11aa0 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54  .** (returning T
11ab0 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74  RUE when in fact
11ac0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
11ad0 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c  can never be NUL
11ae0 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61  L) might.** be a
11af0 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e   small performan
11b00 63 65 20 68 69 74 20 62 75 74 20 69 73 20 6f 74  ce hit but is ot
11b10 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73  herwise harmless
11b20 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a  .  On the other.
11b30 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65  ** hand, a false
11b40 20 6e 65 67 61 74 69 76 65 20 28 72 65 74 75 72   negative (retur
11b50 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20  ning FALSE when 
11b60 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64  the result could
11b70 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c   be NULL).** wil
11b80 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
11b90 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  in an incorrect 
11ba0 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e  answer.  So when
11bb0 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72   in doubt, retur
11bc0 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e  n.** TRUE..*/.in
11bd0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  t sqlite3ExprCan
11be0 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70  BeNull(const Exp
11bf0 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a  r *p){.  u8 op;.
11c00 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d    while( p->op==
11c10 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f  TK_UPLUS || p->o
11c20 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 0a  p==TK_UMINUS ){.
11c30 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74      p = p->pLeft
11c40 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e  ;.  }.  op = p->
11c50 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
11c60 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
11c70 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63   p->op2;.  switc
11c80 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
11c90 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
11ca0 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
11cb0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
11cc0 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
11cd0 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74  _BLOB:.      ret
11ce0 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20  urn 0;.    case 
11cf0 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20  TK_COLUMN:.     
11d00 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50   return ExprHasP
11d10 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61  roperty(p, EP_Ca
11d20 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20  nBeNull) ||.    
11d30 20 20 20 20 20 20 20 20 20 70 2d 3e 79 2e 70 54           p->y.pT
11d40 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a 20 52 65 66  ab==0 ||  /* Ref
11d50 65 72 65 6e 63 65 20 74 6f 20 63 6f 6c 75 6d 6e  erence to column
11d60 20 6f 66 20 69 6e 64 65 78 20 6f 6e 20 65 78 70   of index on exp
11d70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
11d80 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c          (p->iCol
11d90 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 79 2e 70  umn>=0 && p->y.p
11da0 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f  Tab->aCol[p->iCo
11db0 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  lumn].notNull==0
11dc0 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  );.    default:.
11dd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
11de0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
11df0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
11e00 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
11e10 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77   is a constant w
11e20 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a  hich would be.**
11e30 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50   unchanged by OP
11e40 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74  _Affinity with t
11e50 68 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65  he affinity give
11e60 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  n in the second.
11e70 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
11e80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11e90 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
11ea0 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41  mine if the OP_A
11eb0 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f  ffinity operatio
11ec0 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74  n.** can be omit
11ed0 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f  ted.  When in do
11ee0 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ubt return FALSE
11ef0 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74  .  A false negat
11f00 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65  ive.** is harmle
11f10 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73  ss.  A false pos
11f20 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20  itive, however, 
11f30 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68  can result in th
11f40 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65  e wrong.** answe
11f50 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
11f60 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
11f70 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74  nityChange(const
11f80 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61   Expr *p, char a
11f90 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20  ff){.  u8 op;.  
11fa0 69 6e 74 20 75 6e 61 72 79 4d 69 6e 75 73 20 3d  int unaryMinus =
11fb0 20 30 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53   0;.  if( aff==S
11fc0 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
11fd0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69   return 1;.  whi
11fe0 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50  le( p->op==TK_UP
11ff0 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  LUS || p->op==TK
12000 5f 55 4d 49 4e 55 53 20 29 7b 0a 20 20 20 20 69  _UMINUS ){.    i
12010 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  f( p->op==TK_UMI
12020 4e 55 53 20 29 20 75 6e 61 72 79 4d 69 6e 75 73  NUS ) unaryMinus
12030 20 3d 20 31 3b 0a 20 20 20 20 70 20 3d 20 70 2d   = 1;.    p = p-
12040 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 6f 70  >pLeft;.  }.  op
12050 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20   = p->op;.  if( 
12060 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
12070 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20  ) op = p->op2;. 
12080 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
12090 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
120a0 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
120b0 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
120c0 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66  FF_INTEGER || af
120d0 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
120e0 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
120f0 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
12100 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
12110 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
12120 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  EAL || aff==SQLI
12130 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
12140 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
12150 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
12160 20 20 72 65 74 75 72 6e 20 21 75 6e 61 72 79 4d    return !unaryM
12170 69 6e 75 73 20 26 26 20 61 66 66 3d 3d 53 51 4c  inus && aff==SQL
12180 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
12190 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
121a0 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65  BLOB: {.      re
121b0 74 75 72 6e 20 21 75 6e 61 72 79 4d 69 6e 75 73  turn !unaryMinus
121c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
121d0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
121e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
121f0 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  Table>=0 );  /* 
12200 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74  p cannot be part
12210 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73   of a CHECK cons
12220 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  traint */.      
12230 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d  return p->iColum
12240 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  n<0.          &&
12250 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
12260 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66  F_INTEGER || aff
12270 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
12280 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ERIC);.    }.   
12290 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
122a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
122b0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
122c0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
122d0 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69  e given string i
122e0 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d  s a row-id colum
122f0 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73  n name..*/.int s
12300 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f  qlite3IsRowid(co
12310 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
12320 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
12330 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29  mp(z, "_ROWID_")
12340 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
12350 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
12360 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29  ICmp(z, "ROWID")
12370 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
12380 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
12390 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d  ICmp(z, "OID")==
123a0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
123b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
123c0 2a 2a 20 70 58 20 69 73 20 74 68 65 20 52 48 53  ** pX is the RHS
123d0 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   of an IN operat
123e0 6f 72 2e 20 20 49 66 20 70 58 20 69 73 20 61 20  or.  If pX is a 
123f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12400 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65   .** that can be
12410 20 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61   simplified to a
12420 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 61 63   direct table ac
12430 63 65 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72  cess, then retur
12440 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
12450 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  o the SELECT sta
12460 74 65 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69  tement.  If pX i
12470 73 20 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73  s not a SELECT s
12480 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20  tatement,.** or 
12490 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  if the SELECT st
124a0 61 74 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f  atement needs to
124b0 20 62 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69   be manifested i
124c0 6e 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a  nto a transient.
124d0 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72  ** table, then r
124e0 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23  eturn NULL..*/.#
124f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12500 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74  IT_SUBQUERY.stat
12510 69 63 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e  ic Select *isCan
12520 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45  didateForInOpt(E
12530 78 70 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65  xpr *pX){.  Sele
12540 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74  ct *p;.  SrcList
12550 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69   *pSrc;.  ExprLi
12560 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61  st *pEList;.  Ta
12570 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74  ble *pTab;.  int
12580 20 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48   i;.  if( !ExprH
12590 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
125a0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20 72  P_xIsSelect) ) r
125b0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74  eturn 0;  /* Not
125c0 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20   a subquery */. 
125d0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
125e0 65 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53  erty(pX, EP_VarS
125f0 65 6c 65 63 74 29 20 20 29 20 72 65 74 75 72 6e  elect)  ) return
12600 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74   0;  /* Correlat
12610 65 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d  ed subq */.  p =
12620 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a   pX->x.pSelect;.
12630 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
12640 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
12650 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
12660 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
12670 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65  T */.  if( p->se
12680 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
12690 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
126a0 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63  te) ){.    testc
126b0 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
126c0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
126d0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
126e0 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
126f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
12700 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
12710 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
12720 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
12730 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65  regate );.    re
12740 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49  turn 0; /* No DI
12750 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61  STINCT keyword a
12760 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20  nd no aggregate 
12770 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d  functions */.  }
12780 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47  .  assert( p->pG
12790 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20  roupBy==0 );    
127a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
127b0 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
127c0 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
127d0 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
127e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
127f0 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20  /* Has no LIMIT 
12800 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
12810 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
12820 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
12830 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45     /* Has no WHE
12840 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70  RE clause */.  p
12850 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
12860 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30   assert( pSrc!=0
12870 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   );.  if( pSrc->
12880 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e  nSrc!=1 ) return
12890 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
128a0 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46  Single term in F
128b0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
128c0 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  if( pSrc->a[0].p
128d0 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
128e0 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69  0;     /* FROM i
128f0 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  s not a subquery
12900 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54   or view */.  pT
12910 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  ab = pSrc->a[0].
12920 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  pTab;.  assert( 
12930 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
12940 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65  ert( pTab->pSele
12950 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  ct==0 );        
12960 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
12970 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77  se is not a view
12980 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
12990 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
129a0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20  rn 0;        /* 
129b0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20  FROM clause not 
129c0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
129d0 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
129e0 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  >pEList;.  asser
129f0 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
12a00 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20    /* All SELECT 
12a10 72 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65 20  results must be 
12a20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f  columns. */.  fo
12a30 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
12a40 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
12a50 20 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20 70    Expr *pRes = p
12a60 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
12a70 72 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d  r;.    if( pRes-
12a80 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
12a90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 61   return 0;.    a
12aa0 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54 61  ssert( pRes->iTa
12ab0 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e  ble==pSrc->a[0].
12ac0 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e  iCursor );  /* N
12ad0 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  ot a correlated 
12ae0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a  subquery */.  }.
12af0 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65    return p;.}.#e
12b00 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12b10 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
12b20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12b30 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
12b40 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
12b50 65 20 74 68 61 74 20 63 68 65 63 6b 73 20 74 68  e that checks th
12b60 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
12b70 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c  mn of index tabl
12b80 65 20 69 43 75 72 20 74 6f 20 73 65 65 20 69 66  e iCur to see if
12b90 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  .** it contains 
12ba0 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73  any NULL entries
12bb0 2e 20 20 43 61 75 73 65 20 74 68 65 20 72 65 67  .  Cause the reg
12bc0 69 73 74 65 72 20 61 74 20 72 65 67 48 61 73 4e  ister at regHasN
12bd0 75 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a  ull to be set.**
12be0 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   to a non-NULL v
12bf0 61 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e  alue if iCur con
12c00 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20  tains no NULLs. 
12c10 20 43 61 75 73 65 20 72 65 67 69 73 74 65 72 20   Cause register 
12c20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f  regHasNull.** to
12c30 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
12c40 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  if iCur contains
12c50 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
12c60 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61  L values..*/.sta
12c70 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
12c80 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56  SetHasNullFlag(V
12c90 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72  dbe *v, int iCur
12ca0 2c 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c  , int regHasNull
12cb0 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a  ){.  int addr1;.
12cc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12cd0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
12ce0 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c  r, 0, regHasNull
12cf0 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
12d00 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12d10 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  , OP_Rewind, iCu
12d20 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
12d30 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
12d40 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
12d50 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20  olumn, iCur, 0, 
12d60 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73  regHasNull);.  s
12d70 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12d80 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50  P5(v, OPFLAG_TYP
12d90 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43  EOFARG);.  VdbeC
12da0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73  omment((v, "firs
12db0 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c  t_entry_in(%d)",
12dc0 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74   iCur));.  sqlit
12dd0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12de0 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64  , addr1);.}.#end
12df0 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
12e00 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
12e10 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  Y./*.** The argu
12e20 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70  ment is an IN op
12e30 65 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69  erator with a li
12e40 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65  st (not a subque
12e50 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72  ry) on the .** r
12e60 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20  ight-hand side. 
12e70 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
12e80 74 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e  that list is con
12e90 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  stant..*/.static
12ea0 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68   int sqlite3InRh
12eb0 73 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  sIsConstant(Expr
12ec0 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a   *pIn){.  Expr *
12ed0 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b  pLHS;.  int res;
12ee0 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
12ef0 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c  HasProperty(pIn,
12f00 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
12f10 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e  ;.  pLHS = pIn->
12f20 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c  pLeft;.  pIn->pL
12f30 65 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d  eft = 0;.  res =
12f40 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
12f50 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70  nstant(pIn);.  p
12f60 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53  In->pLeft = pLHS
12f70 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
12f80 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
12f90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12fa0 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70   used by the imp
12fb0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
12fc0 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72  he IN (...) oper
12fd0 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20  ator..** The pX 
12fe0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
12ff0 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74   expression on t
13000 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
13010 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68   operator, which
13020 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74  .** might be eit
13030 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78  her a list of ex
13040 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73  pressions or a s
13050 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  ubquery..**.** T
13060 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
13070 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e  outine is to fin
13080 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d  d or create a b-
13090 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
130a0 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
130b0 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66  either to test f
130c0 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e  or membership in
130d0 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72 20   the RHS set or 
130e0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
130f0 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72  gh.** all member
13100 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65 74  s of the RHS set
13110 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69  , skipping dupli
13120 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63  cates..**.** A c
13130 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20  ursor is opened 
13140 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  on the b-tree ob
13150 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68 65  ject that is the
13160 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
13170 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70  perator.** and p
13180 58 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74  X->iTable is set
13190 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
131a0 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a   that cursor..**
131b0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
131c0 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
131d0 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65  unction indicate
131e0 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70  s the b-tree typ
131f0 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  e, as follows:.*
13200 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  *.**   IN_INDEX_
13210 52 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68 65  ROWID      - The
13220 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
13230 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
13240 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
13250 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
13260 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
13270 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61  s opened on an a
13280 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a  scending index..
13290 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
132a0 44 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63  DEX_DESC - The c
132b0 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
132c0 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
132d0 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f   index..**   IN_
132e0 49 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20 20  INDEX_EPH       
132f0 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
13300 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70  s opened on a sp
13310 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20  ecially created 
13320 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13340 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
13350 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49  al table..**   I
13360 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20  N_INDEX_NOOP    
13370 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77     - No cursor w
13380 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54  as allocated.  T
13390 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d  he IN operator m
133a0 75 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  ust be.**       
133b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133c0 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73    implemented as
133d0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63   a sequence of c
133e0 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a  omparisons..**.*
133f0 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d  * An existing b-
13400 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 75 73  tree might be us
13410 65 64 20 69 66 20 74 68 65 20 52 48 53 20 65 78  ed if the RHS ex
13420 70 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61  pression pX is a
13430 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75   simple.** subqu
13440 65 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a  ery such as:.**.
13450 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63  **     SELECT <c
13460 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e  olumn1>, <column
13470 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c  2>... FROM <tabl
13480 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e>.**.** If the 
13490 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
134a0 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
134b0 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c   or a more compl
134c0 65 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65  ex subquery, the
134d0 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61  n.** an ephemera
134e0 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65  l table might ne
134f0 65 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  ed to be generat
13500 65 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20  ed from the RHS 
13510 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e  and then.** pX->
13520 69 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70  iTable made to p
13530 6f 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65  oint to the ephe
13540 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74  meral table inst
13550 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69  ead of an.** exi
13560 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a  sting table..**.
13570 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70  ** The inFlags p
13580 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f  arameter must co
13590 6e 74 61 69 6e 2c 20 61 74 20 61 20 6d 69 6e 69  ntain, at a mini
135a0 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20  mum, one of the 
135b0 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58  bits.** IN_INDEX
135c0 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49  _MEMBERSHIP or I
135d0 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 75 74  N_INDEX_LOOP but
135e0 20 6e 6f 74 20 62 6f 74 68 2e 20 20 49 66 20 69   not both.  If i
135f0 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a  nFlags contains.
13600 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  ** IN_INDEX_MEMB
13610 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65  ERSHIP, then the
13620 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
13630 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
13640 72 20 61 20 66 61 73 74 0a 2a 2a 20 6d 65 6d 62  r a fast.** memb
13650 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57 68  ership test.  Wh
13660 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  en the IN_INDEX_
13670 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c  LOOP bit is set,
13680 20 74 68 65 20 49 4e 20 69 6e 64 65 78 20 77 69   the IN index wi
13690 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  ll.** be used to
136a0 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76   loop over all v
136b0 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48 53  alues of the RHS
136c0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
136d0 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  tor..**.** When 
136e0 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73  IN_INDEX_LOOP is
136f0 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62   used (and the b
13700 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
13710 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a  ed to iterate.**
13720 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74   through the set
13730 20 6d 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74   members) then t
13740 68 65 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e  he b-tree must n
13750 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69  ot contain dupli
13760 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68  cates..** An eph
13770 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 77 69 6c  eremal table wil
13780 6c 20 62 65 20 63 72 65 61 74 65 64 20 75 6e 6c  l be created unl
13790 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  ess the selected
137a0 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61   columns are gua
137b0 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
137c0 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72   unique - either
137d0 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
137e0 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
137f0 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a  Y KEY or due to.
13800 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73  ** a UNIQUE cons
13810 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e  traint or index.
13820 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
13830 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
13840 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65  is used (and the
13850 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
13860 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
13870 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
13880 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20   tests) then an 
13890 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
138a0 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
138b0 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73   unless <columns
138c0 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e  > is a single IN
138d0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
138e0 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a  Y column or an .
138f0 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  ** index can be 
13900 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20 73  found with the s
13910 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e  pecified <column
13920 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d  s> as its left-m
13930 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ost..**.** If th
13940 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  e IN_INDEX_NOOP_
13950 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  OK and IN_INDEX_
13960 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62  MEMBERSHIP are b
13970 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69  oth set and.** i
13980 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
13990 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
139a0 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
139b0 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69  bquery) then thi
139c0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67  s.** routine mig
139d0 68 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63  ht decide that c
139e0 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d  reating an ephem
139f0 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20  eral b-tree for 
13a00 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65  membership.** te
13a10 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70  sting is too exp
13a20 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72  ensive and retur
13a30 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e  n IN_INDEX_NOOP.
13a40 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
13a50 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  the.** calling r
13a60 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d  outine should im
13a70 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f  plement the IN o
13a80 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20  perator using a 
13a90 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45  sequence.** of E
13aa0 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73  q or Ne comparis
13ab0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  on operations..*
13ac0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d  *.** When the b-
13ad0 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73  tree is being us
13ae0 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ed for membershi
13af0 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c  p tests, the cal
13b00 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
13b10 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b   might need to k
13b20 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
13b30 6f 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20  ot the RHS side 
13b40 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
13b50 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61  or.** contains a
13b60 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73   NULL.  If prRhs
13b70 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61  HasNull is not a
13b80 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e   NULL pointer an
13b90 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  d .** if there i
13ba0 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61  s any chance tha
13bb0 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68  t the (...) migh
13bc0 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
13bd0 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e   value at.** run
13be0 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67  time, then a reg
13bf0 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
13c00 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73  ed and the regis
13c10 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74  ter number writt
13c20 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48  en.** to *prRhsH
13c30 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65  asNull. If there
13c40 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
13c50 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e  at the (...) con
13c60 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20  tains a.** NULL 
13c70 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52  value, then *prR
13c80 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66  hsHasNull is lef
13c90 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
13ca0 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72  ** If a register
13cb0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
13cc0 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73  d its location s
13cd0 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48  tored in *prRhsH
13ce0 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20  asNull, then.** 
13cf0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61  the value in tha
13d00 74 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20  t register will 
13d10 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62  be NULL if the b
13d20 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f  -tree contains o
13d30 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55  ne or more.** NU
13d40 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69  LL values, and i
13d50 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e  t will be some n
13d60 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66  on-NULL value if
13d70 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74   the b-tree cont
13d80 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20  ains no.** NULL 
13d90 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  values..**.** If
13da0 20 74 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d   the aiMap param
13db0 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  eter is not NULL
13dc0 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  , it must point 
13dd0 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74  to an array cont
13de0 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c  aining.** one el
13df0 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63  ement for each c
13e00 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62  olumn returned b
13e10 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  y the SELECT sta
13e20 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48  tement on the RH
13e30 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e  S.** of the IN(.
13e40 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68  ..) operator. Th
13e50 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20  e i'th entry of 
13e60 74 68 65 20 61 72 72 61 79 20 69 73 20 70 6f 70  the array is pop
13e70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ulated with the.
13e80 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  ** offset of the
13e90 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
13ea0 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
13eb0 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72  'th column retur
13ec0 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45  ned by the.** SE
13ed0 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c  LECT. For exampl
13ee0 65 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73  e, if the expres
13ef0 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65  sion and selecte
13f00 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a  d index are:.**.
13f10 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20  **   (?,?,?) IN 
13f20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20  (SELECT a, b, c 
13f30 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52  FROM t1).**   CR
13f40 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
13f50 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a   t1(b, c, a);.**
13f60 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d  .** then aiMap[]
13f70 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
13f80 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f  th {2, 0, 1}..*/
13f90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13fa0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
13fb0 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  t sqlite3FindInI
13fc0 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
13fd0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
13fe0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
13ff0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
14000 2a 70 58 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pX,            
14010 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
14020 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
14030 53 29 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  S) of the IN ope
14040 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69  rator */.  u32 i
14050 6e 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  nFlags,         
14060 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45        /* IN_INDE
14070 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53  X_LOOP, _MEMBERS
14080 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f  HIP, and/or _NOO
14090 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  P_OK */.  int *p
140a0 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20  rRhsHasNull,    
140b0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
140c0 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74   holding NULL st
140d0 61 74 75 73 2e 20 20 53 65 65 20 6e 6f 74 65 73  atus.  See notes
140e0 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70   */.  int *aiMap
140f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14100 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
14110 20 49 6e 64 65 78 20 66 69 65 6c 64 73 20 74 6f   Index fields to
14120 20 52 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a 20   RHS fields */. 
14130 20 69 6e 74 20 2a 70 69 54 61 62 20 20 20 20 20   int *piTab     
14140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
14150 55 54 3a 20 69 6e 64 65 78 20 74 6f 20 75 73 65  UT: index to use
14160 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
14170 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14190 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20  * SELECT to the 
141a0 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72  right of IN oper
141b0 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54  ator */.  int eT
141c0 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ype = 0;        
141d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141e0 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20 74  /* Type of RHS t
141f0 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a  able. IN_INDEX_*
14200 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
14210 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
14220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
14230 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53  ursor of the RHS
14240 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
14250 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20  mustBeUnique;   
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14270 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53    /* True if RHS
14280 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20   must be unique 
14290 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
142a0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
142b0 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69  arse);     /* Vi
142c0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65  rtual machine be
142d0 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20  ing coded */..  
142e0 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
142f0 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42  TK_IN );.  mustB
14300 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61  eUnique = (inFla
14310 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  gs & IN_INDEX_LO
14320 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66  OP)!=0;..  /* If
14330 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 69 73   the RHS of this
14340 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f   IN(...) operato
14350 72 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 61  r is a SELECT, a
14360 6e 64 20 69 66 20 69 74 20 6d 61 74 74 65 72 73  nd if it matters
14370 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
14380 72 20 6e 6f 74 20 74 68 65 20 53 45 4c 45 43 54  r not the SELECT
14390 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73   result contains
143a0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68   NULL values, ch
143b0 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20 2a 2a  eck whether.  **
143c0 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20   or not NULL is 
143d0 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c  actually possibl
143e0 65 20 28 69 74 20 6d 61 79 20 6e 6f 74 20 62 65  e (it may not be
143f0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64  , for example, d
14400 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20  ue .  ** to NOT 
14410 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
14420 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 29 2e   in the schema).
14430 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75   If no NULL valu
14440 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c  es are possible,
14450 0a 20 20 2a 2a 20 73 65 74 20 70 72 52 68 73 48  .  ** set prRhsH
14460 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f  asNull to 0 befo
14470 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  re continuing.  
14480 2a 2f 0a 20 20 69 66 28 20 70 72 52 68 73 48 61  */.  if( prRhsHa
14490 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c  sNull && (pX->fl
144a0 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
144b0 63 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ct) ){.    int i
144c0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
144d0 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70  pEList = pX->x.p
144e0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
144f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
14500 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
14510 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
14520 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
14530 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ll(pEList->a[i].
14540 70 45 78 70 72 29 20 29 20 62 72 65 61 6b 3b 0a  pExpr) ) break;.
14550 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
14560 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  =pEList->nExpr )
14570 7b 0a 20 20 20 20 20 20 70 72 52 68 73 48 61 73  {.      prRhsHas
14580 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Null = 0;.    }.
14590 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
145a0 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69  to see if an exi
145b0 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
145c0 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
145d0 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79   to.  ** satisfy
145e0 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69   the query.  Thi
145f0 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20  s is preferable 
14600 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  to generating a 
14610 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65  new .  ** epheme
14620 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ral table.  */. 
14630 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
14640 72 3d 3d 30 20 26 26 20 28 70 20 3d 20 69 73 43  r==0 && (p = isC
14650 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
14660 28 70 58 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  (pX))!=0 ){.    
14670 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
14680 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
14690 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
146a0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
146b0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
146c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
146d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
146e0 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f  able <table>. */
146f0 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20 20 20  .    i16 iDb;   
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
14720 61 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20  atabase idx for 
14730 70 54 61 62 20 2a 2f 0a 20 20 20 20 45 78 70 72  pTab */.    Expr
14740 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
14750 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e  ->pEList;.    in
14760 74 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74  t nExpr = pEList
14770 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61 73  ->nExpr;..    as
14780 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
14790 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
147a0 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20    /* Because of 
147b0 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
147c0 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73  Opt(p) */.    as
147d0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d  sert( p->pEList-
147e0 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
147f0 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20  ; /* Because of 
14800 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
14810 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73  Opt(p) */.    as
14820 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30  sert( p->pSrc!=0
14830 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
14840 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20    /* Because of 
14850 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
14860 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54  Opt(p) */.    pT
14870 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
14880 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a  0].pTab;..    /*
14890 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e   Code an OP_Tran
148a0 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54  saction and OP_T
148b0 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61  ableLock for <ta
148c0 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62  ble>. */.    iDb
148d0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
148e0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
148f0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
14900 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
14910 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
14920 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
14930 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
14940 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
14950 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
14960 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  me);..    assert
14970 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33  (v);  /* sqlite3
14980 47 65 74 56 64 62 65 28 29 20 68 61 73 20 61 6c  GetVdbe() has al
14990 77 61 79 73 20 62 65 65 6e 20 70 72 65 76 69 6f  ways been previo
149a0 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  usly called */. 
149b0 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20     if( nExpr==1 
149c0 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  && pEList->a[0].
149d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
149e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
149f0 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 72   "x IN (SELECT r
14a00 6f 77 69 64 20 46 52 4f 4d 20 74 61 62 6c 65 29  owid FROM table)
14a10 22 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  " case */.      
14a20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
14a30 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
14a40 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20   OP_Once);.     
14a50 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
14a60 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
14a70 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
14a80 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
14a90 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
14aa0 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49  .      eType = I
14ab0 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20  N_INDEX_ROWID;. 
14ac0 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
14ad0 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
14ae0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 55  ,.            "U
14af0 53 49 4e 47 20 52 4f 57 49 44 20 53 45 41 52 43  SING ROWID SEARC
14b00 48 20 4f 4e 20 54 41 42 4c 45 20 25 73 20 46 4f  H ON TABLE %s FO
14b10 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70  R IN-OPERATOR",p
14b20 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
14b30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
14b40 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
14b50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
14b60 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
14b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
14b90 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
14ba0 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e  .      int affin
14bb0 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20  ity_ok = 1;.    
14bc0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20    int i;..      
14bd0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
14be0 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
14bf0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
14c00 70 65 72 66 6f 72 6d 20 65 61 63 68 20 0a 20 20  perform each .  
14c10 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
14c20 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  n is the same as
14c30 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
14c40 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20   each column in 
14c50 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f  table.      ** o
14c60 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
14c70 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49   IN operator.  I
14c80 66 20 69 74 20 6e 6f 74 2c 20 69 74 20 69 73 20  f it not, it is 
14c90 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a  not possible to.
14ca0 20 20 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 79        ** use any
14cb0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 52 48   index of the RH
14cc0 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  S table.  */.   
14cd0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
14ce0 78 70 72 20 26 26 20 61 66 66 69 6e 69 74 79 5f  xpr && affinity_
14cf0 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ok; i++){.      
14d00 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
14d10 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
14d20 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65  dSubexpr(pX->pLe
14d30 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
14d40 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73  int iCol = pELis
14d50 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69  t->a[i].pExpr->i
14d60 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
14d70 63 68 61 72 20 69 64 78 61 66 66 20 3d 20 73 71  char idxaff = sq
14d80 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e  lite3TableColumn
14d90 41 66 66 69 6e 69 74 79 28 70 54 61 62 2c 69 43  Affinity(pTab,iC
14da0 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c  ol); /* RHS tabl
14db0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  e */.        cha
14dc0 72 20 63 6d 70 61 66 66 20 3d 20 73 71 6c 69 74  r cmpaff = sqlit
14dd0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
14de0 79 28 70 4c 68 73 2c 20 69 64 78 61 66 66 29 3b  y(pLhs, idxaff);
14df0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
14e00 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54  e( cmpaff==SQLIT
14e10 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20  E_AFF_BLOB );.  
14e20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14e30 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  cmpaff==SQLITE_A
14e40 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20  FF_TEXT );.     
14e50 20 20 20 73 77 69 74 63 68 28 20 63 6d 70 61 66     switch( cmpaf
14e60 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  f ){.          c
14e70 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  ase SQLITE_AFF_B
14e80 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20  LOB:.           
14e90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
14ea0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
14eb0 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20  F_TEXT:.        
14ec0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f      /* sqlite3Co
14ed0 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 29 20  mpareAffinity() 
14ee0 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20 54 45 58  only returns TEX
14ef0 54 20 69 66 20 6f 6e 65 20 73 69 64 65 20 6f 72  T if one side or
14f00 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
14f10 20 2a 2a 20 6f 74 68 65 72 20 68 61 73 20 6e 6f   ** other has no
14f20 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20 74 68   affinity and th
14f30 65 20 6f 74 68 65 72 20 73 69 64 65 20 69 73 20  e other side is 
14f40 54 45 58 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20  TEXT.  Hence,.  
14f50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
14f60 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72 20 63 6d   only way for cm
14f70 70 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 20  paff to be TEXT 
14f80 69 73 20 66 6f 72 20 69 64 78 61 66 66 20 74 6f  is for idxaff to
14f90 20 62 65 20 54 45 58 54 0a 20 20 20 20 20 20 20   be TEXT.       
14fa0 20 20 20 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20       ** and for 
14fb0 74 68 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  the term on the 
14fc0 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 74 6f  LHS of the IN to
14fd0 20 68 61 76 65 20 6e 6f 20 61 66 66 69 6e 69 74   have no affinit
14fe0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  y. */.          
14ff0 20 20 61 73 73 65 72 74 28 20 69 64 78 61 66 66    assert( idxaff
15000 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
15010 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  T );.           
15020 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15030 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
15040 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 5f         affinity_
15050 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 75  ok = sqlite3IsNu
15060 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64  mericAffinity(id
15070 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d  xaff);.        }
15080 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
15090 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20  if( affinity_ok 
150a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ){.        /* Se
150b0 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
150c0 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
150d0 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68  will work for th
150e0 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  is IN operator *
150f0 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  /.        for(pI
15100 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
15110 20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d   pIdx && eType==
15120 30 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  0; pIdx=pIdx->pN
15130 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
15140 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b  Bitmask colUsed;
15150 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73        /* Columns
15160 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 75 73   of the index us
15170 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
15180 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20  Bitmask mCol;   
15190 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f        /* Mask fo
151a0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
151b0 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  lumn */.        
151c0 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
151d0 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74  umn<nExpr ) cont
151e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
151f0 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49  if( pIdx->pPartI
15200 64 78 57 68 65 72 65 21 3d 30 20 29 20 63 6f 6e  dxWhere!=0 ) con
15210 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
15220 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c   /* Maximum nCol
15230 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f  umn is BMS-2, no
15240 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74  t BMS-1, so that
15250 20 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a   we can compute.
15260 20 20 20 20 20 20 20 20 20 20 2a 2a 20 42 49 54            ** BIT
15270 4d 41 53 4b 28 6e 45 78 70 72 29 20 77 69 74 68  MASK(nExpr) with
15280 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20  out overflowing 
15290 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
152a0 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f  tcase( pIdx->nCo
152b0 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  lumn==BMS-2 );. 
152c0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
152d0 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  e( pIdx->nColumn
152e0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
152f0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
15300 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20  Column>=BMS-1 ) 
15310 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
15320 20 20 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e      if( mustBeUn
15330 69 71 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ique ){.        
15340 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b      if( pIdx->nK
15350 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20  eyCol>nExpr.    
15360 20 20 20 20 20 20 20 20 20 7c 7c 28 70 49 64 78           ||(pIdx
15370 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20  ->nColumn>nExpr 
15380 26 26 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65  && !IsUniqueInde
15390 78 28 70 49 64 78 29 29 0a 20 20 20 20 20 20 20  x(pIdx)).       
153a0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
153b0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
153c0 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
153d0 73 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76 65  s not unique ove
153e0 72 20 74 68 65 20 49 4e 20 52 48 53 20 63 6f 6c  r the IN RHS col
153f0 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  umns */.        
15400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15410 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 63  }.  .          c
15420 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a  olUsed = 0;   /*
15430 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65   Columns of inde
15440 78 20 75 73 65 64 20 73 6f 20 66 61 72 20 2a 2f  x used so far */
15450 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
15460 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
15470 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
15480 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69  xpr *pLhs = sqli
15490 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
154a0 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c  bexpr(pX->pLeft,
154b0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
154c0 20 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45   Expr *pRhs = pE
154d0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
154e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 6f  ;.            Co
154f0 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71  llSeq *pReq = sq
15500 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
15510 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
15520 2c 20 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20  , pLhs, pRhs);. 
15530 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
15540 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  ;.  .           
15550 20 61 73 73 65 72 74 28 20 70 52 65 71 21 3d 30   assert( pReq!=0
15560 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d   || pRhs->iColum
15570 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70  n==XN_ROWID || p
15580 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20  Parse->nErr );. 
15590 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
155a0 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b  =0; j<nExpr; j++
155b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
155c0 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
155d0 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43  umn[j]!=pRhs->iC
155e0 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
155f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15600 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 7a  assert( pIdx->az
15610 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20  Coll[j] );.     
15620 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
15630 71 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  q!=0 && sqlite3S
15640 74 72 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61  trICmp(pReq->zNa
15650 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  me, pIdx->azColl
15660 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  [j])!=0 ){.     
15670 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
15680 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
15690 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
156a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
156b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
156c0 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72      if( j==nExpr
156d0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
156e0 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53        mCol = MAS
156f0 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20 20 20 20  KBIT(j);.       
15700 20 20 20 20 20 69 66 28 20 6d 43 6f 6c 20 26 20       if( mCol & 
15710 63 6f 6c 55 73 65 64 20 29 20 62 72 65 61 6b 3b  colUsed ) break;
15720 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20   /* Each column 
15730 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  used only once *
15740 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  /.            co
15750 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20  lUsed |= mCol;. 
15760 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
15770 69 4d 61 70 20 29 20 61 69 4d 61 70 5b 69 5d 20  iMap ) aiMap[i] 
15780 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = j;.          }
15790 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 61 73  .  .          as
157a0 73 65 72 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c  sert( i==nExpr |
157b0 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b  | colUsed!=(MASK
157c0 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 3b  BIT(nExpr)-1) );
157d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
157e0 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54  olUsed==(MASKBIT
157f0 28 6e 45 78 70 72 29 2d 31 29 20 29 7b 0a 20 20  (nExpr)-1) ){.  
15800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
15810 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
15820 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  int, that means 
15830 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 20 69  the index pIdx i
15840 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20  s usable */.    
15850 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
15860 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
15870 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
15880 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15890 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
158a0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
158b0 28 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20  ((pParse, 0,.   
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 20 20 20 20 20 20 20 20 20 20 22 55 53 49 4e             "USIN
158e0 47 20 49 4e 44 45 58 20 25 73 20 46 4f 52 20 49  G INDEX %s FOR I
158f0 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70 49 64 78  N-OPERATOR",pIdx
15900 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
15910 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15920 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
15930 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70  penRead, iTab, p
15940 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
15950 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
15960 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
15970 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
15980 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x);.            
15990 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
159a0 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
159b0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
159c0 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45   assert( IN_INDE
159d0 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20  X_INDEX_DESC == 
159e0 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
159f0 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  SC+1 );.        
15a00 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
15a10 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b  NDEX_INDEX_ASC +
15a20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
15a30 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20  r[0];.  .       
15a40 20 20 20 20 20 69 66 28 20 70 72 52 68 73 48 61       if( prRhsHa
15a50 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20  sNull ){.#ifdef 
15a60 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
15a70 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
15a80 20 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34               i64
15a90 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70   mask = (1<<nExp
15aa0 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  r)-1;.          
15ab0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15ac0 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
15ad0 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20  ColumnsUsed, .  
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15af0 69 54 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a  iTab, 0, 0, (u8*
15b00 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34  )&mask, P4_INT64
15b10 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
15b20 20 20 20 20 20 20 20 20 2a 70 72 52 68 73 48 61          *prRhsHa
15b30 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  sNull = ++pParse
15b40 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
15b50 20 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d        if( nExpr=
15b60 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
15b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
15b80 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69  HasNullFlag(v, i
15b90 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75  Tab, *prRhsHasNu
15ba0 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ll);.           
15bb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
15bc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
15bd0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
15be0 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
15bf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15c00 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
15c10 6f 76 65 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a  over indexes */.
15c20 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69        } /* End i
15c30 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29  f( affinity_ok )
15c40 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64   */.    } /* End
15c50 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64   if not an rowid
15c60 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a   index */.  } /*
15c70 20 45 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20   End attempt to 
15c80 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e 67 20 61  optimize using a
15c90 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a  n index */..  /*
15ca0 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69   If no preexisti
15cb0 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76 61 69  ng index is avai
15cc0 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e  lable for the IN
15cd0 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64   clause.  ** and
15ce0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
15cf0 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70  s an allowed rep
15d00 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ly.  ** and the 
15d10 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
15d20 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
15d30 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  , not a subquery
15d40 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
15d50 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  S is not constan
15d60 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20  t or has two or 
15d70 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a  fewer terms,.  *
15d80 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
15d90 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20   worth creating 
15da0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
15db0 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20  le to evaluate. 
15dc0 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61   ** the IN opera
15dd0 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e  tor so return IN
15de0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a  _INDEX_NOOP..  *
15df0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  /.  if( eType==0
15e00 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20  .   && (inFlags 
15e10 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  & IN_INDEX_NOOP_
15e20 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72 48  OK).   && !ExprH
15e30 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
15e40 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20  P_xIsSelect).   
15e50 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68  && (!sqlite3InRh
15e60 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20  sIsConstant(pX) 
15e70 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pX->x.pList->
15e80 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20  nExpr<=2).  ){. 
15e90 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
15ea0 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  DEX_NOOP;.  }.. 
15eb0 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b   if( eType==0 ){
15ec0 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f  .    /* Could no
15ed0 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69  t find an existi
15ee0 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
15ef0 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20  x to use as the 
15f00 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20  RHS b-tree..    
15f10 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20  ** We will have 
15f20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  to generate an e
15f30 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
15f40 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20  o do the job..  
15f50 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76    */.    u32 sav
15f60 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
15f70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
15f80 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48  p;.    int rMayH
15f90 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  aveNull = 0;.   
15fa0 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
15fb0 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69  X_EPH;.    if( i
15fc0 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
15fd0 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20  X_LOOP ){.      
15fe0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
15ff0 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  op = 0;.    }els
16000 65 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75  e if( prRhsHasNu
16010 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52  ll ){.      *prR
16020 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79  hsHasNull = rMay
16030 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  HaveNull = ++pPa
16040 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d  rse->nMem;.    }
16050 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d  .    assert( pX-
16060 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
16070 20 20 73 71 6c 69 74 65 33 43 6f 64 65 52 68 73    sqlite3CodeRhs
16080 4f 66 49 4e 28 70 50 61 72 73 65 2c 20 70 58 2c  OfIN(pParse, pX,
16090 20 69 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20   iTab);.    if( 
160a0 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a  rMayHaveNull ){.
160b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
160c0 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69  HasNullFlag(v, i
160d0 54 61 62 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c  Tab, rMayHaveNul
160e0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  l);.    }.    pP
160f0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
16100 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f   = savedNQueryLo
16110 6f 70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61  op;.  }..  if( a
16120 69 4d 61 70 20 26 26 20 65 54 79 70 65 21 3d 49  iMap && eType!=I
16130 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
16140 43 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49  C && eType!=IN_I
16150 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
16160 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b  ){.    int i, n;
16170 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
16180 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
16190 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66  X->pLeft);.    f
161a0 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
161b0 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a  ) aiMap[i] = i;.
161c0 20 20 7d 0a 20 20 2a 70 69 54 61 62 20 3d 20 69    }.  *piTab = i
161d0 54 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 65 54  Tab;.  return eT
161e0 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  ype;.}.#endif..#
161f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16200 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
16210 2a 20 41 72 67 75 6d 65 6e 74 20 70 45 78 70 72  * Argument pExpr
16220 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29   is an (?, ?...)
16230 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73   IN(...) express
16240 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ion. This .** fu
16250 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
16260 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6e   and returns a n
16270 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
16280 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
16290 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e 69 74 69  .** the affiniti
162a0 65 73 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  es to be used fo
162b0 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
162c0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
162d0 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  .**.** It is the
162e0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
162f0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
16300 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
16310 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72   returned.** str
16320 69 6e 67 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ing is eventuall
16330 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71  y freed using sq
16340 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a  lite3DbFree()..*
16350 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65  /.static char *e
16360 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 50 61  xprINAffinity(Pa
16370 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
16380 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70  r *pExpr){.  Exp
16390 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
163a0 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e  ->pLeft;.  int n
163b0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Val = sqlite3Exp
163c0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66  rVectorSize(pLef
163d0 74 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  t);.  Select *pS
163e0 65 6c 65 63 74 20 3d 20 28 70 45 78 70 72 2d 3e  elect = (pExpr->
163f0 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
16400 6c 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e 78  lect) ? pExpr->x
16410 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20  .pSelect : 0;.  
16420 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61  char *zRet;..  a
16430 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
16440 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65  ==TK_IN );.  zRe
16450 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
16460 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64  locRaw(pParse->d
16470 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66  b, nVal+1);.  if
16480 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e  ( zRet ){.    in
16490 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
164a0 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nVal; i++){.
164b0 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 20 3d        Expr *pA =
164c0 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
164d0 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74  eldSubexpr(pLeft
164e0 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61 72  , i);.      char
164f0 20 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   a = sqlite3Expr
16500 41 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20 20  Affinity(pA);.  
16510 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
16520 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b  ){.        zRet[
16530 69 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  i] = sqlite3Comp
16540 61 72 65 41 66 66 69 6e 69 74 79 28 70 53 65 6c  areAffinity(pSel
16550 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  ect->pEList->a[i
16560 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20 20  ].pExpr, a);.   
16570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16580 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20    zRet[i] = a;. 
16590 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
165a0 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c   zRet[nVal] = '\
165b0 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0';.  }.  return
165c0 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a   zRet;.}.#endif.
165d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
165e0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
165f0 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61 72  .** Load the Par
16600 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  se object passed
16610 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
16620 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 65  gument with an e
16630 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65  rror .** message
16640 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
16650 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63  .**   "sub-selec
16660 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75  t returns N colu
16670 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 4d  mns - expected M
16680 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c  ".*/   .void sql
16690 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
166a0 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
166b0 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69  , int nActual, i
166c0 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 63  nt nExpect){.  c
166d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20  onst char *zFmt 
166e0 3d 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65  = "sub-select re
166f0 74 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73  turns %d columns
16700 20 2d 20 65 78 70 65 63 74 65 64 20 25 64 22 3b   - expected %d";
16710 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
16720 73 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c  sg(pParse, zFmt,
16730 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65 63   nActual, nExpec
16740 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
16750 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70  .** Expression p
16760 45 78 70 72 20 69 73 20 61 20 76 65 63 74 6f 72  Expr is a vector
16770 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 75   that has been u
16780 73 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 78 74  sed in a context
16790 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 69 73 20   where.** it is 
167a0 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 49  not permitted. I
167b0 66 20 70 45 78 70 72 20 69 73 20 61 20 73 75 62  f pExpr is a sub
167c0 2d 73 65 6c 65 63 74 20 76 65 63 74 6f 72 2c 20  -select vector, 
167d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a  this routine .**
167e0 20 6c 6f 61 64 73 20 74 68 65 20 50 61 72 73 65   loads the Parse
167f0 20 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20 6d   object with a m
16800 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f  essage of the fo
16810 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62  rm:.**.**   "sub
16820 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
16830 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65  N columns - expe
16840 63 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72  cted 1".**.** Or
16850 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65 67  , if it is a reg
16860 75 6c 61 72 20 73 63 61 6c 61 72 20 76 65 63 74  ular scalar vect
16870 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77  or:.**.**   "row
16880 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 0a   value misused".
16890 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74  */   .void sqlit
168a0 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67  e3VectorErrorMsg
168b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
168c0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 23 69  Expr *pExpr){.#i
168d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
168e0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
168f0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
16900 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a  EP_xIsSelect ){.
16910 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65      sqlite3Subse
16920 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
16930 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
16940 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
16950 72 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  r, 1);.  }else.#
16960 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
16970 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
16980 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65  arse, "row value
16990 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a   misused");.  }.
169a0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
169b0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
169c0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
169d0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 6f  ode that will co
169e0 6e 73 74 72 75 63 74 20 61 6e 20 65 70 68 65 6d  nstruct an ephem
169f0 65 72 61 6c 20 74 61 62 6c 65 20 63 6f 6e 74 61  eral table conta
16a00 69 6e 69 6e 67 20 61 6c 6c 20 74 65 72 6d 73 0a  ining all terms.
16a10 2a 2a 20 69 6e 20 74 68 65 20 52 48 53 20 6f 66  ** in the RHS of
16a20 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e   an IN operator.
16a30 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f    The IN operato
16a40 72 20 63 61 6e 20 62 65 20 69 6e 20 65 69 74 68  r can be in eith
16a50 65 72 20 6f 66 20 74 77 6f 0a 2a 2a 20 66 6f 72  er of two.** for
16a60 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20  ms:.**.**     x 
16a70 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20  IN (4,5,11)     
16a80 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f           -- IN o
16a90 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73  perator with lis
16aa0 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  t on right-hand 
16ab0 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e  side.**     x IN
16ac0 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
16ad0 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65  b)     -- IN ope
16ae0 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75  rator with subqu
16af0 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ery on the right
16b00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  .**.** The pExpr
16b10 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
16b20 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20  e IN operator.  
16b30 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
16b40 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 6e  r for the.** con
16b50 73 74 72 75 63 74 65 64 20 65 70 68 65 72 6d 65  structed epherme
16b60 72 61 6c 20 74 61 62 6c 65 20 69 73 20 72 65 74  ral table is ret
16b70 75 72 6e 65 64 2e 20 20 54 68 65 20 66 69 72 73  urned.  The firs
16b80 74 20 74 69 6d 65 20 74 68 65 20 65 70 68 65 6d  t time the ephem
16b90 65 72 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 69 73  eral.** table is
16ba0 20 63 6f 6d 70 75 74 65 64 2c 20 74 68 65 20 63   computed, the c
16bb0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 73 20  ursor number is 
16bc0 61 6c 73 6f 20 73 74 6f 72 65 64 20 69 6e 20 70  also stored in p
16bd0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 0a 2a 2a  Expr->iTable,.**
16be0 20 68 6f 77 65 76 65 72 20 74 68 65 20 63 75 72   however the cur
16bf0 73 6f 72 20 6e 75 6d 62 65 72 20 72 65 74 75 72  sor number retur
16c00 6e 65 64 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ned might not be
16c10 20 74 68 65 20 73 61 6d 65 2c 20 61 73 20 69 74   the same, as it
16c20 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 62   might.** have b
16c30 65 65 6e 20 64 75 70 6c 69 63 61 74 65 64 20 75  een duplicated u
16c40 73 69 6e 67 20 4f 50 5f 4f 70 65 6e 44 75 70 2e  sing OP_OpenDup.
16c50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 48  .**.** If the LH
16c60 53 20 65 78 70 72 65 73 73 69 6f 6e 20 28 22 78  S expression ("x
16c70 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  " in the example
16c80 73 29 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  s) is a column v
16c90 61 6c 75 65 2c 20 6f 72 0a 2a 2a 20 74 68 65 20  alue, or.** the 
16ca0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16cb0 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d   returns a colum
16cc0 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  n value, then th
16cd0 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
16ce0 61 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20  at.** column is 
16cf0 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
16d00 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
16d10 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
16d20 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73  e.** SELECT... s
16d30 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
16d40 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
16d50 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ic affinity is u
16d60 73 65 64 0a 2a 2a 20 69 66 20 65 69 74 68 65 72  sed.** if either
16d70 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45   column has NUME
16d80 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61  RIC or INTEGER a
16d90 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74  ffinity. If neit
16da0 68 65 72 0a 2a 2a 20 27 78 27 20 6e 6f 72 20 74  her.** 'x' nor t
16db0 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  he SELECT... sta
16dc0 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
16dd0 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
16de0 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 69 73 20   affinity.** is 
16df0 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  used..*/.void sq
16e00 6c 69 74 65 33 43 6f 64 65 52 68 73 4f 66 49 4e  lite3CodeRhsOfIN
16e10 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
16e20 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
16e30 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
16e40 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
16e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16e60 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
16e70 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 20 20 20  /.  int iTab    
16e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
16e90 73 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 6e  se this cursor n
16ea0 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  umber */.){.  in
16eb0 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 20  t addrOnce = 0; 
16ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
16ed0 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4f  ress of the OP_O
16ee0 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  nce instruction 
16ef0 61 74 20 74 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  at top */.  int 
16f00 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
16f10 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
16f20 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68  ss of OP_OpenEph
16f30 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
16f40 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  on */.  Expr *pL
16f50 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
16f60 20 20 20 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f      /* the LHS o
16f70 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
16f80 72 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  r */.  KeyInfo *
16f90 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
16fa0 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d     /* Key inform
16fb0 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ation */.  int n
16fc0 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Val;            
16fd0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
16fe0 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a  f vector pLeft *
16ff0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
17000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17010 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
17020 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
17030 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
17040 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
17050 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
17060 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  v!=0 );..  /* Th
17070 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20  e evaluation of 
17080 74 68 65 20 49 4e 20 6d 75 73 74 20 62 65 20 72  the IN must be r
17090 65 70 65 61 74 65 64 20 65 76 65 72 79 20 74 69  epeated every ti
170a0 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e  me it.  ** is en
170b0 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61 6e 79  countered if any
170c0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
170d0 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a  g is true:.  **.
170e0 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
170f0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
17100 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
17110 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20  ubquery.  **    
17120 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
17130 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70  d side is an exp
17140 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  ression list con
17150 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65  taining variable
17160 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20  s.  **    *  We 
17170 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69  are inside a tri
17180 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gger.  **.  ** I
17190 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f  f all of the abo
171a0 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68  ve are false, th
171b0 65 6e 20 77 65 20 63 61 6e 20 63 6f 6d 70 75 74  en we can comput
171c0 65 20 74 68 65 20 52 48 53 20 6a 75 73 74 20 6f  e the RHS just o
171d0 6e 63 65 0a 20 20 2a 2a 20 61 6e 64 20 72 65 75  nce.  ** and reu
171e0 73 65 20 69 74 20 6d 61 6e 79 20 6e 61 6d 65 73  se it many names
171f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78  ..  */.  if( !Ex
17200 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
17210 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
17220 74 29 20 26 26 20 70 50 61 72 73 65 2d 3e 69 53  t) && pParse->iS
17230 65 6c 66 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  elfTab==0 ){.   
17240 20 2f 2a 20 52 65 75 73 65 20 6f 66 20 74 68 65   /* Reuse of the
17250 20 52 48 53 20 69 73 20 61 6c 6c 6f 77 65 64 20   RHS is allowed 
17260 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  */.    /* If thi
17270 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 61 6c  s routine has al
17280 72 65 61 64 79 20 62 65 65 6e 20 63 6f 64 65 64  ready been coded
17290 2c 20 62 75 74 20 74 68 65 20 70 72 65 76 69 6f  , but the previo
172a0 75 73 20 63 6f 64 65 0a 20 20 20 20 2a 2a 20 6d  us code.    ** m
172b0 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
172c0 65 6e 20 69 6e 76 6f 6b 65 64 20 79 65 74 2c 20  en invoked yet, 
172d0 73 6f 20 69 6e 76 6f 6b 65 20 69 74 20 6e 6f 77  so invoke it now
172e0 20 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65   as a subroutine
172f0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
17300 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
17310 79 28 70 45 78 70 72 2c 20 45 50 5f 53 75 62 72  y(pExpr, EP_Subr
17320 74 6e 29 20 29 7b 0a 20 20 20 20 20 20 61 64 64  tn) ){.      add
17330 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56  rOnce = sqlite3V
17340 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
17350 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
17360 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 69 66  age(v);.      if
17370 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
17380 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
17390 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
173a0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
173b0 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20 22  an((pParse, 0, "
173c0 52 45 55 53 45 20 4c 49 53 54 20 53 55 42 51 55  REUSE LIST SUBQU
173d0 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20  ERY %d",.       
173e0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e         pExpr->x.
173f0 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64 29 29  pSelect->selId))
17400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17410 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17420 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
17430 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52  Expr->y.sub.regR
17440 65 74 75 72 6e 2c 0a 20 20 20 20 20 20 20 20 20  eturn,.         
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17460 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64  Expr->y.sub.iAdd
17470 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
17480 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17490 50 5f 4f 70 65 6e 44 75 70 2c 20 69 54 61 62 2c  P_OpenDup, iTab,
174a0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
174b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
174c0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
174d0 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 72  drOnce);.      r
174e0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
174f0 20 20 2f 2a 20 42 65 67 69 6e 20 63 6f 64 69 6e    /* Begin codin
17500 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  g the subroutine
17510 20 2a 2f 0a 20 20 20 20 45 78 70 72 53 65 74 50   */.    ExprSetP
17520 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
17530 50 5f 53 75 62 72 74 6e 29 3b 0a 20 20 20 20 70  P_Subrtn);.    p
17540 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52  Expr->y.sub.regR
17550 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
17560 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70  ->nMem;.    pExp
17570 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 20 3d  r->y.sub.iAddr =
17580 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17590 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
175a0 6e 74 65 67 65 72 2c 20 30 2c 20 70 45 78 70 72  nteger, 0, pExpr
175b0 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72  ->y.sub.regRetur
175c0 6e 29 20 2b 20 31 3b 0a 20 20 20 20 56 64 62 65  n) + 1;.    Vdbe
175d0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 74  Comment((v, "ret
175e0 75 72 6e 20 61 64 64 72 65 73 73 22 29 29 3b 0a  urn address"));.
175f0 0a 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20  .    addrOnce = 
17600 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17610 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
17620 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17630 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
17640 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 69  to see if this i
17650 73 20 61 20 76 65 63 74 6f 72 20 49 4e 20 6f 70  s a vector IN op
17660 65 72 61 74 6f 72 20 2a 2f 0a 20 20 70 4c 65 66  erator */.  pLef
17670 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
17680 3b 0a 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  nVal = sqlit
17690 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
176a0 28 70 4c 65 66 74 29 3b 0a 0a 20 20 2f 2a 20 43  (pLeft);..  /* C
176b0 6f 6e 73 74 72 75 63 74 20 74 68 65 20 65 70 68  onstruct the eph
176c0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 68 61  emeral table tha
176d0 74 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74  t will contain t
176e0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20  he content of.  
176f0 2a 2a 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  ** RHS of the IN
17700 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
17710 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
17720 3d 20 69 54 61 62 3b 0a 20 20 61 64 64 72 20 3d  = iTab;.  addr =
17730 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17740 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
17750 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69  emeral, pExpr->i
17760 54 61 62 6c 65 2c 20 6e 56 61 6c 29 3b 0a 23 69  Table, nVal);.#i
17770 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
17780 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
17790 4e 54 53 0a 20 20 69 66 28 20 45 78 70 72 48 61  NTS.  if( ExprHa
177a0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
177b0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
177c0 7b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  {.    VdbeCommen
177d0 74 28 28 76 2c 20 22 52 65 73 75 6c 74 20 6f 66  t((v, "Result of
177e0 20 53 45 4c 45 43 54 20 25 75 22 2c 20 70 45 78   SELECT %u", pEx
177f0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 73  pr->x.pSelect->s
17800 65 6c 49 64 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  elId));.  }else{
17810 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
17820 28 28 76 2c 20 22 52 48 53 20 6f 66 20 49 4e 20  ((v, "RHS of IN 
17830 6f 70 65 72 61 74 6f 72 22 29 29 3b 0a 20 20 7d  operator"));.  }
17840 0a 23 65 6e 64 69 66 0a 20 20 70 4b 65 79 49 6e  .#endif.  pKeyIn
17850 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
17860 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
17870 3e 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a  >db, nVal, 1);..
17880 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
17890 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
178a0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
178b0 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
178c0 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
178d0 20 2e 2e 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20   ...).    **.   
178e0 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
178f0 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
17900 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
17910 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65  lect into the te
17920 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
17930 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  able allocated a
17940 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e  nd opened above.
17950 0a 20 20 20 20 2a 2f 0a 20 20 20 20 53 65 6c 65  .    */.    Sele
17960 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45  ct *pSelect = pE
17970 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
17980 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
17990 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
179a0 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 45 78 70  pEList;..    Exp
179b0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
179c0 50 61 72 73 65 2c 20 31 2c 20 22 25 73 4c 49 53  Parse, 1, "%sLIS
179d0 54 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a  T SUBQUERY %d",.
179e0 20 20 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65          addrOnce
179f0 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20  ?"":"CORRELATED 
17a00 22 2c 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49  ", pSelect->selI
17a10 64 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 2f 2a  d.    ));.    /*
17a20 20 49 66 20 74 68 65 20 4c 48 53 20 61 6e 64 20   If the LHS and 
17a30 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
17a40 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61  erator do not ma
17a50 74 63 68 2c 20 74 68 61 74 0a 20 20 20 20 2a 2a  tch, that.    **
17a60 20 65 72 72 6f 72 20 77 69 6c 6c 20 68 61 76 65   error will have
17a70 20 62 65 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e   been caught lon
17a80 67 20 62 65 66 6f 72 65 20 77 65 20 72 65 61 63  g before we reac
17a90 68 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f  h this point. */
17aa0 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28  .    if( ALWAYS(
17ab0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e  pEList->nExpr==n
17ac0 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 53 65  Val) ){.      Se
17ad0 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
17ae0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
17af0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
17b00 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
17b10 52 54 5f 53 65 74 2c 20 69 54 61 62 29 3b 0a 20  RT_Set, iTab);. 
17b20 20 20 20 20 20 64 65 73 74 2e 7a 41 66 66 53 64       dest.zAffSd
17b30 73 74 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e  st = exprINAffin
17b40 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78 70  ity(pParse, pExp
17b50 72 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 65 63  r);.      pSelec
17b60 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  t->iLimit = 0;. 
17b70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
17b80 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
17b90 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
17ba0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17bb0 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b  ( pKeyInfo==0 );
17bc0 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f   /* Caused by OO
17bd0 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49  M in sqlite3KeyI
17be0 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20  nfoAlloc() */.  
17bf0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
17c00 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
17c10 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b  elect, &dest) ){
17c20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17c30 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
17c40 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74  b, dest.zAffSdst
17c50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17c60 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
17c70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  KeyInfo);.      
17c80 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
17c90 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
17ca0 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
17cb0 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29  , dest.zAffSdst)
17cc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17cd0 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f  pKeyInfo!=0 ); /
17ce0 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65  * OOM will cause
17cf0 20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c 69   exit after sqli
17d00 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20  te3Select() */. 
17d10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
17d20 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist!=0 );.      
17d30 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e  assert( pEList->
17d40 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20  nExpr>0 );.     
17d50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17d60 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
17d70 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a  le(pKeyInfo) );.
17d80 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
17d90 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
17da0 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73       Expr *p = s
17db0 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
17dc0 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
17dd0 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  i);.        pKey
17de0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
17df0 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
17e00 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20  mpareCollSeq(.  
17e10 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
17e20 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  , p, pEList->a[i
17e30 5d 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20 20  ].pExpr.        
17e40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
17e50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57  .  }else if( ALW
17e60 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  AYS(pExpr->x.pLi
17e70 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 2f 2a  st!=0) ){.    /*
17e80 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70   Case 2:     exp
17e90 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
17ea0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
17eb0 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
17ec0 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65  n, build an inde
17ed0 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65  x key from the e
17ee0 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20  valuation and.  
17ef0 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e    ** store it in
17f00 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
17f10 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20  able. If <expr> 
17f20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
17f30 6e 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 61  n use.    ** tha
17f40 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  t columns affini
17f50 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67  ty when building
17f60 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
17f70 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20  <expr> is not.  
17f80 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
17f90 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
17fa0 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ity..    */.    
17fb0 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20  char affinity;  
17fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
17fd0 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53  inity of the LHS
17fe0 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20   of the IN */.  
17ff0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70    int i;.    Exp
18000 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
18010 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
18020 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
18030 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
18040 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a      int r1, r2;.
18050 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
18060 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
18070 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  ty(pLeft);.    i
18080 66 28 20 61 66 66 69 6e 69 74 79 3c 3d 53 51 4c  f( affinity<=SQL
18090 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
180a0 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
180b0 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
180c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
180d0 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
180e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
180f0 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
18100 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b  ble(pKeyInfo) );
18110 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  .      pKeyInfo-
18120 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69  >aColl[0] = sqli
18130 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
18140 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
18150 65 66 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  eft);.    }..   
18160 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
18170 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
18180 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
18190 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69  */.    r1 = sqli
181a0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
181b0 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20  arse);.    r2 = 
181c0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
181d0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66  g(pParse);.    f
181e0 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  or(i=pList->nExp
181f0 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  r, pItem=pList->
18200 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
18210 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70  em++){.      Exp
18220 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e  r *pE2 = pItem->
18230 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 2f 2a  pExpr;..      /*
18240 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
18250 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  on is not consta
18260 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  nt then we will 
18270 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a  need to.      **
18280 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73   disable the tes
18290 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72  t that was gener
182a0 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20  ated above that 
182b0 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20  makes sure.     
182c0 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e   ** this code on
182d0 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65  ly executes once
182e0 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61  .  Because for a
182f0 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20   non-constant.  
18300 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
18310 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
18320 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
18330 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 2a 2f  h time..      */
18340 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72 4f  .      if( addrO
18350 6e 63 65 20 26 26 20 21 73 71 6c 69 74 65 33 45  nce && !sqlite3E
18360 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
18370 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  2) ){.        sq
18380 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
18390 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 4f 6e 63  oNoop(v, addrOnc
183a0 65 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  e);.        Expr
183b0 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 45  ClearProperty(pE
183c0 78 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b  xpr, EP_Subrtn);
183d0 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f 6e 63  .        addrOnc
183e0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  e = 0;.      }..
183f0 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
18400 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
18410 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
18420 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
18430 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  le */.      sqli
18440 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
18450 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20  se, pE2, r1);.  
18460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18470 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
18480 52 65 63 6f 72 64 2c 20 72 31 2c 20 31 2c 20 72  Record, r1, 1, r
18490 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  2, &affinity, 1)
184a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
184b0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
184c0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54  OP_IdxInsert, iT
184d0 61 62 2c 20 72 32 2c 20 72 31 2c 20 31 29 3b 0a  ab, r2, r1, 1);.
184e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
184f0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
18500 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
18510 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
18520 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
18530 32 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b  2);.  }.  if( pK
18540 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 73 71  eyInfo ){.    sq
18550 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
18560 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64  4(v, addr, (void
18570 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f   *)pKeyInfo, P4_
18580 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 7d 0a 20 20  KEYINFO);.  }.  
18590 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29 7b 0a  if( addrOnce ){.
185a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
185b0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f  umpHere(v, addrO
185c0 6e 63 65 29 3b 0a 20 20 20 20 2f 2a 20 53 75 62  nce);.    /* Sub
185d0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 2a  routine return *
185e0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
185f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
18600 74 75 72 6e 2c 20 70 45 78 70 72 2d 3e 79 2e 73  turn, pExpr->y.s
18610 75 62 2e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  ub.regReturn);. 
18620 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
18630 61 6e 67 65 50 31 28 76 2c 20 70 45 78 70 72 2d  angeP1(v, pExpr-
18640 3e 79 2e 73 75 62 2e 69 41 64 64 72 2d 31 2c 20  >y.sub.iAddr-1, 
18650 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
18660 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 20 20  ntAddr(v)-1);.  
18670 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
18680 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
18690 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  RY */../*.** Gen
186a0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73  erate code for s
186b0 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73  calar subqueries
186c0 20 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75   used as a subqu
186d0 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  ery expression.*
186e0 2a 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  * or EXISTS oper
186f0 61 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ator:.**.**     
18700 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
18710 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75  )          -- su
18720 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58  bquery.**     EX
18730 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46  ISTS (SELECT a F
18740 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53  ROM b)   -- EXIS
18750 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 0a 2a  TS subquery.**.*
18760 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61  * The pExpr para
18770 6d 65 74 65 72 20 69 73 20 74 68 65 20 53 45 4c  meter is the SEL
18780 45 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70  ECT or EXISTS op
18790 65 72 61 74 6f 72 20 74 6f 20 62 65 20 63 6f 64  erator to be cod
187a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
187b0 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64  gister that hold
187c0 73 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20 46  s the result.  F
187d0 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d  or a multi-colum
187e0 6e 20 53 45 4c 45 43 54 2c 20 0a 2a 2a 20 74 68  n SELECT, .** th
187f0 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
18800 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f  ed in a contiguo
18810 75 73 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  us array of regi
18820 73 74 65 72 73 20 61 6e 64 20 74 68 65 0a 2a 2a  sters and the.**
18830 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
18840 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66   the register of
18850 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 72   the left-most r
18860 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  esult column..**
18870 20 52 65 74 75 72 6e 20 30 20 69 66 20 61 6e 20   Return 0 if an 
18880 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
18890 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
188a0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
188b0 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  t sqlite3CodeSub
188c0 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  select(Parse *pP
188d0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
188e0 72 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e  r){.  int addrOn
188f0 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ce = 0;         
18900 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18910 4f 50 5f 4f 6e 63 65 20 61 74 20 74 6f 70 20 6f  OP_Once at top o
18920 66 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  f subroutine */.
18930 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20    int rReg = 0; 
18940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18950 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e   Register storin
18960 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20  g resulting */. 
18970 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18990 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
189a0 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20   to encode */.  
189b0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
189c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
189d0 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ow to deal with 
189e0 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 2a 2f  SELECT result */
189f0 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20  .  int nReg;    
18a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18a10 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f 20 61  * Registers to a
18a20 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 45 78 70  llocate */.  Exp
18a30 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 20 20  r *pLimit;      
18a40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
18a50 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e  limit expression
18a60 20 2a 2f 0a 0a 20 20 56 64 62 65 20 2a 76 20 3d   */..  Vdbe *v =
18a70 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
18a80 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
18a90 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
18aa0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
18ab0 54 53 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  TS );.  testcase
18ac0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
18ad0 53 45 4c 45 43 54 20 29 3b 0a 20 20 61 73 73 65  SELECT );.  asse
18ae0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
18af0 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
18b00 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
18b10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 78   );.  assert( Ex
18b20 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
18b30 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
18b40 74 29 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 70  t) );.  pSel = p
18b50 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
18b60 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75  ..  /* The evalu
18b70 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 49  ation of the EXI
18b80 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73 74 20  STS/SELECT must 
18b90 62 65 20 72 65 70 65 61 74 65 64 20 65 76 65 72  be repeated ever
18ba0 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69  y time it.  ** i
18bb0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66  s encountered if
18bc0 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
18bd0 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20  owing is true:. 
18be0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54   **.  **    *  T
18bf0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
18c00 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  de is a correlat
18c10 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  ed subquery.  **
18c20 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
18c30 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e  -hand side is an
18c40 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
18c50 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69   containing vari
18c60 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20  ables.  **    * 
18c70 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61   We are inside a
18c80 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20   trigger.  **.  
18c90 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  ** If all of the
18ca0 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65   above are false
18cb0 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75  , then we can ru
18cc0 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74  n this code just
18cd0 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20   once.  ** save 
18ce0 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64  the results, and
18cf0 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   reuse the same 
18d00 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71  result on subseq
18d10 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73  uent invocations
18d20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78  ..  */.  if( !Ex
18d30 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
18d40 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
18d50 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  t) ){.    /* If 
18d60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  this routine has
18d70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
18d80 64 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ded, then invoke
18d90 20 69 74 20 61 73 20 61 0a 20 20 20 20 2a 2a 20   it as a.    ** 
18da0 73 75 62 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20  subroutine. */. 
18db0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
18dc0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
18dd0 5f 53 75 62 72 74 6e 29 20 29 7b 0a 20 20 20 20  _Subrtn) ){.    
18de0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
18df0 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20 22  an((pParse, 0, "
18e00 52 45 55 53 45 20 53 55 42 51 55 45 52 59 20 25  REUSE SUBQUERY %
18e10 64 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64 29  d", pSel->selId)
18e20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18e30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18e40 5f 47 6f 73 75 62 2c 20 70 45 78 70 72 2d 3e 79  _Gosub, pExpr->y
18e50 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e 2c 0a  .sub.regReturn,.
18e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e70 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 79          pExpr->y
18e80 2e 73 75 62 2e 69 41 64 64 72 29 3b 0a 20 20 20  .sub.iAddr);.   
18e90 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
18ea0 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 0a  >iTable;.    }..
18eb0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 63 6f 64      /* Begin cod
18ec0 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
18ed0 6e 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 53 65  ne */.    ExprSe
18ee0 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
18ef0 20 45 50 5f 53 75 62 72 74 6e 29 3b 0a 20 20 20   EP_Subrtn);.   
18f00 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65   pExpr->y.sub.re
18f10 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
18f20 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 45  se->nMem;.    pE
18f30 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72  xpr->y.sub.iAddr
18f40 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   =.      sqlite3
18f50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18f60 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 45 78  _Integer, 0, pEx
18f70 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74  pr->y.sub.regRet
18f80 75 72 6e 29 20 2b 20 31 3b 0a 20 20 20 20 56 64  urn) + 1;.    Vd
18f90 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
18fa0 65 74 75 72 6e 20 61 64 64 72 65 73 73 22 29 29  eturn address"))
18fb0 3b 0a 0a 20 20 20 20 61 64 64 72 4f 6e 63 65 20  ;..    addrOnce 
18fc0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
18fd0 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
18fe0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18ff0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 6f  ;.  }.  .  /* Fo
19000 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65 6e 65  r a SELECT, gene
19010 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74  rate code to put
19020 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   the values for 
19030 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  all columns of. 
19040 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 6f   ** the first ro
19050 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20  w into an array 
19060 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  of registers and
19070 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   return the inde
19080 78 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66 69  x of.  ** the fi
19090 72 73 74 20 72 65 67 69 73 74 65 72 2e 0a 20 20  rst register..  
190a0 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
190b0 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72  is an EXISTS, wr
190c0 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72 20 30  ite an integer 0
190d0 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72   (not exists) or
190e0 20 31 20 28 65 78 69 73 74 73 29 0a 20 20 2a 2a   1 (exists).  **
190f0 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
19100 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74   and return that
19110 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
19120 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 62  ..  **.  ** In b
19130 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 71  oth cases, the q
19140 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74 65  uery is augmente
19150 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31 22  d with "LIMIT 1"
19160 2e 20 20 41 6e 79 20 0a 20 20 2a 2a 20 70 72 65  .  Any .  ** pre
19170 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 69  existing limit i
19180 73 20 64 69 73 63 61 72 64 65 64 20 69 6e 20 70  s discarded in p
19190 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65 77 20  lace of the new 
191a0 4c 49 4d 49 54 20 31 2e 0a 20 20 2a 2f 0a 20 20  LIMIT 1..  */.  
191b0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
191c0 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73  ((pParse, 1, "%s
191d0 53 43 41 4c 41 52 20 53 55 42 51 55 45 52 59 20  SCALAR SUBQUERY 
191e0 25 64 22 2c 0a 20 20 20 20 20 20 20 20 61 64 64  %d",.        add
191f0 72 4f 6e 63 65 3f 22 22 3a 22 43 4f 52 52 45 4c  rOnce?"":"CORREL
19200 41 54 45 44 20 22 2c 20 70 53 65 6c 2d 3e 73 65  ATED ", pSel->se
19210 6c 49 64 29 29 3b 0a 20 20 6e 52 65 67 20 3d 20  lId));.  nReg = 
19220 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
19230 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c  LECT ? pSel->pEL
19240 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a  ist->nExpr : 1;.
19250 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
19260 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30  estInit(&dest, 0
19270 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  , pParse->nMem+1
19280 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  );.  pParse->nMe
19290 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 69 66 28  m += nReg;.  if(
192a0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
192b0 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 64 65 73  ELECT ){.    des
192c0 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65  t.eDest = SRT_Me
192d0 6d 3b 0a 20 20 20 20 64 65 73 74 2e 69 53 64 73  m;.    dest.iSds
192e0 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  t = dest.iSDParm
192f0 3b 0a 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74  ;.    dest.nSdst
19300 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 73 71 6c   = nReg;.    sql
19310 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19320 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65  , OP_Null, 0, de
19330 73 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74  st.iSDParm, dest
19340 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29  .iSDParm+nReg-1)
19350 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
19360 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71  t((v, "Init subq
19370 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a  uery result"));.
19380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 73    }else{.    des
19390 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78  t.eDest = SRT_Ex
193a0 69 73 74 73 3b 0a 20 20 20 20 73 71 6c 69 74 65  ists;.    sqlite
193b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
193c0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65  P_Integer, 0, de
193d0 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  st.iSDParm);.   
193e0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
193f0 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65   "Init EXISTS re
19400 73 75 6c 74 22 29 29 3b 0a 20 20 7d 0a 20 20 70  sult"));.  }.  p
19410 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
19420 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
19430 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  >db, TK_INTEGER,
19440 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e  &sqlite3IntToken
19450 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20  s[1], 0);.  if( 
19460 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSel->pLimit ){.
19470 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
19480 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
19490 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e  , pSel->pLimit->
194a0 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 53 65 6c  pLeft);.    pSel
194b0 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20  ->pLimit->pLeft 
194c0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 7d 65 6c 73  = pLimit;.  }els
194d0 65 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69  e{.    pSel->pLi
194e0 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  mit = sqlite3PEx
194f0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 49  pr(pParse, TK_LI
19500 4d 49 54 2c 20 70 4c 69 6d 69 74 2c 20 30 29 3b  MIT, pLimit, 0);
19510 0a 20 20 7d 0a 20 20 70 53 65 6c 2d 3e 69 4c 69  .  }.  pSel->iLi
19520 6d 69 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  mit = 0;.  if( s
19530 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
19540 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74  rse, pSel, &dest
19550 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
19560 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e  0;.  }.  pExpr->
19570 69 54 61 62 6c 65 20 3d 20 72 52 65 67 20 3d 20  iTable = rReg = 
19580 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
19590 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
195a0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
195b0 65 64 75 63 65 29 3b 0a 20 20 69 66 28 20 61 64  educe);.  if( ad
195c0 64 72 4f 6e 63 65 20 29 7b 0a 20 20 20 20 73 71  drOnce ){.    sq
195d0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
195e0 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
195f0 0a 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69  .    /* Subrouti
19600 6e 65 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  ne return */.   
19610 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19620 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
19630 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65   pExpr->y.sub.re
19640 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 73 71  gReturn);.    sq
19650 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
19660 31 28 76 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75  1(v, pExpr->y.su
19670 62 2e 69 41 64 64 72 2d 31 2c 20 73 71 6c 69 74  b.iAddr-1, sqlit
19680 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
19690 72 28 76 29 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  r(v)-1);.  }..  
196a0 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23  return rReg;.}.#
196b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
196c0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
196d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
196e0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
196f0 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73  *.** Expr pIn is
19700 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72   an IN(...) expr
19710 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e  ession. This fun
19720 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61  ction checks tha
19730 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65  t the .** sub-se
19740 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20  lect on the RHS 
19750 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72  of the IN() oper
19760 61 74 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d  ator has the sam
19770 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20  e number of .** 
19780 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76  columns as the v
19790 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53  ector on the LHS
197a0 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53  . Or, if the RHS
197b0 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69 73 20   of the IN() is 
197c0 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75  not .** a sub-qu
197d0 65 72 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48  ery, that the LH
197e0 53 20 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66  S is a vector of
197f0 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20   size 1..*/.int 
19800 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
19810 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  IN(Parse *pParse
19820 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20  , Expr *pIn){.  
19830 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71  int nVector = sq
19840 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
19850 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b  ize(pIn->pLeft);
19860 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61  .  if( (pIn->fla
19870 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
19880 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56  t) ){.    if( nV
19890 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53  ector!=pIn->x.pS
198a0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
198b0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71  Expr ){.      sq
198c0 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
198d0 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ror(pParse, pIn-
198e0 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
198f0 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74  st->nExpr, nVect
19900 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  or);.      retur
19910 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  n 1;.    }.  }el
19920 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d  se if( nVector!=
19930 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
19940 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70  VectorErrorMsg(p
19950 50 61 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66  Parse, pIn->pLef
19960 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  t);.    return 1
19970 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
19980 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
19990 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
199a0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47  SUBQUERY./*.** G
199b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
199c0 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f   an IN expressio
199d0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  n..**.**      x 
199e0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
199f0 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61  **      x IN (va
19a00 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
19a10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
19a20 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20  hand side (LHS) 
19a30 69 73 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76  is a scalar or v
19a40 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
19a50 2e 20 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74  .  The .** right
19a60 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29  -hand side (RHS)
19a70 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
19a80 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61  zero or more sca
19a90 6c 61 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61  lar values, or a
19aa0 0a 2a 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49  .** subquery.  I
19ab0 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20 73  f the RHS is a s
19ac0 75 62 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d  ubquery, the num
19ad0 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
19ae0 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61  lumns must.** ma
19af0 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
19b00 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
19b10 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c   vector on the L
19b20 48 53 2e 20 20 49 66 20 74 68 65 20 52 48 53 20  HS.  If the RHS 
19b30 69 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20  is.** a list of 
19b40 76 61 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20  values, the LHS 
19b50 6d 75 73 74 20 62 65 20 61 20 73 63 61 6c 61 72  must be a scalar
19b60 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20  . .**.** The IN 
19b70 6f 70 65 72 61 74 6f 72 20 69 73 20 74 72 75 65  operator is true
19b80 20 69 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75   if the LHS valu
19b90 65 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  e is contained w
19ba0 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a  ithin the RHS..*
19bb0 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  * The result is 
19bc0 66 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53  false if the LHS
19bd0 20 69 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e   is definitely n
19be0 6f 74 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ot in the RHS.  
19bf0 54 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69  The .** result i
19c00 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72  s NULL if the pr
19c10 65 73 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48  esence of the LH
19c20 53 20 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e  S in the RHS can
19c30 6e 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72  not be .** deter
19c40 6d 69 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c  mined due to NUL
19c50 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  Ls..**.** This r
19c60 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
19c70 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73   code that jumps
19c80 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20   to destIfFalse 
19c90 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  if the LHS is no
19ca0 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20  t .** contained 
19cb0 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20  within the RHS. 
19cc0 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73   If due to NULLs
19cd0 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72   we cannot deter
19ce0 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a  mine if the LHS.
19cf0 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ** is contained 
19d00 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
19d10 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75  jump to destIfNu
19d20 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20  ll.  If the LHS 
19d30 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  is contained.** 
19d40 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74  within the RHS t
19d50 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
19d60 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20  ..**.** See the 
19d70 73 65 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72  separate in-oper
19d80 61 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74  ator.md document
19d90 61 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68  ation file in th
19da0 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53  e canonical.** S
19db0 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74 72 65  QLite source tre
19dc0 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
19dd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
19de0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
19df0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a  ite3ExprCodeIN(.
19e00 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
19e10 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
19e20 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
19e30 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
19e40 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
19e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19e60 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a   IN expression *
19e70 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61  /.  int destIfFa
19e80 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d  lse,      /* Jum
19e90 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73  p here if LHS is
19ea0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
19eb0 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  n the RHS */.  i
19ec0 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20  nt destIfNull   
19ed0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
19ee0 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73  e if the results
19ef0 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65   are unknown due
19f00 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a   to NULLs */.){.
19f10 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c    int rRhsHasNul
19f20 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73  l = 0;  /* Regis
19f30 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65  ter that is true
19f40 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73   if RHS contains
19f50 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a   NULL values */.
19f60 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20    int eType;    
19f70 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
19f80 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  of the RHS */.  
19f90 69 6e 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20  int rLhs;       
19fa0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
19fb0 72 28 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65  r(s) holding the
19fc0 20 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20   LHS values */. 
19fd0 20 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20   int rLhsOrig;  
19fe0 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61         /* LHS va
19ff0 6c 75 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65  lues prior to re
1a000 6f 72 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61  ordering by aiMa
1a010 70 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  p[] */.  Vdbe *v
1a020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1a030 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  * Statement unde
1a040 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1a050 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d  /.  int *aiMap =
1a060 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70   0;       /* Map
1a070 20 66 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65   from vector fie
1a080 6c 64 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75  ld to index colu
1a090 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  mn */.  char *zA
1a0a0 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ff = 0;       /*
1a0b0 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
1a0c0 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73   for comparisons
1a0d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f   */.  int nVecto
1a0e0 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  r;          /* S
1a0f0 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66  ize of vectors f
1a100 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61  or this IN opera
1a110 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75  tor */.  int iDu
1a120 6d 6d 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  mmy;           /
1a130 2a 20 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65  * Dummy paramete
1a140 72 20 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63  r to exprCodeVec
1a150 74 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20  tor() */.  Expr 
1a160 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  *pLeft;         
1a170 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74   /* The LHS of t
1a180 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
1a190 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1a1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f            /* loo
1a1b0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
1a1c0 6e 74 20 64 65 73 74 53 74 65 70 32 3b 20 20 20  nt destStep2;   
1a1d0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
1a1e0 20 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73   jump when NULLs
1a1f0 20 73 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20   seen in step 2 
1a200 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65  */.  int destSte
1a210 70 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74  p6 = 0;    /* St
1a220 61 72 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20  art of code for 
1a230 53 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20  Step 6 */.  int 
1a240 61 64 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20  addrTruthOp;    
1a250 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1a260 6f 70 63 6f 64 65 20 74 68 61 74 20 64 65 74 65  opcode that dete
1a270 72 6d 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73  rmines the IN is
1a280 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64   true */.  int d
1a290 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20  estNotNull;     
1a2a0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1a2b0 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73   a comparison is
1a2c0 20 6e 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65   not true in ste
1a2d0 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  p 6 */.  int add
1a2e0 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  rTop;          /
1a2f0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65  * Top of the ste
1a300 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 20 20 69  p-6 loop */ .  i
1a310 6e 74 20 69 54 61 62 20 3d 20 30 3b 20 20 20 20  nt iTab = 0;    
1a320 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
1a330 20 75 73 65 20 2a 2f 0a 0a 20 20 70 4c 65 66 74   use */..  pLeft
1a340 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
1a350 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
1a360 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72 73 65  prCheckIN(pParse
1a370 2c 20 70 45 78 70 72 29 20 29 20 72 65 74 75 72  , pExpr) ) retur
1a380 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78 70 72  n;.  zAff = expr
1a390 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  INAffinity(pPars
1a3a0 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e 56 65  e, pExpr);.  nVe
1a3b0 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78  ctor = sqlite3Ex
1a3c0 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
1a3d0 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69  pr->pLeft);.  ai
1a3e0 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  Map = (int*)sqli
1a3f0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
1a400 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
1a410 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65  b, nVector*(size
1a420 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66  of(int) + sizeof
1a430 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29 3b  (char)) + 1.  );
1a440 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
1a450 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a460 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78  ) goto sqlite3Ex
1a470 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72  prCodeIN_oom_err
1a480 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70  or;..  /* Attemp
1a490 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  t to compute the
1a4a0 20 52 48 53 2e 20 41 66 74 65 72 20 74 68 69 73   RHS. After this
1a4b0 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69   step, if anythi
1a4c0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20  ng other than.  
1a4d0 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  ** IN_INDEX_NOOP
1a4e0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
1a4f0 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 77  e table opened w
1a500 69 74 68 20 63 75 72 73 6f 72 20 69 54 61 62 0a  ith cursor iTab.
1a510 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
1a520 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61  e values that ma
1a530 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e 20 49  ke up the RHS. I
1a540 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  f IN_INDEX_NOOP 
1a550 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a  is returned,.  *
1a560 2a 20 74 68 65 20 52 48 53 20 68 61 73 20 6e 6f  * the RHS has no
1a570 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64  t yet been coded
1a580 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  .  */.  v = pPar
1a590 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
1a5a0 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
1a5b0 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74     /* OOM detect
1a5c0 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  ed prior to this
1a5d0 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64   routine */.  Vd
1a5e0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1a5f0 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72  , "begin IN expr
1a600 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73  "));.  eType = s
1a610 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
1a620 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  x(pParse, pExpr,
1a630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e                IN
1a650 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
1a660 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  P | IN_INDEX_NOO
1a670 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20  P_OK,.          
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a690 20 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d     destIfFalse==
1a6a0 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a  destIfNull ? 0 :
1a6b0 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c 0a 20   &rRhsHasNull,. 
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 61 69 4d 61              aiMa
1a6e0 70 2c 20 26 69 54 61 62 29 3b 0a 0a 20 20 61 73  p, &iTab);..  as
1a6f0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
1a700 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d 31  rr || nVector==1
1a710 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
1a720 44 45 58 5f 45 50 48 0a 20 20 20 20 20 20 20 7c  DEX_EPH.       |
1a730 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  | eType==IN_INDE
1a740 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20 65  X_INDEX_ASC || e
1a750 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type==IN_INDEX_I
1a760 4e 44 45 58 5f 44 45 53 43 20 0a 20 20 29 3b 0a  NDEX_DESC .  );.
1a770 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1a780 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69 72 6d  BUG.  /* Confirm
1a790 20 74 68 61 74 20 61 69 4d 61 70 5b 5d 20 63 6f   that aiMap[] co
1a7a0 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f 72 20 69  ntains nVector i
1a7b0 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 62 65  nteger values be
1a7c0 74 77 65 65 6e 20 30 20 61 6e 64 0a 20 20 2a 2a  tween 0 and.  **
1a7d0 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20   nVector-1. */. 
1a7e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
1a7f0 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  tor; i++){.    i
1a800 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20 20 66  nt j, cnt;.    f
1a810 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56  or(cnt=j=0; j<nV
1a820 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66 28 20  ector; j++) if( 
1a830 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e  aiMap[j]==i ) cn
1a840 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t++;.    assert(
1a850 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23   cnt==1 );.  }.#
1a860 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 64 65  endif..  /* Code
1a870 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65   the LHS, the <e
1a880 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72  xpr> from "<expr
1a890 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20  > IN (...)". If 
1a8a0 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20 20  the LHS is a .  
1a8b0 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20  ** vector, then 
1a8c0 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  it is stored in 
1a8d0 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65 63  an array of nVec
1a8e0 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 73 74  tor registers st
1a8f0 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20  arting .  ** at 
1a900 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 71  r1..  **.  ** sq
1a910 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
1a920 28 29 20 6d 69 67 68 74 20 68 61 76 65 20 72 65  () might have re
1a930 6f 72 64 65 72 65 64 20 74 68 65 20 66 69 65 6c  ordered the fiel
1a940 64 73 20 6f 66 20 74 68 65 20 4c 48 53 20 76 65  ds of the LHS ve
1a950 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74 68 61  ctor.  ** so tha
1a960 74 20 74 68 65 20 66 69 65 6c 64 73 20 61 72 65  t the fields are
1a970 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64   in the same ord
1a980 65 72 20 61 73 20 61 6e 20 65 78 69 73 74 69 6e  er as an existin
1a990 67 20 69 6e 64 65 78 2e 20 20 20 54 68 65 0a 20  g index.   The. 
1a9a0 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72 72 61   ** aiMap[] arra
1a9b0 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 70  y contains a map
1a9c0 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6f 72  ping from the or
1a9d0 69 67 69 6e 61 6c 20 4c 48 53 20 66 69 65 6c 64  iginal LHS field
1a9e0 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 74   order to.  ** t
1a9f0 68 65 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74  he field order t
1aa00 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20  hat matches the 
1aa10 52 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a  RHS index..  */.
1aa20 20 20 72 4c 68 73 4f 72 69 67 20 3d 20 65 78 70    rLhsOrig = exp
1aa30 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72  rCodeVector(pPar
1aa40 73 65 2c 20 70 4c 65 66 74 2c 20 26 69 44 75 6d  se, pLeft, &iDum
1aa50 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  my);.  for(i=0; 
1aa60 69 3c 6e 56 65 63 74 6f 72 20 26 26 20 61 69 4d  i<nVector && aiM
1aa70 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d  ap[i]==i; i++){}
1aa80 20 2f 2a 20 41 72 65 20 4c 48 53 20 66 69 65 6c   /* Are LHS fiel
1aa90 64 73 20 72 65 6f 72 64 65 72 65 64 3f 20 2a 2f  ds reordered? */
1aaa0 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65 63 74 6f  .  if( i==nVecto
1aab0 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48 53 20  r ){.    /* LHS 
1aac0 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 72  fields are not r
1aad0 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20  eordered */.    
1aae0 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69 67 3b  rLhs = rLhsOrig;
1aaf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1ab00 20 4e 65 65 64 20 74 6f 20 72 65 6f 72 64 65 72   Need to reorder
1ab10 20 74 68 65 20 4c 48 53 20 66 69 65 6c 64 73 20   the LHS fields 
1ab20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 69 4d  according to aiM
1ab30 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d  ap */.    rLhs =
1ab40 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1ab50 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 56 65  ange(pParse, nVe
1ab60 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69  ctor);.    for(i
1ab70 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
1ab80 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1ab90 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1aba0 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f 72 69  OP_Copy, rLhsOri
1abb0 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61 70 5b  g+i, rLhs+aiMap[
1abc0 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  i], 0);.    }.  
1abd0 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69 74  }..  /* If sqlit
1abe0 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20  e3FindInIndex() 
1abf0 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20  did not find or 
1ac00 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20  create an index 
1ac10 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73 75 69  that is.  ** sui
1ac20 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c 75 61  table for evalua
1ac30 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72  ting the IN oper
1ac40 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c 75  ator, then evalu
1ac50 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a  ate using a.  **
1ac60 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d   sequence of com
1ac70 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20  parisons..  **. 
1ac80 20 2a 2a 20 54 68 69 73 20 69 73 20 73 74 65 70   ** This is step
1ac90 20 28 31 29 20 69 6e 20 74 68 65 20 69 6e 2d 6f   (1) in the in-o
1aca0 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74 69 6d  perator.md optim
1acb0 69 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d 2e 0a  ized algorithm..
1acc0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1acd0 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  ==IN_INDEX_NOOP 
1ace0 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
1acf0 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
1ad00 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c  x.pList;.    Col
1ad10 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
1ad20 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1ad30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1ad40 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74 20  pLeft);.    int 
1ad50 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65  labelOk = sqlite
1ad60 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
1ad70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 6e 74 20  Parse);.    int 
1ad80 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20  r2, regToFree;. 
1ad90 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c     int regCkNull
1ada0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69   = 0;.    int ii
1adb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
1adc0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1add0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1ade0 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ct) );.    if( d
1adf0 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
1ae00 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
1ae10 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69  regCkNull = sqli
1ae20 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
1ae30 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
1ae40 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1ae50 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68  , OP_BitAnd, rLh
1ae60 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75  s, rLhs, regCkNu
1ae70 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ll);.    }.    f
1ae80 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73  or(ii=0; ii<pLis
1ae90 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  t->nExpr; ii++){
1aea0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1aeb0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1aec0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
1aed0 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67  [ii].pExpr, &reg
1aee0 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69  ToFree);.      i
1aef0 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20  f( regCkNull && 
1af00 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
1af10 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69  Null(pList->a[ii
1af20 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
1af30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1af40 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41  ddOp3(v, OP_BitA
1af50 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72  nd, regCkNull, r
1af60 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  2, regCkNull);. 
1af70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1af80 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
1af90 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c  -1 || destIfNull
1afa0 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b  !=destIfFalse ){
1afb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1afc0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1afd0 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c  _Eq, rLhs, label
1afe0 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20  Ok, r2,.        
1aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b000 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
1b010 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
1b020 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1b030 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d  eIf(v, ii<pList-
1b040 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20  >nExpr-1);.     
1b050 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1b060 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e  f(v, ii==pList->
1b070 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20  nExpr-1);.      
1b080 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1b090 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d  ngeP5(v, zAff[0]
1b0a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1b0b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1b0c0 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74  destIfNull==dest
1b0d0 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20  IfFalse );.     
1b0e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b0f0 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp4(v, OP_Ne, r
1b100 4c 68 73 2c 20 64 65 73 74 49 66 46 61 6c 73 65  Lhs, destIfFalse
1b110 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20  , r2,.          
1b120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b130 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34  (void*)pColl, P4
1b140 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43  _COLLSEQ); VdbeC
1b150 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1b160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1b170 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b  hangeP5(v, zAff[
1b180 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  0] | SQLITE_JUMP
1b190 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d  IFNULL);.      }
1b1a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1b1b0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1b1c0 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b  rse, regToFree);
1b1d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1b1e0 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  egCkNull ){.    
1b1f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b200 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
1b210 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73  , regCkNull, des
1b220 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f  tIfNull); VdbeCo
1b230 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1b240 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1b250 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
1b260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1b270 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1b280 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b  bel(v, labelOk);
1b290 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
1b2a0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1b2b0 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  e, regCkNull);. 
1b2c0 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45     goto sqlite3E
1b2d0 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
1b2e0 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  ed;.  }..  /* St
1b2f0 65 70 20 32 3a 20 43 68 65 63 6b 20 74 6f 20 73  ep 2: Check to s
1b300 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 63 6f  ee if the LHS co
1b310 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20  ntains any NULL 
1b320 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68 65  columns.  If the
1b330 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63  .  ** LHS does c
1b340 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65  ontain NULLs the
1b350 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73  n the result mus
1b360 74 20 62 65 20 65 69 74 68 65 72 20 46 41 4c 53  t be either FALS
1b370 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20  E or NULL..  ** 
1b380 57 65 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69  We will then ski
1b390 70 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  p the binary sea
1b3a0 72 63 68 20 6f 66 20 74 68 65 20 52 48 53 2e 0a  rch of the RHS..
1b3b0 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49    */.  if( destI
1b3c0 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c  fNull==destIfFal
1b3d0 73 65 20 29 7b 0a 20 20 20 20 64 65 73 74 53 74  se ){.    destSt
1b3e0 65 70 32 20 3d 20 64 65 73 74 49 66 46 61 6c 73  ep2 = destIfFals
1b3f0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
1b400 64 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74  destStep2 = dest
1b410 53 74 65 70 36 20 3d 20 73 71 6c 69 74 65 33 56  Step6 = sqlite3V
1b420 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
1b430 72 73 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rse);.  }.  for(
1b440 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
1b450 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
1b460 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  p = sqlite3Vecto
1b470 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 45  rFieldSubexpr(pE
1b480 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a  xpr->pLeft, i);.
1b490 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1b4a0 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20  xprCanBeNull(p) 
1b4b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1b4c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b4d0 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c  _IsNull, rLhs+i,
1b4e0 20 64 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20   destStep2);.   
1b4f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1b500 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  v);.    }.  }.. 
1b510 20 2f 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65   /* Step 3.  The
1b520 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77   LHS is now know
1b530 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c  n to be non-NULL
1b540 2e 20 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79  .  Do the binary
1b550 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20   search.  ** of 
1b560 74 68 65 20 52 48 53 20 75 73 69 6e 67 20 74 68  the RHS using th
1b570 65 20 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65  e LHS as a probe
1b580 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65  .  If found, the
1b590 20 72 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20   result is.  ** 
1b5a0 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  true..  */.  if(
1b5b0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
1b5c0 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a  _ROWID ){.    /*
1b5d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
1b5e0 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f  he RHS is the RO
1b5f0 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74  WID of table b-t
1b600 72 65 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c  ree and so we al
1b610 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74  so.    ** know t
1b620 68 61 74 20 74 68 65 20 52 48 53 20 69 73 20 6e  hat the RHS is n
1b630 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c  on-NULL.  Hence,
1b640 20 77 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70   we combine step
1b650 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a  s 3 and 4.    **
1b660 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f   into a single o
1b670 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71  pcode. */.    sq
1b680 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1b690 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
1b6a0 20 69 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c   iTab, destIfFal
1b6b0 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20 56  se, rLhs);.    V
1b6c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b6d0 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70 20      addrTruthOp 
1b6e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1b6f0 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
1b700 20 20 2f 2a 20 52 65 74 75 72 6e 20 54 72 75 65    /* Return True
1b710 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
1b720 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b730 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74  p4(v, OP_Affinit
1b740 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72  y, rLhs, nVector
1b750 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74  , 0, zAff, nVect
1b760 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73  or);.    if( des
1b770 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
1b780 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Null ){.      /*
1b790 20 43 6f 6d 62 69 6e 65 20 53 74 65 70 20 33 20   Combine Step 3 
1b7a0 61 6e 64 20 53 74 65 70 20 35 20 69 6e 74 6f 20  and Step 5 into 
1b7b0 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20  a single opcode 
1b7c0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1b7d0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1b7e0 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 54   OP_NotFound, iT
1b7f0 61 62 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  ab, destIfFalse,
1b800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b810 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73              rLhs
1b820 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65  , nVector); Vdbe
1b830 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1b840 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45     goto sqlite3E
1b850 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
1b860 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
1b870 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20 33   Ordinary Step 3
1b880 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  , for the case w
1b890 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e  here FALSE and N
1b8a0 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74  ULL are distinct
1b8b0 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74   */.    addrTrut
1b8c0 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  hOp = sqlite3Vdb
1b8d0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1b8e0 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 30 2c  _Found, iTab, 0,
1b8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65         rLhs, nVe
1b920 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72  ctor); VdbeCover
1b930 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f  age(v);.  }..  /
1b940 2a 20 53 74 65 70 20 34 2e 20 20 49 66 20 74 68  * Step 4.  If th
1b950 65 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e 20 74  e RHS is known t
1b960 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e  o be non-NULL an
1b970 64 20 77 65 20 64 69 64 20 6e 6f 74 20 66 69 6e  d we did not fin
1b980 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63 68 20  d.  ** an match 
1b990 6f 6e 20 74 68 65 20 73 65 61 72 63 68 20 61 62  on the search ab
1b9a0 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ove, then the re
1b9b0 73 75 6c 74 20 6d 75 73 74 20 62 65 20 46 41 4c  sult must be FAL
1b9c0 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  SE..  */.  if( r
1b9d0 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 6e 56  RhsHasNull && nV
1b9e0 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20 20 20  ector==1 ){.    
1b9f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ba00 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  2(v, OP_NotNull,
1ba10 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65   rRhsHasNull, de
1ba20 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
1ba30 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1ba40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
1ba50 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  5.  If we do not
1ba60 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
1ba70 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
1ba80 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a  en NULL and.  **
1ba90 20 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a 75 73   FALSE, then jus
1baa0 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20  t return false. 
1bab0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
1bac0 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
1bad0 75 6c 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62  ull ) sqlite3Vdb
1bae0 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46  eGoto(v, destIfF
1baf0 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 74 65  alse);..  /* Ste
1bb00 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  p 6: Loop throug
1bb10 68 20 72 6f 77 73 20 6f 66 20 74 68 65 20 52 48  h rows of the RH
1bb20 53 2e 20 20 43 6f 6d 70 61 72 65 20 65 61 63 68  S.  Compare each
1bb30 20 72 6f 77 20 74 6f 20 74 68 65 20 4c 48 53 2e   row to the LHS.
1bb40 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 63 6f 6d  .  ** If any com
1bb50 70 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c  parison is NULL,
1bb60 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
1bb70 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 61 6c   is NULL.  If al
1bb80 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  l.  ** compariso
1bb90 6e 73 20 61 72 65 20 46 41 4c 53 45 20 74 68 65  ns are FALSE the
1bba0 6e 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75  n the final resu
1bbb0 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a 20 20 2a  lt is FALSE..  *
1bbc0 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73 63 61  *.  ** For a sca
1bbd0 6c 61 72 20 4c 48 53 2c 20 69 74 20 69 73 20 73  lar LHS, it is s
1bbe0 75 66 66 69 63 69 65 6e 74 20 74 6f 20 63 68 65  ufficient to che
1bbf0 63 6b 20 6a 75 73 74 20 74 68 65 20 66 69 72 73  ck just the firs
1bc00 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20 74 68  t row.  ** of th
1bc10 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66  e RHS..  */.  if
1bc20 28 20 64 65 73 74 53 74 65 70 36 20 29 20 73 71  ( destStep6 ) sq
1bc30 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1bc40 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 53 74 65  Label(v, destSte
1bc50 70 36 29 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d  p6);.  addrTop =
1bc60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bc70 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
1bc80 20 69 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c   iTab, destIfFal
1bc90 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  se);.  VdbeCover
1bca0 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 6e 56  age(v);.  if( nV
1bcb0 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64  ector>1 ){.    d
1bcc0 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c  estNotNull = sql
1bcd0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1bce0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 65 6c  l(pParse);.  }el
1bcf0 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e  se{.    /* For n
1bd00 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69  Vector==1, combi
1bd10 6e 65 20 73 74 65 70 73 20 36 20 61 6e 64 20 37  ne steps 6 and 7
1bd20 20 62 79 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   by immediately 
1bd30 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a  returning.    **
1bd40 20 46 41 4c 53 45 20 69 66 20 74 68 65 20 66 69   FALSE if the fi
1bd50 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  rst comparison i
1bd60 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20  s not NULL */.  
1bd70 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20    destNotNull = 
1bd80 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d  destIfFalse;.  }
1bd90 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
1bda0 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
1bdb0 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f   Expr *p;.    Co
1bdc0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
1bdd0 20 20 69 6e 74 20 72 33 20 3d 20 73 71 6c 69 74    int r3 = sqlit
1bde0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
1bdf0 72 73 65 29 3b 0a 20 20 20 20 70 20 3d 20 73 71  rse);.    p = sq
1be00 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
1be10 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69  Subexpr(pLeft, i
1be20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  );.    pColl = s
1be30 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1be40 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
1be50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1be60 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
1be70 2c 20 69 54 61 62 2c 20 69 2c 20 72 33 29 3b 0a  , iTab, i, r3);.
1be80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1be90 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp4(v, OP_Ne, 
1bea0 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74 4e  rLhs+i, destNotN
1beb0 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20 20  ull, r3,.       
1bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1bed0 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
1bee0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56 64  COLLSEQ);.    Vd
1bef0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1bf00 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1bf10 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1bf20 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   r3);.  }.  sqli
1bf30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1bf40 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
1bf50 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20  tIfNull);.  if( 
1bf60 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  nVector>1 ){.   
1bf70 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1bf80 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
1bf90 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  NotNull);.    sq
1bfa0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1bfb0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
1bfc0 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20  , addrTop+1);.  
1bfd0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1bfe0 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70 20  );..    /* Step 
1bff0 37 3a 20 20 49 66 20 77 65 20 72 65 61 63 68 20  7:  If we reach 
1c000 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b  this point, we k
1c010 6e 6f 77 20 74 68 61 74 20 74 68 65 20 72 65 73  now that the res
1c020 75 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ult must.    ** 
1c030 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20  be false. */.   
1c040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c050 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1c060 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
1c070 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20    }..  /* Jumps 
1c080 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  here in order to
1c090 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f   return true. */
1c0a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
1c0b0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 72  mpHere(v, addrTr
1c0c0 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33  uthOp);..sqlite3
1c0d0 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73  ExprCodeIN_finis
1c0e0 68 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73 21  hed:.  if( rLhs!
1c0f0 3d 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c 69  =rLhsOrig ) sqli
1c100 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1c110 67 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29 3b  g(pParse, rLhs);
1c120 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
1c130 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22  v, "end IN expr"
1c140 29 29 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43  ));.sqlite3ExprC
1c150 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a  odeIN_oom_error:
1c160 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1c170 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d  (pParse->db, aiM
1c180 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ap);.  sqlite3Db
1c190 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
1c1a0 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66   zAff);.}.#endif
1c1b0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1c1c0 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
1c1d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c1e0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1c1f0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
1c200 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
1c210 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
1c220 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
1c230 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65  * value describe
1c240 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  d by z[0..n-1] i
1c250 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
1c260 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d  m..**.** The z[]
1c270 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f   string will pro
1c280 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72  bably not be zer
1c290 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  o-terminated.  B
1c2a0 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20  ut the .** z[n] 
1c2b0 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61  character is gua
1c2c0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f  ranteed to be so
1c2d0 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65  mething that doe
1c2e0 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69  s not look.** li
1c2f0 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ke the continuat
1c300 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ion of the numbe
1c310 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
1c320 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20  d codeReal(Vdbe 
1c330 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
1c340 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61  z, int negateFla
1c350 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
1c360 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29  if( ALWAYS(z!=0)
1c370 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76   ){.    double v
1c380 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  alue;.    sqlite
1c390 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c  3AtoF(z, &value,
1c3a0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1c3b0 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (z), SQLITE_UTF8
1c3c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
1c3d0 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c  sqlite3IsNaN(val
1c3e0 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65  ue) ); /* The ne
1c3f0 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74  w AtoF never ret
1c400 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20  urns NaN */.    
1c410 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29  if( negateFlag )
1c420 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b   value = -value;
1c430 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c440 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
1c450 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20  _Real, 0, iMem, 
1c460 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20  0, (u8*)&value, 
1c470 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a  P4_REAL);.  }.}.
1c480 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47  #endif.../*.** G
1c490 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
1c4a0 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
1c4b0 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
1c4c0 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
1c4d0 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  text z[0..n-1] i
1c4e0 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
1c4f0 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e  m..**.** Expr.u.
1c500 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73  zToken is always
1c510 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74   UTF8 and zero-t
1c520 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74  erminated..*/.st
1c530 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e  atic void codeIn
1c540 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61  teger(Parse *pPa
1c550 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1c560 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69  , int negFlag, i
1c570 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65  nt iMem){.  Vdbe
1c580 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1c590 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72  dbe;.  if( pExpr
1c5a0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
1c5b0 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74  Value ){.    int
1c5c0 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56   i = pExpr->u.iV
1c5d0 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  alue;.    assert
1c5e0 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( i>=0 );.    if
1c5f0 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20  ( negFlag ) i = 
1c600 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  -i;.    sqlite3V
1c610 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c620 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d  Integer, i, iMem
1c630 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c640 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76  int c;.    i64 v
1c650 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  alue;.    const 
1c660 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d  char *z = pExpr-
1c670 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61  >u.zToken;.    a
1c680 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
1c690 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65     c = sqlite3De
1c6a0 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26  cOrHexToI64(z, &
1c6b0 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20  value);.    if( 
1c6c0 28 63 3d 3d 33 20 26 26 20 21 6e 65 67 46 6c 61  (c==3 && !negFla
1c6d0 67 29 20 7c 7c 20 28 63 3d 3d 32 29 20 7c 7c 20  g) || (c==2) || 
1c6e0 28 6e 65 67 46 6c 61 67 20 26 26 20 76 61 6c 75  (negFlag && valu
1c6f0 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36  e==SMALLEST_INT6
1c700 34 29 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  4)){.#ifdef SQLI
1c710 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1c720 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c  _POINT.      sql
1c730 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c740 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20  rse, "oversized 
1c750 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20  integer: %s%s", 
1c760 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20  negFlag ? "-" : 
1c770 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69  "", z);.#else.#i
1c780 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c790 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20  T_HEX_INTEGER.  
1c7a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
1c7b0 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c  strnicmp(z,"0x",
1c7c0 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
1c7d0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1c7e0 28 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69  (pParse, "hex li
1c7f0 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25  teral too big: %
1c800 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d  s%s", negFlag?"-
1c810 22 3a 22 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d  ":"",z);.      }
1c820 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
1c830 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65    {.        code
1c840 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c  Real(v, z, negFl
1c850 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ag, iMem);.     
1c860 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
1c870 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  lse{.      if( n
1c880 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20  egFlag ){ value 
1c890 3d 20 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c 45 53  = c==3 ? SMALLES
1c8a0 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65  T_INT64 : -value
1c8b0 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ; }.      sqlite
1c8c0 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
1c8d0 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20  v, OP_Int64, 0, 
1c8e0 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76  iMem, 0, (u8*)&v
1c8f0 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b  alue, P4_INT64);
1c900 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
1c910 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1c920 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69  that will load i
1c930 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72 65 67  nto register reg
1c940 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68 61 74  Out a value that
1c950 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61   is.** appropria
1c960 74 65 20 66 6f 72 20 74 68 65 20 69 49 64 78 43  te for the iIdxC
1c970 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol-th column of 
1c980 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76  index pIdx..*/.v
1c990 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1c9a0 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75  odeLoadIndexColu
1c9b0 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
1c9c0 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61 72  rse,  /* The par
1c9d0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1c9e0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
1c9f0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
1ca00 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74  hose column is t
1ca10 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  o be loaded */. 
1ca20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
1ca30 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1ca40 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 72  ing to a table r
1ca50 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ow */.  int iIdx
1ca60 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20 63  Col,    /* The c
1ca70 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
1ca80 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20  ex to be loaded 
1ca90 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20  */.  int regOut 
1caa0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
1cab0 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76  e index column v
1cac0 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
1cad0 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31  ister */.){.  i1
1cae0 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64 78  6 iTabCol = pIdx
1caf0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43  ->aiColumn[iIdxC
1cb00 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62 43  ol];.  if( iTabC
1cb10 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20  ol==XN_EXPR ){. 
1cb20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1cb30 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20  >aColExpr );.   
1cb40 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
1cb50 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69  ColExpr->nExpr>i
1cb60 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50  IdxCol );.    pP
1cb70 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d  arse->iSelfTab =
1cb80 20 69 54 61 62 43 75 72 20 2b 20 31 3b 0a 20 20   iTabCur + 1;.  
1cb90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1cba0 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49  eCopy(pParse, pI
1cbb0 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b  dx->aColExpr->a[
1cbc0 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20  iIdxCol].pExpr, 
1cbd0 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 70 50 61  regOut);.    pPa
1cbe0 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20  rse->iSelfTab = 
1cbf0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1cc00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1cc10 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
1cc20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70  pParse->pVdbe, p
1cc30 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69 54 61  Idx->pTable, iTa
1cc40 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20  bCur,.          
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc60 20 20 20 20 20 20 20 20 20 20 69 54 61 62 43 6f            iTabCo
1cc70 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  l, regOut);.  }.
1cc80 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1cc90 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63  e code to extrac
1cca0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
1ccb0 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
1ccc0 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f  n of a table..*/
1ccd0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1cce0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
1ccf0 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76  Table(.  Vdbe *v
1cd00 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
1cd10 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
1cd20 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62  ruction */.  Tab
1cd30 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20  le *pTab,    /* 
1cd40 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  The table contai
1cd50 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a  ning the value *
1cd60 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
1cd70 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1cd80 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68 65   cursor.  Or the
1cd90 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20 57   PK cursor for W
1cda0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a  ITHOUT ROWID */.
1cdb0 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
1cdc0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1cdd0 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72  e column to extr
1cde0 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  act */.  int reg
1cdf0 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72  Out      /* Extr
1ce00 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  act the value in
1ce10 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72  to this register
1ce20 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 54 61   */.){.  if( pTa
1ce30 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b==0 ){.    sqli
1ce40 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1ce50 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
1ce60 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75  Cur, iCol, regOu
1ce70 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
1ce80 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30    }.  if( iCol<0
1ce90 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e   || iCol==pTab->
1cea0 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  iPKey ){.    sql
1ceb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1cec0 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
1ced0 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Cur, regOut);.  
1cee0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f  }else{.    int o
1cef0 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54  p = IsVirtual(pT
1cf00 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e  ab) ? OP_VColumn
1cf10 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20   : OP_Column;.  
1cf20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a    int x = iCol;.
1cf30 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
1cf40 64 28 70 54 61 62 29 20 26 26 20 21 49 73 56 69  d(pTab) && !IsVi
1cf50 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
1cf60 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
1cf70 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71  ColumnOfIndex(sq
1cf80 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
1cf90 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c  ndex(pTab), iCol
1cfa0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1cfb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1cfc0 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78  , op, iTabCur, x
1cfd0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20  , regOut);.  }. 
1cfe0 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
1cff0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
1d000 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62  nDefault(v, pTab
1d010 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  , iCol, regOut);
1d020 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1d030 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1d040 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68   will extract th
1d050 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
1d060 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c  umn from.** tabl
1d070 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65  e pTab and store
1d080 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
1d090 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52  e in register iR
1d0a0 65 67 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  eg. .**.** There
1d0b0 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
1d0c0 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20   cursor to pTab 
1d0d0 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74  in iTable when t
1d0e0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
1d0f0 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43  s called.  If iC
1d100 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64  olumn<0 then cod
1d110 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  e is generated t
1d120 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65  hat extracts the
1d130 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73   rowid..*/.int s
1d140 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1d150 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  tColumn(.  Parse
1d160 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
1d170 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
1d180 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
1d190 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
1d1a0 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Tab,     /* Desc
1d1b0 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
1d1c0 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64  able we are read
1d1d0 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ing from */.  in
1d1e0 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f  t iColumn,     /
1d1f0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
1d200 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  able column */. 
1d210 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1d220 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1d230 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1d240 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1d250 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53  Reg,        /* S
1d260 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72  tore results her
1d270 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  e */.  u8 p5    
1d280 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61          /* P5 va
1d290 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d  lue for OP_Colum
1d2a0 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a  n + FLAGS */.){.
1d2b0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1d2c0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
1d2d0 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
1d2e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1d2f0 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
1d300 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20  , pTab, iTable, 
1d310 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a  iColumn, iReg);.
1d320 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20    if( p5 ){.    
1d330 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1d340 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 0a  eP5(v, p5);.  }.
1d350 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
1d360 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1d370 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f   code to move co
1d380 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73  ntent from regis
1d390 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72  ters iFrom...iFr
1d3a0 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65  om+nReg-1.** ove
1d3b0 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52  r to iTo..iTo+nR
1d3c0 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eg-1..*/.void sq
1d3d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
1d3e0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1d3f0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
1d400 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  iTo, int nReg){.
1d410 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e    assert( iFrom>
1d420 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72  =iTo+nReg || iFr
1d430 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a  om+nReg<=iTo );.
1d440 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d450 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op3(pParse->pVdb
1d460 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f  e, OP_Move, iFro
1d470 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 7d  m, iTo, nReg);.}
1d480 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
1d490 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  a scalar express
1d4a0 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b  ion node to a TK
1d4b0 5f 52 45 47 49 53 54 45 52 20 72 65 66 65 72 65  _REGISTER refere
1d4c0 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69 73 74 65  ncing.** registe
1d4d0 72 20 69 52 65 67 2e 20 20 54 68 65 20 63 61 6c  r iReg.  The cal
1d4e0 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
1d4f0 74 68 61 74 20 69 52 65 67 20 61 6c 72 65 61 64  that iReg alread
1d500 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  y contains.** th
1d510 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
1d520 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
1d530 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1d540 69 64 20 65 78 70 72 54 6f 52 65 67 69 73 74 65  id exprToRegiste
1d550 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  r(Expr *pExpr, i
1d560 6e 74 20 69 52 65 67 29 7b 0a 20 20 45 78 70 72  nt iReg){.  Expr
1d570 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70   *p = sqlite3Exp
1d580 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c  rSkipCollateAndL
1d590 69 6b 65 6c 79 28 70 45 78 70 72 29 3b 0a 20 20  ikely(pExpr);.  
1d5a0 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a  p->op2 = p->op;.
1d5b0 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47    p->op = TK_REG
1d5c0 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62  ISTER;.  p->iTab
1d5d0 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70  le = iReg;.  Exp
1d5e0 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70  rClearProperty(p
1d5f0 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f  , EP_Skip);.}../
1d600 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61 6e  *.** Evaluate an
1d610 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69 74   expression (eit
1d620 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20  her a vector or 
1d630 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  a scalar express
1d640 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a  ion) and store.*
1d650 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  * the result in 
1d660 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d 70  continguous temp
1d670 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 2e  orary registers.
1d680 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
1d690 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72  ex of.** the fir
1d6a0 73 74 20 72 65 67 69 73 74 65 72 20 75 73 65 64  st register used
1d6b0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
1d6c0 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sult..**.** If t
1d6d0 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75  he returned resu
1d6e0 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20 61  lt register is a
1d6f0 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c 61   temporary scala
1d700 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69  r, then also wri
1d710 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69 73  te.** that regis
1d720 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  ter number into 
1d730 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49 66  *piFreeable.  If
1d740 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65   the returned re
1d750 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a 2a  sult register.**
1d760 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
1d770 61 72 79 20 6f 72 20 69 66 20 74 68 65 20 65 78  ary or if the ex
1d780 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 65  pression is a ve
1d790 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65 65  ctor set *piFree
1d7a0 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f  able.** to 0..*/
1d7b0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
1d7c0 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73 65  CodeVector(Parse
1d7d0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1d7e0 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61 62  p, int *piFreeab
1d7f0 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73 75  le){.  int iResu
1d800 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c  lt;.  int nResul
1d810 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  t = sqlite3ExprV
1d820 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20  ectorSize(p);.  
1d830 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29  if( nResult==1 )
1d840 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20  {.    iResult = 
1d850 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1d860 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  emp(pParse, p, p
1d870 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65  iFreeable);.  }e
1d880 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65 65  lse{.    *piFree
1d890 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  able = 0;.    if
1d8a0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  ( p->op==TK_SELE
1d8b0 43 54 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  CT ){.#if SQLITE
1d8c0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1d8d0 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 30       iResult = 0
1d8e0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 52  ;.#else.      iR
1d8f0 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 43  esult = sqlite3C
1d900 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
1d910 72 73 65 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a  rse, p);.#endif.
1d920 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d930 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 52   int i;.      iR
1d940 65 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e  esult = pParse->
1d950 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50  nMem+1;.      pP
1d960 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
1d970 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 6f 72  esult;.      for
1d980 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 3b  (i=0; i<nResult;
1d990 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
1d9a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61  qlite3ExprCodeFa
1d9b0 63 74 6f 72 61 62 6c 65 28 70 50 61 72 73 65 2c  ctorable(pParse,
1d9c0 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69   p->x.pList->a[i
1d9d0 5d 2e 70 45 78 70 72 2c 20 69 2b 69 52 65 73 75  ].pExpr, i+iResu
1d9e0 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lt);.      }.   
1d9f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1da00 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  iResult;.}.../*.
1da10 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1da20 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
1da30 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61  t Vdbe to evalua
1da40 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  te the given.** 
1da50 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74  expression.  Att
1da60 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68  empt to store th
1da70 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  e results in reg
1da80 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a  ister "target"..
1da90 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
1daa0 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73  gister where res
1dab0 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e  ults are stored.
1dac0 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73  .**.** With this
1dad0 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20   routine, there 
1dae0 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20  is no guarantee 
1daf0 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c  that results wil
1db00 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69  l.** be stored i
1db10 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  n target.  The r
1db20 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73  esult might be s
1db30 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74  tored in some ot
1db40 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  her.** register 
1db50 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69  if it is conveni
1db60 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54  ent to do so.  T
1db70 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1db80 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63  ion.** must chec
1db90 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  k the return cod
1dba0 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72  e and move the r
1dbb0 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65  esults to the de
1dbc0 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65  sired.** registe
1dbd0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
1dbe0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1dbf0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1dc00 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1dc10 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
1dc20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1dc30 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75  be;  /* The VM u
1dc40 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1dc50 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  n */.  int op;  
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc70 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62   /* The opcode b
1dc80 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
1dc90 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67  int inReg = targ
1dca0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  et;       /* Res
1dcb0 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72  ults stored in r
1dcc0 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f  egister inReg */
1dcd0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1dce0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
1dcf0 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
1dd00 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
1dd10 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
1dd20 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20  t regFree2 = 0; 
1dd30 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
1dd40 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
1dd50 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
1dd60 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c  ter */.  int r1,
1dd70 20 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20   r2;            
1dd80 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65     /* Various re
1dd90 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a  gister numbers *
1dda0 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20  /.  Expr tempX; 
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ddc0 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65   Temporary expre
1ddd0 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20  ssion node */.  
1dde0 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61  int p5 = 0;..  a
1ddf0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
1de00 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
1de10 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
1de20 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73   v==0 ){.    ass
1de30 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
1de40 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1de50 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1de60 20 7d 0a 0a 65 78 70 72 5f 63 6f 64 65 5f 64 6f   }..expr_code_do
1de70 6f 76 65 72 3a 0a 20 20 69 66 28 20 70 45 78 70  over:.  if( pExp
1de80 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d  r==0 ){.    op =
1de90 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73   TK_NULL;.  }els
1dea0 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70  e{.    op = pExp
1deb0 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69  r->op;.  }.  swi
1dec0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
1ded0 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
1dee0 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
1def0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
1df00 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
1df10 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
1df20 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
1df30 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
1df40 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20  [pExpr->iAgg];. 
1df50 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e       if( !pAggIn
1df60 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29  fo->directMode )
1df70 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1df80 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29  ( pCol->iMem>0 )
1df90 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1dfa0 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20   pCol->iMem;.   
1dfb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67     }else if( pAg
1dfc0 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e  gInfo->useSortin
1dfd0 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  gIdx ){.        
1dfe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1dff0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
1e000 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e  pAggInfo->sortin
1e010 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20  gIdxPTab,.      
1e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e030 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
1e040 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72  orterColumn, tar
1e050 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  get);.        re
1e060 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e070 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74     }.      /* Ot
1e080 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68  herwise, fall th
1e090 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43  ru into the TK_C
1e0a0 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20  OLUMN case */.  
1e0b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e0c0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1e0d0 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70 72  int iTab = pExpr
1e0e0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
1e0f0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1e100 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 69  rty(pExpr, EP_Fi
1e110 78 65 64 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  xedCol) ){.     
1e120 20 20 20 2f 2a 20 54 68 69 73 20 43 4f 4c 55 4d     /* This COLUM
1e130 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  N expression is 
1e140 72 65 61 6c 6c 79 20 61 20 63 6f 6e 73 74 61 6e  really a constan
1e150 74 20 64 75 65 20 74 6f 20 57 48 45 52 45 20 63  t due to WHERE c
1e160 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  lause.        **
1e170 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e   constraints, an
1e180 64 20 74 68 61 74 20 63 6f 6e 73 74 61 6e 74 20  d that constant 
1e190 69 73 20 63 6f 64 65 64 20 62 79 20 74 68 65 20  is coded by the 
1e1a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 0a 20 20 20  pExpr->pLeft.   
1e1b0 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 73       ** expresss
1e1c0 69 6f 6e 2e 20 20 48 6f 77 65 76 65 72 2c 20 6d  ion.  However, m
1e1d0 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6e  ake sure the con
1e1e0 73 74 61 6e 74 20 68 61 73 20 74 68 65 20 63 6f  stant has the co
1e1f0 72 72 65 63 74 0a 20 20 20 20 20 20 20 20 2a 2a  rrect.        **
1e200 20 64 61 74 61 74 79 70 65 20 62 79 20 61 70 70   datatype by app
1e210 6c 79 69 6e 67 20 74 68 65 20 41 66 66 69 6e 69  lying the Affini
1e220 74 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ty of the table 
1e230 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 0a 20 20  column to the.  
1e240 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 61 6e        ** constan
1e250 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
1e260 20 20 20 20 20 20 69 6e 74 20 69 52 65 67 20 3d        int iReg =
1e270 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e280 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1e290 45 78 70 72 2d 3e 70 4c 65 66 74 2c 74 61 72 67  Expr->pLeft,targ
1e2a0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  et);.        int
1e2b0 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61   aff = sqlite3Ta
1e2c0 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  bleColumnAffinit
1e2d0 79 28 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 2c  y(pExpr->y.pTab,
1e2e0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
1e2f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 66  ;.        if( af
1e300 66 3e 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  f>SQLITE_AFF_BLO
1e310 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  B ){.          s
1e320 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1e330 20 7a 41 66 66 5b 5d 20 3d 20 22 42 5c 30 30 30   zAff[] = "B\000
1e340 43 5c 30 30 30 44 5c 30 30 30 45 22 3b 0a 20 20  C\000D\000E";.  
1e350 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e360 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3d  SQLITE_AFF_BLOB=
1e370 3d 27 41 27 20 29 3b 0a 20 20 20 20 20 20 20 20  ='A' );.        
1e380 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
1e390 5f 41 46 46 5f 54 45 58 54 3d 3d 27 42 27 20 29  _AFF_TEXT=='B' )
1e3a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e3b0 69 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a  iReg!=target ){.
1e3c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1e3d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e3e0 20 4f 50 5f 53 43 6f 70 79 2c 20 69 52 65 67 2c   OP_SCopy, iReg,
1e3f0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1e400 20 20 20 20 20 20 69 52 65 67 20 3d 20 74 61 72        iReg = tar
1e410 67 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  get;.          }
1e420 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1e430 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1e440 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 69 52 65  OP_Affinity, iRe
1e450 67 2c 20 31 2c 20 30 2c 0a 20 20 20 20 20 20 20  g, 1, 0,.       
1e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e470 20 20 20 20 20 26 7a 41 66 66 5b 28 61 66 66 2d       &zAff[(aff-
1e480 27 42 27 29 2a 32 5d 2c 20 50 34 5f 53 54 41 54  'B')*2], P4_STAT
1e490 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IC);.        }. 
1e4a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 52         return iR
1e4b0 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  eg;.      }.    
1e4c0 20 20 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a    if( iTab<0 ){.
1e4d0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
1e4e0 73 65 2d 3e 69 53 65 6c 66 54 61 62 3c 30 20 29  se->iSelfTab<0 )
1e4f0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  {.          /* G
1e500 65 6e 65 72 61 74 69 6e 67 20 43 48 45 43 4b 20  enerating CHECK 
1e510 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 69  constraints or i
1e520 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 70 61  nserting into pa
1e530 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20  rtial index */. 
1e540 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1e550 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2d  pExpr->iColumn -
1e560 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
1e570 62 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  b;.        }else
1e580 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  {.          /* C
1e590 6f 64 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73  oding an express
1e5a0 69 6f 6e 20 74 68 61 74 20 69 73 20 70 61 72 74  ion that is part
1e5b0 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 77 68 65   of an index whe
1e5c0 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a  re column names.
1e5d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20            ** in 
1e5e0 74 68 65 20 69 6e 64 65 78 20 72 65 66 65 72 20  the index refer 
1e5f0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  to the table to 
1e600 77 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20  which the index 
1e610 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20 20 20  belongs */.     
1e620 20 20 20 20 20 69 54 61 62 20 3d 20 70 50 61 72       iTab = pPar
1e630 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 2d 20 31  se->iSelfTab - 1
1e640 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e650 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1e660 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e670 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
1e680 2c 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 2c  , pExpr->y.pTab,
1e690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
1e6c0 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20  iTab, target,.  
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1e6f0 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a  pr->op2);.    }.
1e700 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
1e710 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64  GER: {.      cod
1e720 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c  eInteger(pParse,
1e730 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65   pExpr, 0, targe
1e740 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1e750 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20   target;.    }. 
1e760 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 45 46     case TK_TRUEF
1e770 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ALSE: {.      sq
1e780 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e790 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73  v, OP_Integer, s
1e7a0 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56  qlite3ExprTruthV
1e7b0 61 6c 75 65 28 70 45 78 70 72 29 2c 20 74 61 72  alue(pExpr), tar
1e7c0 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  get);.      retu
1e7d0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1e7e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e7f0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1e800 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  INT.    case TK_
1e810 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  FLOAT: {.      a
1e820 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1e830 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e840 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1e850 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
1e860 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e870 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1e880 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1e890 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
1e8a0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
1e8b0 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  NG: {.      asse
1e8c0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1e8d0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1e8e0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1e8f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
1e900 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65  dString(v, targe
1e910 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t, pExpr->u.zTok
1e920 65 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  en);.      retur
1e930 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1e940 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
1e950 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1e960 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e970 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
1e980 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1e990 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
1e9a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e9b0 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
1e9c0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
1e9d0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  : {.      int n;
1e9e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1e9f0 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72  r *z;.      char
1ea00 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61   *zBlob;.      a
1ea10 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1ea20 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1ea30 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1ea40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1ea50 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
1ea60 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75  ='x' || pExpr->u
1ea70 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20  .zToken[0]=='X' 
1ea80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ea90 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1eaa0 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [1]=='\'' );.   
1eab0 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75     z = &pExpr->u
1eac0 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20  .zToken[2];.    
1ead0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
1eae0 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20  len30(z) - 1;.  
1eaf0 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d      assert( z[n]
1eb00 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
1eb10 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48  zBlob = sqlite3H
1eb20 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33  exToBlob(sqlite3
1eb30 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29  VdbeDb(v), z, n)
1eb40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1eb50 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1eb60 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65  Blob, n/2, targe
1eb70 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f  t, 0, zBlob, P4_
1eb80 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
1eb90 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1eba0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1ebb0 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
1ebc0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1ebd0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1ebe0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1ebf0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1ec00 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1ec10 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20  .zToken!=0 );.  
1ec20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1ec30 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d  r->u.zToken[0]!=
1ec40 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1ec50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ec60 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
1ec70 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72  pr->iColumn, tar
1ec80 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  get);.      if( 
1ec90 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1eca0 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]!=0 ){.       
1ecb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1ecc0 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d   sqlite3VListNum
1ecd0 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70  ToName(pParse->p
1ece0 56 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 69 43  VList, pExpr->iC
1ecf0 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
1ed00 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1ed10 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20  .zToken[0]=='?' 
1ed20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d  || strcmp(pExpr-
1ed30 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30  >u.zToken, z)==0
1ed40 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   );.        pPar
1ed50 73 65 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20  se->pVList[0] = 
1ed60 30 3b 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 56  0; /* Indicate V
1ed70 4c 69 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67  List may no long
1ed80 65 72 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a  er be enlarged *
1ed90 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
1eda0 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
1edb0 20 28 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54   (char*)z, P4_ST
1edc0 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
1edd0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1ede0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  et;.    }.    ca
1edf0 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
1ee00 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1ee10 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
1ee20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1ee30 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20  TE_OMIT_CAST.   
1ee40 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b   case TK_CAST: {
1ee50 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  .      /* Expres
1ee60 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
1ee70 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20  m:   CAST(pLeft 
1ee80 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20  AS token) */.   
1ee90 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
1eea0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1eeb0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1eec0 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
1eed0 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
1eee0 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  =target ){.     
1eef0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ef00 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
1ef10 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
1ef20 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
1ef30 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
1ef40 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1ef50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ef60 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20  Cast, target,.  
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef80 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66 66        sqlite3Aff
1ef90 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d  inityType(pExpr-
1efa0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a  >u.zToken, 0));.
1efb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 6e 52        return inR
1efc0 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  eg;.    }.#endif
1efd0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1efe0 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65  CAST */.    case
1eff0 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
1f000 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20   TK_ISNOT:.     
1f010 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53   op = (op==TK_IS
1f020 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e  ) ? TK_EQ : TK_N
1f030 45 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 53 51  E;.      p5 = SQ
1f040 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20  LITE_NULLEQ;.   
1f050 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75     /* fall-throu
1f060 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  gh */.    case T
1f070 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
1f080 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
1f090 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
1f0a0 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
1f0b0 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
1f0c0 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 45 78  K_EQ: {.      Ex
1f0d0 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
1f0e0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
1f0f0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
1f100 73 56 65 63 74 6f 72 28 70 4c 65 66 74 29 20 29  sVector(pLeft) )
1f110 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 56 65  {.        codeVe
1f120 63 74 6f 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ctorCompare(pPar
1f130 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
1f140 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20  t, op, p5);.    
1f150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f160 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f170 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f180 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  , pLeft, &regFre
1f190 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  e1);.        r2 
1f1a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f1b0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f1c0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1f1d0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20  gFree2);.       
1f1e0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1f1f0 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 45 78 70  rse, pLeft, pExp
1f200 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1f210 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
1f220 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45  2, inReg, SQLITE
1f230 5f 53 54 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a  _STOREP2 | p5);.
1f240 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1f250 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
1f260 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
1f270 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1f280 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
1f290 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1f2a0 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
1f2b0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
1f2c0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1f2d0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
1f2e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1f2f0 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
1f300 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
1f310 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1f320 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
1f330 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1f340 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65  K_GE==OP_Ge); te
1f350 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
1f360 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1f370 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
1f380 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1f390 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
1f3a0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
1f3b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1f3c0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  f(v,op==OP_Eq);.
1f3d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1f3e0 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
1f3f0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
1f400 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1f410 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  f(v,op==OP_Ne);.
1f420 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f430 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1f440 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1f450 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1f460 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f470 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f480 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
1f490 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
1f4a0 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
1f4b0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
1f4c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
1f4d0 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
1f4e0 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
1f4f0 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
1f500 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
1f510 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a   case TK_SLASH:.
1f520 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
1f530 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
1f540 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73  RSHIFT: .    cas
1f550 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
1f560 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f570 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20  AND==OP_And );  
1f580 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1f590 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  se( op==TK_AND )
1f5a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f5b0 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20  TK_OR==OP_Or ); 
1f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
1f5d0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52  tcase( op==TK_OR
1f5e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f5f0 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64  ( TK_PLUS==OP_Ad
1f600 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 74  d );           t
1f610 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f620 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73  PLUS );.      as
1f630 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d  sert( TK_MINUS==
1f640 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20  OP_Subtract );  
1f650 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f660 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20  =TK_MINUS );.   
1f670 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45     assert( TK_RE
1f680 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20  M==OP_Remainder 
1f690 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
1f6a0 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a  ( op==TK_REM );.
1f6b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f6c0 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41  _BITAND==OP_BitA
1f6d0 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  nd );      testc
1f6e0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41  ase( op==TK_BITA
1f6f0 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ND );.      asse
1f700 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50  rt( TK_BITOR==OP
1f710 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20  _BitOr );       
1f720 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f730 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20  K_BITOR );.     
1f740 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53   assert( TK_SLAS
1f750 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20  H==OP_Divide ); 
1f760 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f770 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a  op==TK_SLASH );.
1f780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f790 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _LSHIFT==OP_Shif
1f7a0 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74 63  tLeft );   testc
1f7b0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49  ase( op==TK_LSHI
1f7c0 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  FT );.      asse
1f7d0 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f  rt( TK_RSHIFT==O
1f7e0 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 20  P_ShiftRight ); 
1f7f0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f800 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_RSHIFT );.    
1f810 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e    assert( TK_CON
1f820 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29  CAT==OP_Concat )
1f830 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
1f840 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29   op==TK_CONCAT )
1f850 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1f860 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f870 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f880 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1f890 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
1f8a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f8b0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f8c0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1f8d0 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e2);.      sqlit
1f8e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1f8f0 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  op, r2, r1, targ
1f900 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  et);.      testc
1f910 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1f920 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1f930 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1f940 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f950 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f960 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
1f970 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
1f980 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
1f990 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
1f9a0 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
1f9b0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
1f9c0 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
1f9d0 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72  codeInteger(pPar
1f9e0 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61  se, pLeft, 1, ta
1f9f0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72  rget);.        r
1fa00 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 69  eturn target;.#i
1fa10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fa20 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
1fa30 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1fa40 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46   pLeft->op==TK_F
1fa50 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
1fa60 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1fa70 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1fa80 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1fa90 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c          codeReal
1faa0 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f  (v, pLeft->u.zTo
1fab0 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ken, 1, target);
1fac0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1fad0 74 61 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a 20  target;.#endif. 
1fae0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1faf0 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54      tempX.op = T
1fb00 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  K_INTEGER;.     
1fb10 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d     tempX.flags =
1fb20 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f   EP_IntValue|EP_
1fb30 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20  TokenOnly;.     
1fb40 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75     tempX.u.iValu
1fb50 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
1fb60 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1fb70 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1fb80 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65  &tempX, &regFree
1fb90 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  1);.        r2 =
1fba0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fbb0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1fbc0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1fbd0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73  ree2);.        s
1fbe0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1fbf0 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c  (v, OP_Subtract,
1fc00 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
1fc10 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1fc20 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1fc30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1fc40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1fc50 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
1fc60 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
1fc70 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
1fc80 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50  t( TK_BITNOT==OP
1fc90 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73  _BitNot );   tes
1fca0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
1fcb0 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73  TNOT );.      as
1fcc0 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50  sert( TK_NOT==OP
1fcd0 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20  _Not );         
1fce0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1fcf0 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  _NOT );.      r1
1fd00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1fd10 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1fd20 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1fd30 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
1fd40 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1fd50 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  1==0 );.      sq
1fd60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1fd70 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67  v, op, r1, inReg
1fd80 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1fd90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1fda0 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20  K_TRUTH: {.     
1fdb0 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 20 20   int isTrue;    
1fdc0 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
1fdd0 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20   NOT TRUE */.   
1fde0 20 20 20 69 6e 74 20 62 4e 6f 72 6d 61 6c 3b 20     int bNormal; 
1fdf0 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20    /* IS TRUE or 
1fe00 49 53 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20  IS FALSE */.    
1fe10 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1fe20 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1fe30 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1fe40 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1fe50 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1fe60 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1fe70 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74    isTrue = sqlit
1fe80 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65  e3ExprTruthValue
1fe90 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
1fea0 0a 20 20 20 20 20 20 62 4e 6f 72 6d 61 6c 20 3d  .      bNormal =
1feb0 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f   pExpr->op2==TK_
1fec0 49 53 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  IS;.      testca
1fed0 73 65 28 20 69 73 54 72 75 65 20 26 26 20 62 4e  se( isTrue && bN
1fee0 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 74 65  ormal);.      te
1fef0 73 74 63 61 73 65 28 20 21 69 73 54 72 75 65 20  stcase( !isTrue 
1ff00 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20  && bNormal);.   
1ff10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ff20 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 73  dOp4Int(v, OP_Is
1ff30 54 72 75 65 2c 20 72 31 2c 20 69 6e 52 65 67 2c  True, r1, inReg,
1ff40 20 21 69 73 54 72 75 65 2c 20 69 73 54 72 75 65   !isTrue, isTrue
1ff50 20 5e 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20   ^ bNormal);.   
1ff60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ff70 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
1ff80 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
1ff90 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
1ffa0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
1ffb0 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
1ffc0 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
1ffd0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ffe0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
1fff0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
20000 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
20010 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20  ll ); testcase( 
20020 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
20030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20040 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20050 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
20060 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  et);.      r1 = 
20070 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
20080 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
20090 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
200a0 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
200b0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
200c0 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  0 );.      addr 
200d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
200e0 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a  Op1(v, op, r1);.
200f0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
20100 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
20110 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
20120 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
20130 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
20140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
20150 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
20160 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65  nteger, 0, targe
20170 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
20180 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
20190 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72   addr);.      br
201a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
201b0 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
201c0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  ION: {.      Agg
201d0 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45  Info *pInfo = pE
201e0 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
201f0 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d       if( pInfo==
20200 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
20210 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
20220 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
20230 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
20240 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
20250 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
20260 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
20270 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d  e: %s()", pExpr-
20280 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
20290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
202a0 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 2d 3e 61   return pInfo->a
202b0 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67  Func[pExpr->iAgg
202c0 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  ].iMem;.      }.
202d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
202e0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
202f0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
20300 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67   ExprList *pFarg
20310 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
20320 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
20330 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
20340 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20  nt nFarg;       
20350 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20360 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
20370 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46  ments */.      F
20380 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
20390 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
203a0 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
203b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20   object */.     
203c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
203d0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ;       /* The f
203e0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
203f0 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d        u32 constM
20400 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ask = 0;     /* 
20410 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e  Mask of function
20420 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20   arguments that 
20430 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a  are constant */.
20440 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20460 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
20470 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
20480 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
20490 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
204a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
204b0 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
204c0 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54  C(db);      /* T
204d0 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  he text encoding
204e0 20 75 73 65 64 20 62 79 20 74 68 69 73 20 64 61   used by this da
204f0 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
20500 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
20510 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c   0;    /* A coll
20520 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
20530 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
20540 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
20550 43 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  C.      if( Expr
20560 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
20570 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  r, EP_WinFunc) )
20580 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
20590 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e   pExpr->y.pWin->
205a0 72 65 67 52 65 73 75 6c 74 3b 0a 20 20 20 20 20  regResult;.     
205b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
205c0 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72   if( ConstFactor
205d0 4f 6b 28 70 50 61 72 73 65 29 20 26 26 20 73 71  Ok(pParse) && sq
205e0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
205f0 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
20600 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
20610 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61  SQL functions ca
20620 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65 2e 20  n be expensive. 
20630 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 63  So try to move c
20640 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e  onstant function
20650 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  s.        ** out
20660 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
20670 6f 70 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  op, even if that
20680 20 6d 65 61 6e 73 20 61 6e 20 65 78 74 72 61 20   means an extra 
20690 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20  OP_Copy. */.    
206a0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
206b0 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
206c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
206d0 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
206e0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
206f0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
20700 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
20710 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
20720 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
20730 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
20740 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  y) ){.        pF
20750 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  arg = 0;.      }
20760 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
20770 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  arg = pExpr->x.p
20780 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
20790 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72      nFarg = pFar
207a0 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72  g ? pFarg->nExpr
207b0 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   : 0;.      asse
207c0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
207d0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
207e0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
207f0 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75    zId = pExpr->u
20800 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70  .zToken;.      p
20810 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
20820 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49  dFunction(db, zI
20830 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30  d, nFarg, enc, 0
20840 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
20850 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f  _ENABLE_UNKNOWN_
20860 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20  SQL_FUNCTION.   
20870 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26     if( pDef==0 &
20880 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  & pParse->explai
20890 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  n ){.        pDe
208a0 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
208b0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b  unction(db, "unk
208c0 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e  nown", nFarg, en
208d0 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  c, 0);.      }.#
208e0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
208f0 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d  pDef==0 || pDef-
20900 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b  >xFinalize!=0 ){
20910 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20920 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
20930 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69   "unknown functi
20940 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b  on: %s()", zId);
20950 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
20960 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
20970 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65  * Attempt a dire
20980 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ct implementatio
20990 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69  n of the built-i
209a0 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64  n COALESCE() and
209b0 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c  .      ** IFNULL
209c0 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  () functions.  T
209d0 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63  his avoids unnec
209e0 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f  essary evaluatio
209f0 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72  n of.      ** ar
20a00 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65  guments past the
20a10 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20   first non-NULL 
20a20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
20a30 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
20a40 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
20a50 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45  QLITE_FUNC_COALE
20a60 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69  SCE ){.        i
20a70 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d  nt endCoalesce =
20a80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
20a90 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
20aa0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
20ab0 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20  Farg>=2 );.     
20ac0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20ad0 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  de(pParse, pFarg
20ae0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[0].pExpr, ta
20af0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66  rget);.        f
20b00 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b  or(i=1; i<nFarg;
20b10 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
20b20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20b30 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p2(v, OP_NotNull
20b40 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61  , target, endCoa
20b50 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20  lesce);.        
20b60 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
20b70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
20b80 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
20b90 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
20ba0 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
20bb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20bc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
20bd0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
20be0 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
20bf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
20c00 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   }..      /* The
20c10 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63   UNLIKELY() func
20c20 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
20c30 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20    The result is 
20c40 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
20c50 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
20c60 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
20c70 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
20c80 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
20c90 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b  QLITE_FUNC_UNLIK
20ca0 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ELY ){.        a
20cb0 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20  ssert( nFarg>=1 
20cc0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
20cd0 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  n sqlite3ExprCod
20ce0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
20cf0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
20d00 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
20d10 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
20d20 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 2f  TE_DEBUG.      /
20d30 2a 20 54 68 65 20 41 46 46 49 4e 49 54 59 28 29  * The AFFINITY()
20d40 20 66 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61   function evalua
20d50 74 65 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20  tes to a string 
20d60 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 20  that describes. 
20d70 20 20 20 20 20 2a 2a 20 74 68 65 20 74 79 70 65       ** the type
20d80 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   affinity of the
20d90 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73   argument.  This
20da0 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
20db0 74 69 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a  ting of.      **
20dc0 20 74 68 65 20 53 51 4c 69 74 65 20 74 79 70 65   the SQLite type
20dd0 20 6c 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f   logic..      */
20de0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
20df0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
20e00 49 54 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54  ITE_FUNC_AFFINIT
20e10 59 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  Y ){.        con
20e20 73 74 20 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d  st char *azAff[]
20e30 20 3d 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65   = { "blob", "te
20e40 78 74 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20  xt", "numeric", 
20e50 22 69 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c  "integer", "real
20e60 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 63 68 61  " };.        cha
20e70 72 20 61 66 66 3b 0a 20 20 20 20 20 20 20 20 61  r aff;.        a
20e80 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20  ssert( nFarg==1 
20e90 29 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d  );.        aff =
20ea0 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
20eb0 6e 69 74 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d  nity(pFarg->a[0]
20ec0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
20ed0 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
20ee0 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74  String(v, target
20ef0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
20f00 20 20 20 28 61 66 66 3c 3d 53 51 4c 49 54 45 5f     (aff<=SQLITE_
20f10 41 46 46 5f 4e 4f 4e 45 29 20 3f 20 22 6e 6f 6e  AFF_NONE) ? "non
20f20 65 22 20 3a 20 61 7a 41 66 66 5b 61 66 66 2d 53  e" : azAff[aff-S
20f30 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 29  QLITE_AFF_BLOB])
20f40 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
20f50 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
20f60 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 66  .#endif..      f
20f70 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b  or(i=0; i<nFarg;
20f80 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
20f90 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74  f( i<32 && sqlit
20fa0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
20fb0 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78  (pFarg->a[i].pEx
20fc0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
20fd0 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31   testcase( i==31
20fe0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
20ff0 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42  nstMask |= MASKB
21000 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20  IT32(i);.       
21010 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
21020 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
21030 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
21040 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70  EDCOLL)!=0 && !p
21050 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
21060 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
21070 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
21080 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
21090 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
210a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
210b0 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20   if( pFarg ){.  
210c0 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d        if( constM
210d0 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ask ){.         
210e0 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d   r1 = pParse->nM
210f0 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  em+1;.          
21100 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
21110 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d  nFarg;.        }
21120 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21130 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
21140 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
21150 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20   nFarg);.       
21160 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
21170 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20  or length() and 
21180 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f  typeof() functio
21190 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e  ns with a column
211a0 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20   argument,.     
211b0 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35     ** set the P5
211c0 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
211d0 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  e OP_Column opco
211e0 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e  de to OPFLAG_LEN
211f0 47 54 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a  GTHARG.        *
21200 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45  * or OPFLAG_TYPE
21210 4f 46 41 52 47 20 72 65 73 70 65 63 74 69 76 65  OFARG respective
21220 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ly, to avoid unn
21230 65 63 65 73 73 61 72 79 20 64 61 74 61 0a 20 20  ecessary data.  
21240 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67        ** loading
21250 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
21260 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
21270 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c  funcFlags & (SQL
21280 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c  ITE_FUNC_LENGTH|
21290 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
212a0 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  OF))!=0 ){.     
212b0 20 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a       u8 exprOp;.
212c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
212d0 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20  ( nFarg==1 );.  
212e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
212f0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
21300 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
21310 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67    exprOp = pFarg
21320 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
21330 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
21340 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  exprOp==TK_COLUM
21350 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f  N || exprOp==TK_
21360 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
21370 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
21380 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45  ( SQLITE_FUNC_LE
21390 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e  NGTH==OPFLAG_LEN
213a0 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20  GTHARG );.      
213b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
213c0 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46  LITE_FUNC_TYPEOF
213d0 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  ==OPFLAG_TYPEOFA
213e0 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
213f0 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 66    testcase( pDef
21400 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50  ->funcFlags & OP
21410 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29  FLAG_LENGTHARG )
21420 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  ;.            pF
21430 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
21440 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20  >op2 = .        
21450 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e            pDef->
21460 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46  funcFlags & (OPF
21470 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50  LAG_LENGTHARG|OP
21480 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b  FLAG_TYPEOFARG);
21490 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
214a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
214b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
214c0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
214d0 70 46 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20  pFarg, r1, 0,.  
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
21500 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51  LITE_ECEL_DUP|SQ
21510 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
21520 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
21530 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a          r1 = 0;.
21540 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
21550 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
21560 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
21570 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
21580 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
21590 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
215a0 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
215b0 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
215c0 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
215d0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
215e0 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
215f0 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
21600 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
21610 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
21620 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
21630 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
21640 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
21650 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
21660 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
21670 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
21680 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
21690 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
216a0 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
216b0 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
216c0 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
216d0 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
216e0 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
216f0 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
21700 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
21710 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
21720 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
21730 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
21740 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
21750 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
21760 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
21770 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
21780 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
21790 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
217a0 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
217b0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
217c0 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
217d0 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
217e0 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
217f0 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
21800 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  */.      if( nFa
21810 72 67 3e 3d 32 20 26 26 20 45 78 70 72 48 61 73  rg>=2 && ExprHas
21820 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
21830 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b  EP_InfixFunc) ){
21840 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
21850 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
21860 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
21870 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
21880 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  rg->a[1].pExpr);
21890 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
218a0 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20   nFarg>0 ){.    
218b0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
218c0 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
218d0 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
218e0 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
218f0 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
21900 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
21910 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
21920 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
21930 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
21940 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
21950 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
21960 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
21970 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21980 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
21990 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  Seq, 0, 0, 0, (c
219a0 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
219b0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
219c0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
219d0 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51  ENABLE_OFFSET_SQ
219e0 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28  L_FUNC.      if(
219f0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
21a00 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4f   & SQLITE_FUNC_O
21a10 46 46 53 45 54 20 29 7b 0a 20 20 20 20 20 20 20  FFSET ){.       
21a20 20 45 78 70 72 20 2a 70 41 72 67 20 3d 20 70 46   Expr *pArg = pF
21a30 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  arg->a[0].pExpr;
21a40 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72  .        if( pAr
21a50 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  g->op==TK_COLUMN
21a60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
21a70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
21a80 76 2c 20 4f 50 5f 4f 66 66 73 65 74 2c 20 70 41  v, OP_Offset, pA
21a90 72 67 2d 3e 69 54 61 62 6c 65 2c 20 70 41 72 67  rg->iTable, pArg
21aa0 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  ->iColumn, targe
21ab0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  t);.        }els
21ac0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
21ad0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21ae0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
21af0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
21b00 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
21b10 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
21b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21b30 64 64 4f 70 34 28 76 2c 20 70 50 61 72 73 65 2d  ddOp4(v, pParse-
21b40 3e 69 53 65 6c 66 54 61 62 20 3f 20 4f 50 5f 50  >iSelfTab ? OP_P
21b50 75 72 65 46 75 6e 63 30 20 3a 20 4f 50 5f 46 75  ureFunc0 : OP_Fu
21b60 6e 63 74 69 6f 6e 30 2c 0a 20 20 20 20 20 20 20  nction0,.       
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b80 20 20 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31     constMask, r1
21b90 2c 20 74 61 72 67 65 74 2c 20 28 63 68 61 72 2a  , target, (char*
21ba0 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45  )pDef, P4_FUNCDE
21bb0 46 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  F);.        sqli
21bc0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
21bd0 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20  v, (u8)nFarg);. 
21be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
21bf0 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d   nFarg && constM
21c00 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ask==0 ){.      
21c10 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
21c20 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
21c30 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20  , r1, nFarg);.  
21c40 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
21c50 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
21c60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21c70 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
21c80 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
21c90 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
21ca0 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  LECT: {.      in
21cb0 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65  t nCol;.      te
21cc0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
21cd0 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
21ce0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
21cf0 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
21d00 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  if( op==TK_SELEC
21d10 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78  T && (nCol = pEx
21d20 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
21d30 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31  EList->nExpr)!=1
21d40 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
21d50 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
21d60 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20  r(pParse, nCol, 
21d70 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
21d80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
21d90 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
21da0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
21db0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
21dc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21dd0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
21de0 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  CT_COLUMN: {.   
21df0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
21e00 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
21e10 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ->iTable==0 ){. 
21e20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c         pExpr->pL
21e30 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71  eft->iTable = sq
21e40 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
21e50 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
21e60 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
21e70 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
21e80 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30  pExpr->iTable==0
21e90 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   || pExpr->pLeft
21ea0 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
21eb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
21ec0 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20  pr->iTable.     
21ed0 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62    && pExpr->iTab
21ee0 6c 65 21 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33  le!=(n = sqlite3
21ef0 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
21f00 45 78 70 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20  Expr->pLeft)) . 
21f10 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
21f20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
21f30 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75  pParse, "%d colu
21f40 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20  mns assigned %d 
21f50 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20  values",.       
21f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f70 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
21f80 69 54 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20  iTable, n);.    
21f90 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
21fa0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
21fb0 54 61 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69  Table + pExpr->i
21fc0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20  Column;.    }.  
21fd0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
21fe0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
21ff0 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
22000 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
22010 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
22020 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
22030 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
22040 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
22050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22060 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
22070 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
22080 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22090 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
220a0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
220b0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
220c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
220d0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
220e0 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
220f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22100 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
22110 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
22120 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22130 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
22140 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a  mm, target, 0);.
22150 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22160 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
22170 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
22180 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
22190 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  t;.    }.#endif 
221a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
221b0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20  UBQUERY */...   
221c0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20   /*.    **    x 
221d0 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
221e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
221f0 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
22200 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   to.    **.    *
22210 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
22220 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  =z.    **.    **
22230 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   X is stored in 
22240 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
22250 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64    ** Y is stored
22260 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
22270 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[0].pExpr..  
22280 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64    ** Z is stored
22290 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
222a0 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[1].pExpr..  
222b0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
222c0 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
222d0 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
222e0 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
222f0 20 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a   target, 0, 0);.
22300 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
22310 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
22320 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20  ase TK_SPAN:.   
22330 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45   case TK_COLLATE
22340 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  : .    case TK_U
22350 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 70 45  PLUS: {.      pE
22360 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  xpr = pExpr->pLe
22370 66 74 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  ft;.      goto e
22380 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3b  xpr_code_doover;
22390 20 2f 2a 20 32 30 31 38 2d 30 34 2d 32 38 3a 20   /* 2018-04-28: 
223a0 50 72 65 76 65 6e 74 20 64 65 65 70 20 72 65 63  Prevent deep rec
223b0 75 72 73 69 6f 6e 2e 20 4f 53 53 46 75 7a 7a 2e  ursion. OSSFuzz.
223c0 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63   */.    }..    c
223d0 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20  ase TK_TRIGGER: 
223e0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
223f0 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54  e opcode is TK_T
22400 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65  RIGGER, then the
22410 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
22420 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20   reference.     
22430 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20   ** to a column 
22440 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20  in the new.* or 
22450 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
22460 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  les available to
22470 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65  .      ** trigge
22480 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74  r programs. In t
22490 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54  his case Expr.iT
224a0 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31  able is set to 1
224b0 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a   for the.      *
224c0 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  * new.* pseudo-t
224d0 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74  able, or 0 for t
224e0 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
224f0 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c  table. Expr.iCol
22500 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  umn.      ** is 
22510 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  set to the colum
22520 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d  n of the pseudo-
22530 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f  table to read, o
22540 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20  r to -1 to.     
22550 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77   ** read the row
22560 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20  id field..      
22570 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
22580 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d  expression is im
22590 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
225a0 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f  an OP_Param opco
225b0 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20  de. The p1.     
225c0 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73   ** parameter is
225d0 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e   set to 0 for an
225e0 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72   old.rowid refer
225f0 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31  ence, or to (i+1
22600 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  ).      ** to re
22610 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20  ference another 
22620 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c  column of the ol
22630 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
22640 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a  , where .      *
22650 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78  * i is the index
22660 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
22670 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20  For a new.rowid 
22680 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73  reference, p1 is
22690 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f  .      ** set to
226a0 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20   (n+1), where n 
226b0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
226c0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68   columns in each
226d0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20   pseudo-table.. 
226e0 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65       ** For a re
226f0 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f  ference to any o
22700 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ther column in t
22710 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  he new.* pseudo-
22720 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20  table, p1.      
22730 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b  ** is set to (n+
22740 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e  2+i), where n an
22750 64 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e  d i are as defin
22760 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46  ed previously. F
22770 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d  or.      ** exam
22780 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c  ple, if the tabl
22790 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67  e on which trigg
227a0 65 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69  ers are being fi
227b0 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  red is.      ** 
227c0 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20  declared as:.   
227d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
227e0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
227f0 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a  (a, b);.      **
22800 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70  .      ** Then p
22810 31 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  1 is interpreted
22820 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
22830 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
22840 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f   p1==0   ->    o
22850 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d  ld.rowid     p1=
22860 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72  =3   ->    new.r
22870 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20  owid.      **   
22880 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==1   ->    ol
22890 64 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.a         p1==
228a0 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a  4   ->    new.a.
228b0 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32        **   p1==2
228c0 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20     ->    old.b  
228d0 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d         p1==5   -
228e0 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20  >    new.b      
228f0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
22900 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
22910 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20  Expr->y.pTab;.  
22920 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
22930 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
22940 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
22950 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
22960 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
22970 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
22980 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
22990 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
229a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
229b0 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
229c0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
229d0 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
229e0 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
229f0 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
22a00 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
22a10 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
22a20 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
22a30 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
22a40 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
22a50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22a60 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
22a70 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
22a80 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
22a90 72 5b 25 64 5d 3d 25 73 2e 25 73 22 2c 20 74 61  r[%d]=%s.%s", ta
22aa0 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 28 70  rget,.        (p
22ab0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
22ac0 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20  new" : "old"),. 
22ad0 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
22ae0 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69  Column<0 ? "rowi
22af0 64 22 20 3a 20 70 45 78 70 72 2d 3e 79 2e 70 54  d" : pExpr->y.pT
22b00 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
22b10 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 0a  iColumn].zName).
22b20 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64        ));..#ifnd
22b30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
22b40 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
22b50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
22b60 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66  lumn has REAL af
22b70 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63  finity, it may c
22b80 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
22b90 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a  ed as an.      *
22ba0 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f  * integer. Use O
22bb0 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74  P_RealAffinity t
22bc0 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  o make sure it i
22bd0 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20  s really real.. 
22be0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
22bf0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
22c00 36 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69  60985-57662 SQLi
22c10 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20  te will convert 
22c20 74 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74  the value back t
22c30 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74  o.      ** float
22c40 69 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65  ing point when e
22c50 78 74 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f  xtracting it fro
22c60 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a  m the record.  *
22c70 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  /.      if( pExp
22c80 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20  r->iColumn>=0 . 
22c90 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61        && pTab->a
22ca0 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
22cb0 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51  mn].affinity==SQ
22cc0 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
22cd0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
22ce0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
22cf0 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  (v, OP_RealAffin
22d00 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ity, target);.  
22d10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22d20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22d30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43  .    case TK_VEC
22d40 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TOR: {.      sql
22d50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
22d60 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
22d70 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20  misused");.     
22d80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
22d90 20 20 20 2f 2a 20 54 4b 5f 49 46 5f 4e 55 4c 4c     /* TK_IF_NULL
22da0 5f 52 4f 57 20 45 78 70 72 20 6e 6f 64 65 73 20  _ROW Expr nodes 
22db0 61 72 65 20 69 6e 73 65 72 74 65 64 20 61 68 65  are inserted ahe
22dc0 61 64 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  ad of expression
22dd0 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 65  s.    ** that de
22de0 72 69 76 65 20 66 72 6f 6d 20 74 68 65 20 72 69  rive from the ri
22df0 67 68 74 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f  ght-hand table o
22e00 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20  f a LEFT JOIN.  
22e10 54 68 65 0a 20 20 20 20 2a 2a 20 45 78 70 72 2e  The.    ** Expr.
22e20 69 54 61 62 6c 65 20 76 61 6c 75 65 20 69 73 20  iTable value is 
22e30 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65 72  the table number
22e40 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68   for the right-h
22e50 61 6e 64 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  and table..    *
22e60 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
22e70 20 69 73 20 6f 6e 6c 79 20 65 76 61 6c 75 61 74   is only evaluat
22e80 65 64 20 69 66 20 74 68 61 74 20 74 61 62 6c 65  ed if that table
22e90 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
22ea0 79 0a 20 20 20 20 2a 2a 20 6f 6e 20 61 20 4c 45  y.    ** on a LE
22eb0 46 54 20 4a 4f 49 4e 20 4e 55 4c 4c 20 72 6f 77  FT JOIN NULL row
22ec0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
22ed0 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  e TK_IF_NULL_ROW
22ee0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
22ef0 64 72 49 4e 52 3b 0a 20 20 20 20 20 20 75 38 20  drINR;.      u8 
22f00 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20  okConstFactor = 
22f10 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
22f20 61 63 74 6f 72 3b 0a 20 20 20 20 20 20 61 64 64  actor;.      add
22f30 72 49 4e 52 20 3d 20 73 71 6c 69 74 65 33 56 64  rINR = sqlite3Vd
22f40 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
22f50 66 4e 75 6c 6c 52 6f 77 2c 20 70 45 78 70 72 2d  fNullRow, pExpr-
22f60 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >iTable);.      
22f70 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 64  /* Temporarily d
22f80 69 73 61 62 6c 65 20 66 61 63 74 6f 72 69 6e 67  isable factoring
22f90 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20 65 78 70   of constant exp
22fa0 72 65 73 73 69 6f 6e 73 2c 20 73 69 6e 63 65 0a  ressions, since.
22fb0 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 74 68        ** even th
22fc0 6f 75 67 68 20 65 78 70 72 65 73 73 69 6f 6e 73  ough expressions
22fd0 20 6d 61 79 20 61 70 70 65 61 72 20 74 6f 20 62   may appear to b
22fe0 65 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 79  e constant, they
22ff0 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 2a   are not.      *
23000 2a 20 72 65 61 6c 6c 79 20 63 6f 6e 73 74 61 6e  * really constan
23010 74 20 62 65 63 61 75 73 65 20 74 68 65 79 20 6f  t because they o
23020 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68  riginate from th
23030 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
23040 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20  e.      ** of a 
23050 4c 45 46 54 20 4a 4f 49 4e 2e 20 2a 2f 0a 20 20  LEFT JOIN. */.  
23060 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f      pParse->okCo
23070 6e 73 74 46 61 63 74 6f 72 20 3d 20 30 3b 0a 20  nstFactor = 0;. 
23080 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
23090 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
230a0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
230b0 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
230c0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
230d0 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20  okConstFactor = 
230e0 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 3b 0a 20  okConstFactor;. 
230f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23100 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
23110 49 4e 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  INR);.      sqli
23120 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
23130 76 2c 20 61 64 64 72 49 4e 52 2c 20 69 6e 52 65  v, addrINR, inRe
23140 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
23150 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
23160 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20     ** Form A:.  
23170 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48    **   CASE x WH
23180 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48  EN e1 THEN r1 WH
23190 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e  EN e2 THEN r2 ..
231a0 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72  . WHEN eN THEN r
231b0 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
231c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   **.    ** Form 
231d0 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  B:.    **   CASE
231e0 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
231f0 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
23200 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
23210 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
23220 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
23230 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20 74  rm A is can be t
23240 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20  ransformed into 
23250 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  the equivalent f
23260 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73  orm B as follows
23270 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
23280 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72  WHEN x=e1 THEN r
23290 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e  1 WHEN x=e2 THEN
232a0 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20   r2 ....    **  
232b0 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20        WHEN x=eN 
232c0 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
232d0 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
232e0 20 58 20 28 69 66 20 69 74 20 65 78 69 73 74 73   X (if it exists
232f0 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  ) is in pExpr->p
23300 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69  Left..    ** Y i
23310 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65 6c  s in the last el
23320 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e  ement of pExpr->
23330 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70 72  x.pList if pExpr
23340 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
23350 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20   is.    ** odd. 
23360 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f   The Y is also o
23370 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65  ptional.  If the
23380 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
23390 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20  nts in x.pList. 
233a0 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74     ** is even, t
233b0 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65 64  hen Y is omitted
233c0 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72 77   and the "otherw
233d0 69 73 65 22 20 72 65 73 75 6c 74 20 69 73 20 4e  ise" result is N
233e0 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69  ULL..    ** Ei i
233f0 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  s in pExpr->pLis
23400 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69  t->a[i*2] and Ri
23410 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   is pExpr->pList
23420 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20  ->a[i*2+1]..    
23430 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
23440 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72  sult of the expr
23450 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69  ession is the Ri
23460 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d   for the first m
23470 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20  atching Ei,.    
23480 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  ** or if there i
23490 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69  s no matching Ei
234a0 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20  , the ELSE term 
234b0 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  Y, or if there i
234c0 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45  s.    ** no ELSE
234d0 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20   term, NULL..   
234e0 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
234f0 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
23500 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20  CASE ); {.      
23510 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20  int endLabel;   
23520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23530 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
23540 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20  for end of CASE 
23550 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  stmt */.      in
23560 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20  t nextCase;     
23570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23580 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
23590 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75  r next WHEN clau
235a0 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
235b0 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  nExpr;          
235c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
235d0 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48   2x number of WH
235e0 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
235f0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
23600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23610 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
23620 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ter */.      Exp
23630 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23650 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74  * List of WHEN t
23660 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74  erms */.      st
23670 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
23680 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20  em *aListelem;  
23690 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e  /* Array of WHEN
236a0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
236b0 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20  Expr opCompare; 
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236d0 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65    /* The X==Ei e
236e0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
236f0 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20     Expr *pX;    
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23710 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78       /* The X ex
23720 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
23730 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20    Expr *pTest = 
23740 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
23750 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f      /* X==Ei (fo
23760 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69  rm A) or just Ei
23770 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20   (form B) */.   
23780 20 20 20 45 78 70 72 20 2a 70 44 65 6c 20 3d 20     Expr *pDel = 
23790 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
237a0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
237b0 62 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  b;..      assert
237c0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
237d0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
237e0 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72  Select) && pExpr
237f0 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20  ->x.pList );.   
23800 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d     assert(pExpr-
23810 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
23820 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69  > 0);.      pELi
23830 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
23840 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74  ist;.      aList
23850 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61  elem = pEList->a
23860 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
23870 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
23880 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20       endLabel = 
23890 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
238a0 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
238b0 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45      if( (pX = pE
238c0 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
238d0 7b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d  {.        pDel =
238e0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
238f0 64 62 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20  db, pX, 0);.    
23900 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
23910 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
23920 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23930 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  rDelete(db, pDel
23940 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
23950 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
23960 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23970 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pX->op==TK_COLUM
23980 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  N );.        exp
23990 72 54 6f 52 65 67 69 73 74 65 72 28 70 44 65 6c  rToRegister(pDel
239a0 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  , exprCodeVector
239b0 28 70 50 61 72 73 65 2c 20 70 44 65 6c 2c 20 26  (pParse, pDel, &
239c0 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20  regFree1));.    
239d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
239e0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
239f0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43       memset(&opC
23a00 6f 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f  ompare, 0, sizeo
23a10 66 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20  f(opCompare));. 
23a20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
23a30 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20  .op = TK_EQ;.   
23a40 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
23a50 4c 65 66 74 20 3d 20 70 44 65 6c 3b 0a 20 20 20  Left = pDel;.   
23a60 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
23a70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20  Compare;.       
23a80 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64   /* Ticket b351d
23a90 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64  95f9cd5ef17e9d9d
23aa0 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30  bae18f5ca8611190
23ab0 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  001:.        ** 
23ac0 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
23ad0 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20  Free1 might get 
23ae0 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68  SCopy-ed into th
23af0 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20  e file result.. 
23b00 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b         ** So mak
23b10 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
23b20 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65  regFree1 registe
23b30 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20  r is not reused 
23b40 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20  for other.      
23b50 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e    ** purposes an
23b60 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77  d possibly overw
23b70 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
23b80 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30      regFree1 = 0
23b90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23ba0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
23bb0 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  -1; i=i+2){.    
23bc0 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20      if( pX ){.  
23bd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23be0 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pTest!=0 );.    
23bf0 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
23c00 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c  pRight = aListel
23c10 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
23c20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23c30 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c        pTest = aL
23c40 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
23c50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23c60 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73      nextCase = s
23c70 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
23c80 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
23c90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
23ca0 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Test->op==TK_COL
23cb0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
23cc0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
23cd0 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c  e(pParse, pTest,
23ce0 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54   nextCase, SQLIT
23cf0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
23d00 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
23d10 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
23d20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
23d30 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
23d40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
23d50 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
23d60 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61  m[i+1].pExpr, ta
23d70 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
23d80 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
23d90 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
23da0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23db0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
23dc0 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20  nextCase);.     
23dd0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45   }.      if( (nE
23de0 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20  xpr&1)!=0 ){.   
23df0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23e00 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
23e10 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e  ist->a[nExpr-1].
23e20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
23e30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23e40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23e50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
23e60 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
23e70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
23e80 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
23e90 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20  b, pDel);.      
23ea0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
23eb0 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61  veLabel(v, endLa
23ec0 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  bel);.      brea
23ed0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
23ee0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
23ef0 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
23f00 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
23f10 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61  assert( pExpr->a
23f20 66 66 45 78 70 72 3d 3d 4f 45 5f 52 6f 6c 6c 62  ffExpr==OE_Rollb
23f30 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20  ack .           
23f40 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 45 78 70  || pExpr->affExp
23f50 72 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20  r==OE_Abort.    
23f60 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
23f70 3e 61 66 66 45 78 70 72 3d 3d 4f 45 5f 46 61 69  >affExpr==OE_Fai
23f80 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  l.           || 
23f90 70 45 78 70 72 2d 3e 61 66 66 45 78 70 72 3d 3d  pExpr->affExpr==
23fa0 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20  OE_Ignore.      
23fb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
23fc0 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
23fd0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
23fe0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23ff0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
24000 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49              "RAI
24010 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65  SE() may only be
24020 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74   used within a t
24030 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29  rigger-program")
24040 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
24050 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
24060 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
24070 45 78 70 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  Expr==OE_Abort )
24080 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24090 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
240a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
240b0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
240c0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
240d0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
240e0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
240f0 2d 3e 61 66 66 45 78 70 72 3d 3d 4f 45 5f 49 67  ->affExpr==OE_Ig
24100 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
24110 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24120 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  4(.            v
24130 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
24140 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  E_OK, OE_Ignore,
24150 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
24160 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ken,0);.        
24170 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
24180 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24190 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c        sqlite3Hal
241a0 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
241b0 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  se, SQLITE_CONST
241c0 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20  RAINT_TRIGGER,. 
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
241f0 70 72 2d 3e 61 66 66 45 78 70 72 2c 20 70 45 78  pr->affExpr, pEx
24200 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
24210 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
24220 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
24230 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
24240 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
24250 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
24260 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
24270 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
24280 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
24290 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  ;.  return inReg
242a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f  ;.}../*.** Facto
242b0 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f  r out the code o
242c0 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
242d0 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61  ession to initia
242e0 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
242f0 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65 73 74 3e  *.** If regDest>
24300 3d 30 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  =0 then the resu
24310 6c 74 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f  lt is always sto
24320 72 65 64 20 69 6e 20 74 68 61 74 20 72 65 67 69  red in that regi
24330 73 74 65 72 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ster and the.** 
24340 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 72 65  result is not re
24350 75 73 61 62 6c 65 2e 20 20 49 66 20 72 65 67 44  usable.  If regD
24360 65 73 74 3c 30 20 74 68 65 6e 20 74 68 69 73 20  est<0 then this 
24370 72 6f 75 74 69 6e 65 20 69 73 20 66 72 65 65 20  routine is free 
24380 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65  to .** store the
24390 20 76 61 6c 75 65 20 77 68 65 72 65 65 76 65 72   value whereever
243a0 20 69 74 20 77 61 6e 74 73 2e 20 20 54 68 65 20   it wants.  The 
243b0 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20 74  register where t
243c0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a  he expression .*
243d0 2a 20 69 73 20 73 74 6f 72 65 64 20 69 73 20 72  * is stored is r
243e0 65 74 75 72 6e 65 64 2e 20 20 57 68 65 6e 20 72  eturned.  When r
243f0 65 67 44 65 73 74 3c 30 2c 20 74 77 6f 20 69 64  egDest<0, two id
24400 65 6e 74 69 63 61 6c 20 65 78 70 72 65 73 73 69  entical expressi
24410 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65  ons will.** code
24420 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65 67   to the same reg
24430 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
24440 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
24450 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nit(.  Parse *pP
24460 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
24470 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
24480 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
24490 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
244a0 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65  sion to code whe
244b0 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69 74 69  n the VDBE initi
244c0 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20  alizes */.  int 
244d0 72 65 67 44 65 73 74 20 20 20 20 20 20 20 2f 2a  regDest       /*
244e0 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   Store the value
244f0 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
24500 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  r */.){.  ExprLi
24510 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  st *p;.  assert(
24520 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
24530 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20  Parse) );.  p = 
24540 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
24550 70 72 3b 0a 20 20 69 66 28 20 72 65 67 44 65 73  pr;.  if( regDes
24560 74 3c 30 20 26 26 20 70 20 29 7b 0a 20 20 20 20  t<0 && p ){.    
24570 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
24580 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
24590 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
245a0 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d  pItem=p->a, i=p-
245b0 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74  >nExpr; i>0; pIt
245c0 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20  em++, i--){.    
245d0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75    if( pItem->reu
245e0 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33  sable && sqlite3
245f0 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 70 49  ExprCompare(0,pI
24600 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72  tem->pExpr,pExpr
24610 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,-1)==0 ){.     
24620 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d     return pItem-
24630 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
24640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24650 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 73 71    }.  pExpr = sq
24660 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
24670 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
24680 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  0);.  p = sqlite
24690 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
246a0 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72  pParse, p, pExpr
246b0 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
246c0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
246d0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
246e0 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d   &p->a[p->nExpr-
246f0 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e  1];.     pItem->
24700 72 65 75 73 61 62 6c 65 20 3d 20 72 65 67 44 65  reusable = regDe
24710 73 74 3c 30 3b 0a 20 20 20 20 20 69 66 28 20 72  st<0;.     if( r
24720 65 67 44 65 73 74 3c 30 20 29 20 72 65 67 44 65  egDest<0 ) regDe
24730 73 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  st = ++pParse->n
24740 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  Mem;.     pItem-
24750 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
24760 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a   = regDest;.  }.
24770 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74    pParse->pConst
24780 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65 74 75  Expr = p;.  retu
24790 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f  rn regDest;.}../
247a0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
247b0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
247c0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
247d0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
247e0 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  ts.** into a reg
247f0 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ister.  Return t
24800 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
24810 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73  er where the res
24820 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ults.** are stor
24830 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
24840 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
24850 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
24860 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  r that can be de
24870 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68  allocated,.** th
24880 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d  en write its num
24890 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20  ber into *pReg. 
248a0 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
248b0 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a  egister is not.*
248c0 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
248d0 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
248e0 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   zero..**.** If 
248f0 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
24900 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
24910 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e  outine might gen
24920 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f  erate this.** co
24930 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72  de to fill the r
24940 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69  egister in the i
24950 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65  nitialization se
24960 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ction of the.** 
24970 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e  VDBE program, in
24980 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72   order to factor
24990 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65   it out of the e
249a0 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a  valuation loop..
249b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
249c0 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
249d0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
249e0 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
249f0 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70  ){.  int r2;.  p
24a00 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
24a10 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64  prSkipCollateAnd
24a20 4c 69 6b 65 6c 79 28 70 45 78 70 72 29 3b 0a 20  Likely(pExpr);. 
24a30 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72   if( ConstFactor
24a40 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26 26  Ok(pParse).   &&
24a50 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
24a60 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73 71  EGISTER.   && sq
24a70 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
24a80 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
24a90 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 52 65 67  ).  ){.    *pReg
24aa0 20 20 3d 20 30 3b 0a 20 20 20 20 72 32 20 3d 20    = 0;.    r2 = 
24ab0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
24ac0 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
24ad0 78 70 72 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73  xpr, -1);.  }els
24ae0 65 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20  e{.    int r1 = 
24af0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
24b00 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  g(pParse);.    r
24b10 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
24b20 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
24b30 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20  , pExpr, r1);.  
24b40 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a    if( r2==r1 ){.
24b50 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31        *pReg = r1
24b60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24b70 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
24b80 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
24b90 20 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65   r1);.      *pRe
24ba0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
24bb0 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a  .  return r2;.}.
24bc0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
24bd0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
24be0 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
24bf0 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
24c00 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
24c10 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
24c20 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
24c30 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
24c40 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
24c50 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
24c60 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
24c70 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
24c80 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
24c90 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
24ca0 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b  t){.  int inReg;
24cb0 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
24cc0 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
24cd0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
24ce0 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70    if( pExpr && p
24cf0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Expr->op==TK_REG
24d00 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c  ISTER ){.    sql
24d10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
24d20 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
24d30 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54  _Copy, pExpr->iT
24d40 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20  able, target);. 
24d50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65   }else{.    inRe
24d60 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
24d70 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
24d80 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
24d90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
24da0 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c  arse->pVdbe!=0 |
24db0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
24dc0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
24dd0 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
24de0 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70  get && pParse->p
24df0 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Vdbe ){.      sq
24e00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24e10 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
24e20 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
24e30 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20  target);.    }. 
24e40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
24e50 20 61 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70   a transient cop
24e60 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
24e70 70 45 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63  pExpr and then c
24e80 6f 64 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20  ode it using.** 
24e90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
24ea0 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
24eb0 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
24ec0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24ed0 28 29 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61  ().** except tha
24ee0 74 20 74 68 65 20 69 6e 70 75 74 20 65 78 70 72  t the input expr
24ef0 65 73 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e  ession is guaran
24f00 74 65 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61  teed to be uncha
24f10 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
24f20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
24f30 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
24f40 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
24f50 74 20 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c  t target){.  sql
24f60 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
24f70 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d  e->db;.  pExpr =
24f80 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
24f90 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
24fa0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
24fb0 46 61 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33  Failed ) sqlite3
24fc0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
24fd0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
24fe0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
24ff0 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
25000 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
25010 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
25020 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
25030 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
25040 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
25050 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
25060 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
25070 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
25080 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
25090 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
250a0 72 67 65 74 2e 20 20 49 66 20 74 68 65 20 65 78  rget.  If the ex
250b0 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
250c0 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  tant, then this 
250d0 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74  routine.** might
250e0 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20   choose to code 
250f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
25100 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  t initialization
25110 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   time..*/.void s
25120 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61  qlite3ExprCodeFa
25130 63 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a  ctorable(Parse *
25140 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
25150 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
25160 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
25170 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26  okConstFactor &&
25180 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
25190 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45  nstantNotJoin(pE
251a0 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  xpr) ){.    sqli
251b0 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
251c0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
251d0 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73   target);.  }els
251e0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
251f0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
25200 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
25210 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
25220 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65  rate code that e
25230 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69 76  valuates the giv
25240 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
25250 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c  d puts the resul
25260 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  t.** in register
25270 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41   target..**.** A
25280 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  lso make a copy 
25290 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
252a0 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  n results into a
252b0 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72  nother "cache" r
252c0 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d  egister.** and m
252d0 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73  odify the expres
252e0 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65  sion so that the
252f0 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
25300 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74   evaluated,.** t
25310 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63  he result is a c
25320 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65  opy of the cache
25330 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
25340 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
25350 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73   used for expres
25360 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75  sions that are u
25370 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  sed multiple .**
25380 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72   times.  They ar
25390 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65  e evaluated once
253a0 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73   and the results
253b0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
253c0 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64  on.** are reused
253d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
253e0 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68  3ExprCodeAndCach
253f0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
25400 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
25410 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
25420 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
25430 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d  Vdbe;.  int iMem
25440 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
25450 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  get>0 );.  asser
25460 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
25470 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73  _REGISTER );.  s
25480 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
25490 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
254a0 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20  rget);.  iMem = 
254b0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
254c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
254d0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
254e0 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20  target, iMem);. 
254f0 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
25500 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a  pExpr, iMem);.}.
25510 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
25520 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
25530 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
25540 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
25550 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
25560 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f  ession list into
25570 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
25580 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
25590 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a  ng at target..**
255a0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
255b0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
255c0 73 20 65 76 61 6c 75 61 74 65 64 2e 20 20 54 68  s evaluated.  Th
255d0 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
255e0 64 20 77 69 6c 6c 0a 2a 2a 20 75 73 75 61 6c 6c  d will.** usuall
255f0 79 20 62 65 20 70 4c 69 73 74 2d 3e 6e 45 78 70  y be pList->nExp
25600 72 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 72  r but might be r
25610 65 64 75 63 65 64 20 69 66 20 53 51 4c 49 54 45  educed if SQLITE
25620 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 0a 2a 2a  _ECEL_OMITREF.**
25630 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a   is defined..**.
25640 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
25650 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76  EL_DUP flag prev
25660 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e  ents the argumen
25670 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ts from being.**
25680 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50   filled using OP
25690 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79  _SCopy.  OP_Copy
256a0 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e   must be used in
256b0 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stead..**.** The
256c0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
256d0 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c  TOR argument all
256e0 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ows constant arg
256f0 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20  uments to be.** 
25700 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74  factored out int
25710 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  o initialization
25720 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
25730 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46   SQLITE_ECEL_REF
25740 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74   flag means that
25750 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
25760 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a  the list with.**
25770 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e   ExprList.a[].u.
25780 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
25790 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
257a0 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  n evaluated and 
257b0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67  stored.** in reg
257c0 69 73 74 65 72 73 20 61 74 20 73 72 63 52 65 67  isters at srcReg
257d0 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61 6c  , and so the val
257e0 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65 64  ue can be copied
257f0 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2a 20   from there..** 
25800 49 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f  If SQLITE_ECEL_O
25810 4d 49 54 52 45 46 20 69 73 20 61 6c 73 6f 20 73  MITREF is also s
25820 65 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  et, then the val
25830 75 65 73 20 77 69 74 68 20 75 2e 78 2e 69 4f 72  ues with u.x.iOr
25840 64 65 72 42 79 43 6f 6c 3e 30 0a 2a 2a 20 61 72  derByCol>0.** ar
25850 65 20 73 69 6d 70 6c 79 20 6f 6d 69 74 74 65 64  e simply omitted
25860 20 72 61 74 68 65 72 20 74 68 61 6e 20 62 65 69   rather than bei
25870 6e 67 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73  ng copied from s
25880 72 63 52 65 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rcReg..*/.int sq
25890 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
258a0 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
258b0 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
258c0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
258d0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
258e0 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78  ist,   /* The ex
258f0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
25900 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
25910 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20  nt target,      
25920 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
25930 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ite results */. 
25940 20 69 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20   int srcReg,    
25950 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65      /* Source re
25960 67 69 73 74 65 72 73 20 69 66 20 53 51 4c 49 54  gisters if SQLIT
25970 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20  E_ECEL_REF */.  
25980 75 38 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  u8 flags        
25990 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45     /* SQLITE_ECE
259a0 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  L_* flags */.){.
259b0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
259c0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
259d0 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20   int i, j, n;.  
259e0 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61  u8 copyOp = (fla
259f0 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
25a00 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20  _DUP) ? OP_Copy 
25a10 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64  : OP_SCopy;.  Vd
25a20 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
25a30 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
25a40 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61   pList!=0 );.  a
25a50 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
25a60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
25a70 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b  rse->pVdbe!=0 );
25a80 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20    /* Never gets 
25a90 74 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69  this far otherwi
25aa0 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73  se */.  n = pLis
25ab0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
25ac0 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70  !ConstFactorOk(p
25ad0 50 61 72 73 65 29 20 29 20 66 6c 61 67 73 20 26  Parse) ) flags &
25ae0 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  = ~SQLITE_ECEL_F
25af0 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74  ACTOR;.  for(pIt
25b00 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
25b10 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
25b20 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
25b30 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70  pExpr = pItem->p
25b40 45 78 70 72 3b 0a 23 69 66 64 65 66 20 53 51 4c  Expr;.#ifdef SQL
25b50 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
25b60 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20  R_REFERENCES.   
25b70 20 69 66 28 20 70 49 74 65 6d 2d 3e 62 53 6f 72   if( pItem->bSor
25b80 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20  terRef ){.      
25b90 69 2d 2d 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  i--;.      n--;.
25ba0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
25bb0 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
25bc0 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  & SQLITE_ECEL_RE
25bd0 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20 70 49  F)!=0 && (j = pI
25be0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
25bf0 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20  yCol)>0 ){.     
25c00 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
25c10 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
25c20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2d 2d 3b   ){.        i--;
25c30 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  .        n--;.  
25c40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25c50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25c60 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20  dOp2(v, copyOp, 
25c70 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74 61 72 67  j+srcReg-1, targ
25c80 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  et+i);.      }. 
25c90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
25ca0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
25cb0 4c 5f 46 41 43 54 4f 52 29 21 3d 30 0a 20 20 20  L_FACTOR)!=0.   
25cc0 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
25cd0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
25ce0 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20  NotJoin(pExpr). 
25cf0 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
25d00 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
25d10 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
25d20 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
25d30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
25d40 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
25d50 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
25d60 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
25d70 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69  rget+i);.      i
25d80 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
25d90 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64  +i ){.        Vd
25da0 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20  beOp *pOp;.     
25db0 20 20 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f     if( copyOp==O
25dc0 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20  P_Copy.         
25dd0 26 26 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56  && (pOp=sqlite3V
25de0 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29  dbeGetOp(v, -1))
25df0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70  ->opcode==OP_Cop
25e00 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  y.         && pO
25e10 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p1+pOp->p3+1=
25e20 3d 69 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  =inReg.         
25e30 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e  && pOp->p2+pOp->
25e40 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20  p3+1==target+i. 
25e50 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
25e60 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20      pOp->p3++;. 
25e70 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25e80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
25e90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70  dbeAddOp2(v, cop
25ea0 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  yOp, inReg, targ
25eb0 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  et+i);.        }
25ec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25ed0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
25ee0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
25ef0 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57   code for a BETW
25f00 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  EEN operator..**
25f10 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e  .**    x BETWEEN
25f20 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54   y AND z.**.** T
25f30 68 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69  he above is equi
25f40 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a  valent to .**.**
25f50 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
25f60 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20  z.**.** Code it 
25f70 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20  as such, taking 
25f80 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63  care to do the c
25f90 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73  ommon subexpress
25fa0 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69  ion.** eliminati
25fb0 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54  on of x..**.** T
25fc0 68 65 20 78 4a 75 6d 70 49 66 20 70 61 72 61 6d  he xJumpIf param
25fd0 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20  eter determines 
25fe0 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20  details:.**.**  
25ff0 20 20 4e 55 4c 4c 3a 20 20 20 20 20 20 20 20 20    NULL:         
26000 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20            Store 
26010 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
26020 6c 74 20 69 6e 20 72 65 67 5b 64 65 73 74 5d 0a  lt in reg[dest].
26030 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  **    sqlite3Exp
26040 72 49 66 54 72 75 65 3a 20 20 20 20 20 20 4a 75  rIfTrue:      Ju
26050 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20 74 72  mp to dest if tr
26060 75 65 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  ue.**    sqlite3
26070 45 78 70 72 49 66 46 61 6c 73 65 3a 20 20 20 20  ExprIfFalse:    
26080 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66   Jump to dest if
26090 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65   false.**.** The
260a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 70 61 72 61   jumpIfNull para
260b0 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64  meter is ignored
260c0 20 69 66 20 78 4a 75 6d 70 49 66 20 69 73 20 4e   if xJumpIf is N
260d0 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ULL..*/.static v
260e0 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74 77  oid exprCodeBetw
260f0 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  een(.  Parse *pP
26100 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
26110 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
26120 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
26130 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
26140 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45  ,      /* The BE
26150 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e  TWEEN expression
26160 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
26170 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
26180 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 72 20 73  destination or s
26190 74 6f 72 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20  torage location 
261a0 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d  */.  void (*xJum
261b0 70 29 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c  p)(Parse*,Expr*,
261c0 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20 41 63 74  int,int), /* Act
261d0 69 6f 6e 20 74 6f 20 74 61 6b 65 20 2a 2f 0a 20  ion to take */. 
261e0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
261f0 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a     /* Take the j
26200 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45  ump if the BETWE
26210 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  EN is NULL */.){
26220 0a 20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b  .  Expr exprAnd;
26230 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20       /* The AND 
26240 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d  operator in  x>=
26250 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20  y AND x<=z  */. 
26260 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20   Expr compLeft; 
26270 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20     /* The  x>=y 
26280 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
26290 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20  compRight;   /* 
262a0 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20  The  x<=z  term 
262b0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
262c0 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72  1 = 0; /* Tempor
262d0 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
262e0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 44 65 6c   */.  Expr *pDel
262f0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
26300 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
26310 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d  ;..  memset(&com
26320 70 4c 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66  pLeft, 0, sizeof
26330 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65  (Expr));.  memse
26340 74 28 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c  t(&compRight, 0,
26350 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
26360 20 20 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e    memset(&exprAn
26370 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  d, 0, sizeof(Exp
26380 72 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  r));..  assert( 
26390 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
263a0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
263b0 6c 65 63 74 29 20 29 3b 0a 20 20 70 44 65 6c 20  lect) );.  pDel 
263c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
263d0 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
263e0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  t, 0);.  if( db-
263f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
26400 20 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 64 2e   ){.    exprAnd.
26410 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
26420 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
26430 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20   &compLeft;.    
26440 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d  exprAnd.pRight =
26450 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20   &compRight;.   
26460 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54   compLeft.op = T
26470 4b 5f 47 45 3b 0a 20 20 20 20 63 6f 6d 70 4c 65  K_GE;.    compLe
26480 66 74 2e 70 4c 65 66 74 20 3d 20 70 44 65 6c 3b  ft.pLeft = pDel;
26490 0a 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52  .    compLeft.pR
264a0 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
264b0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
264c0 72 3b 0a 20 20 20 20 63 6f 6d 70 52 69 67 68 74  r;.    compRight
264d0 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20  .op = TK_LE;.   
264e0 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74   compRight.pLeft
264f0 20 3d 20 70 44 65 6c 3b 0a 20 20 20 20 63 6f 6d   = pDel;.    com
26500 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20  pRight.pRight = 
26510 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
26520 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
26530 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70  exprToRegister(p
26540 44 65 6c 2c 20 65 78 70 72 43 6f 64 65 56 65 63  Del, exprCodeVec
26550 74 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 6c  tor(pParse, pDel
26560 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20  , &regFree1));. 
26570 20 20 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a     if( xJump ){.
26580 20 20 20 20 20 20 78 4a 75 6d 70 28 70 50 61 72        xJump(pPar
26590 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
265a0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
265b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
265c0 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 65 78    /* Mark the ex
265d0 70 72 65 73 73 69 6f 6e 20 69 73 20 62 65 69 6e  pression is bein
265e0 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72  g from the ON or
265f0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
26600 20 61 20 6a 6f 69 6e 0a 20 20 20 20 20 20 2a 2a   a join.      **
26610 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 71 6c   so that the sql
26620 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
26630 65 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  et() routine wil
26640 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  l not attempt to
26650 20 6d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69   move.      ** i
26660 74 20 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65  t into the Parse
26670 2e 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74  .pConstExpr list
26680 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65  .  We should use
26690 20 61 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74   a new bit for t
266a0 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6f  his,.      ** fo
266b0 72 20 63 6c 61 72 69 74 79 2c 20 62 75 74 20 77  r clarity, but w
266c0 65 20 61 72 65 20 6f 75 74 20 6f 66 20 62 69 74  e are out of bit
266d0 73 20 69 6e 20 74 68 65 20 45 78 70 72 2e 66 6c  s in the Expr.fl
266e0 61 67 73 20 66 69 65 6c 64 20 73 6f 20 77 65 0a  ags field so we.
266f0 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 74 6f        ** have to
26700 20 72 65 75 73 65 20 74 68 65 20 45 50 5f 46 72   reuse the EP_Fr
26710 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75 6d  omJoin bit.  Bum
26720 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 44  mer. */.      pD
26730 65 6c 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  el->flags |= EP_
26740 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 20 20  FromJoin;.      
26750 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
26760 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 26 65  arget(pParse, &e
26770 78 70 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20  xprAnd, dest);. 
26780 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
26790 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
267a0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
267b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
267c0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44  xprDelete(db, pD
267d0 65 6c 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  el);..  /* Ensur
267e0 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20  e adequate test 
267f0 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65  coverage */.  te
26800 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26810 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
26820 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d    && jumpIfNull=
26830 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
26840 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26850 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26860 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
26870 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
26880 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
26890 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
268a0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72  =sqlite3ExprIfTr
268b0 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ue  && jumpIfNul
268c0 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
268d0 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
268e0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
268f0 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
26900 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
26910 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
26920 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26930 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26940 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
26950 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
26960 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
26970 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
26980 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
26990 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
269a0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
269b0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
269c0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
269d0 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49  IfFalse && jumpI
269e0 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
269f0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
26a00 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
26a10 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26a20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
26a30 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
26a40 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
26a50 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  xJump==0 );.}../
26a60 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
26a70 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
26a80 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
26a90 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
26aa0 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
26ab0 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
26ac0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
26ad0 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
26ae0 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
26af0 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
26b00 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
26b10 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
26b20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
26b30 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
26b40 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
26b50 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
26b60 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
26b70 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
26b80 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53  IfNull flag is S
26b90 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
26ba0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64  ..**.** This cod
26bb0 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
26bc0 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61   fact that certa
26bd0 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  in token values 
26be0 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61  (ex: TK_EQ).** a
26bf0 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f  re the same as o
26c00 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78  pcode values (ex
26c10 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d  : OP_Eq) that im
26c20 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72  plement the corr
26c30 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65  esponding.** ope
26c40 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c  ration.  Special
26c50 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62   comments in vdb
26c60 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70  e.c and the mkop
26c70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74  codeh.awk script
26c80 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20   in.** the make 
26c90 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68  process cause th
26ca0 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c  ese values to al
26cb0 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20  ign.  Assert()s 
26cc0 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62  in the code.** b
26cd0 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74  elow verify that
26ce0 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65   the numbers are
26cf0 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74   aligned correct
26d00 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
26d10 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61  te3ExprIfTrue(Pa
26d20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
26d30 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
26d40 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
26d50 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
26d60 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
26d70 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
26d80 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
26d90 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
26da0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
26db0 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
26dc0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
26dd0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
26de0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
26df0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
26e00 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b  0) )     return;
26e10 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f    /* Existence o
26e20 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
26e30 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
26e40 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
26e50 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
26e60 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20  No way this can 
26e70 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d  happen */.  op =
26e80 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
26e90 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
26ea0 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
26eb0 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
26ec0 20 20 20 20 20 45 78 70 72 20 2a 70 41 6c 74 20       Expr *pAlt 
26ed0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 69 6d  = sqlite3ExprSim
26ee0 70 6c 69 66 69 65 64 41 6e 64 4f 72 28 70 45 78  plifiedAndOr(pEx
26ef0 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
26f00 41 6c 74 21 3d 70 45 78 70 72 20 29 7b 0a 20 20  Alt!=pExpr ){.  
26f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26f20 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
26f30 70 41 6c 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  pAlt, dest, jump
26f40 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  IfNull);.      }
26f50 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
26f60 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  AND ){.        i
26f70 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
26f80 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
26f90 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  rse);.        te
26fa0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26fb0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ll==0 );.       
26fc0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
26fd0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
26fe0 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 0a 20 20  r->pLeft, d2,.  
26ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27000 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 66 4e           jumpIfN
27010 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
27020 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
27030 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
27040 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
27050 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
27060 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
27070 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
27080 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
27090 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  2);.      }else{
270a0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
270b0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
270c0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
270d0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
270e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
270f0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
27100 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
27110 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
27120 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
27130 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
27140 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
27150 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
27160 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
27170 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
27180 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
27190 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
271a0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
271b0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
271c0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
271d0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
271e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
271f0 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48     case TK_TRUTH
27200 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73  : {.      int is
27210 4e 6f 74 3b 20 20 20 20 20 20 2f 2a 20 49 53 20  Not;      /* IS 
27220 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e  NOT TRUE or IS N
27230 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20  OT FALSE */.    
27240 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 20    int isTrue;   
27250 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20    /* IS TRUE or 
27260 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20  IS NOT TRUE */. 
27270 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
27280 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
27290 20 20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45        isNot = pE
272a0 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e  xpr->op2==TK_ISN
272b0 4f 54 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65  OT;.      isTrue
272c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72   = sqlite3ExprTr
272d0 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e  uthValue(pExpr->
272e0 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74  pRight);.      t
272f0 65 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20  estcase( isTrue 
27300 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20  && isNot );.    
27310 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54    testcase( !isT
27320 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a  rue && isNot );.
27330 20 20 20 20 20 20 69 66 28 20 69 73 54 72 75 65        if( isTrue
27340 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20   ^ isNot ){.    
27350 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
27360 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
27370 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
27380 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27390 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f              isNo
273a0 74 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  t ? SQLITE_JUMPI
273b0 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20  FNULL : 0);.    
273c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
273d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
273e0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
273f0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a  r->pLeft, dest,.
27400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27410 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74             isNot
27420 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   ? SQLITE_JUMPIF
27430 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20  NULL : 0);.     
27440 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
27450 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
27460 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
27470 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
27480 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
27490 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
274a0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
274b0 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  OT );.      op =
274c0 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54   (op==TK_IS) ? T
274d0 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20  K_EQ : TK_NE;.  
274e0 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d      jumpIfNull =
274f0 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a   SQLITE_NULLEQ;.
27500 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
27510 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ru */.    case T
27520 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
27530 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
27540 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
27550 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
27560 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
27570 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_EQ: {.      if
27580 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
27590 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65  ector(pExpr->pLe
275a0 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75  ft) ) goto defau
275b0 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74  lt_expr;.      t
275c0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
275d0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
275e0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
275f0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
27600 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
27610 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
27620 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
27630 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
27640 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
27650 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
27660 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
27670 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27680 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
27690 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
276a0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
276b0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
276c0 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
276d0 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
276e0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
276f0 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
27700 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
27710 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27720 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
27730 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
27740 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
27750 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
27760 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
27770 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
27780 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
27790 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
277a0 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
277b0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
277c0 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
277d0 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
277e0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
277f0 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
27800 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
27810 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
27820 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  e(op==OP_Eq);.  
27830 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
27840 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
27850 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
27860 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
27870 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
27880 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71  eIf(v, op==OP_Eq
27890 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
278a0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
278b0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
278c0 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74  NE==OP_Ne); test
278d0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
278e0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
278f0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
27900 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
27910 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
27920 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
27930 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
27940 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Ne && jumpIfNul
27950 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
27960 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27970 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
27980 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27990 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
279a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
279b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
279c0 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
279d0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
279e0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
279f0 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
27a00 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  l );   testcase(
27a10 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
27a20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27a30 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
27a40 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61  otNull ); testca
27a50 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
27a60 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  LL );.      r1 =
27a70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
27a80 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
27a90 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
27aa0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
27ab0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
27ac0 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
27ad0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27ae0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
27af0 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  ISNULL);.      V
27b00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27b10 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
27b20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27b30 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
27b40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27b50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27b60 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
27b70 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
27b80 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
27b90 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
27ba0 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
27bb0 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78   dest, sqlite3Ex
27bc0 70 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66  prIfTrue, jumpIf
27bd0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
27be0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
27bf0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
27c00 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
27c10 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
27c20 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
27c30 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
27c40 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
27c50 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
27c60 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c  ull = jumpIfNull
27c70 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66   ? dest : destIf
27c80 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c  False;.      sql
27c90 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
27ca0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
27cb0 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
27cc0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
27cd0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
27ce0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
27cf0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
27d00 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
27d10 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alse);.      bre
27d20 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
27d30 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
27d40 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72      default_expr
27d50 3a 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  :.      if( Expr
27d60 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72  AlwaysTrue(pExpr
27d70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
27d80 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
27d90 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
27da0 73 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79  se if( ExprAlway
27db0 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
27dc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  .        /* No-o
27dd0 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  p */.      }else
27de0 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
27df0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
27e00 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
27e10 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
27e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27e30 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
27e40 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
27e50 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
27e60 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
27e70 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
27e80 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
27e90 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
27ea0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
27eb0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
27ec0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27ed0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
27ee0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
27ef0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
27f00 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
27f10 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
27f20 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a  e, regFree2);  .
27f30 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
27f40 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
27f50 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
27f60 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
27f70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
27f80 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
27f90 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
27fa0 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
27fb0 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
27fc0 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
27fd0 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
27fe0 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
27ff0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
28000 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
28010 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
28020 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
28030 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
28040 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
28050 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
28060 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  L or fall throug
28070 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a  h if jumpIfNull.
28080 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ** is 0..*/.void
28090 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
280a0 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
280b0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
280c0 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
280d0 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
280e0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
280f0 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
28100 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
28110 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
28120 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
28130 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
28140 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
28150 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
28160 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
28170 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
28180 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
28190 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  n; /* Existence 
281a0 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
281b0 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
281c0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20  f( pExpr==0 )   
281d0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
281e0 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70  he value of pExp
281f0 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65  r->op and op are
28200 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c   related as foll
28210 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
28220 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20       pExpr->op  
28230 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a            op.  *
28240 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  *       --------
28250 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  -          -----
28260 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20  -----.  **      
28270 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20   TK_ISNULL      
28280 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20      OP_NotNull. 
28290 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54   **       TK_NOT
282a0 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f  NULL         OP_
282b0 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  IsNull.  **     
282c0 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20    TK_NE         
282d0 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20       OP_Eq.  ** 
282e0 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20        TK_EQ     
282f0 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20           OP_Ne. 
28300 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20   **       TK_GT 
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
28320 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Le.  **       TK
28330 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _LE             
28340 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Gt.  **     
28350 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20    TK_GE         
28360 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20       OP_Lt.  ** 
28370 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20        TK_LT     
28380 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20           OP_Ge. 
28390 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68   **.  ** For oth
283a0 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78  er values of pEx
283b0 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e  pr->op, op is un
283c0 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73  defined and unus
283d0 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  ed..  ** The val
283e0 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  ue of TK_ and OP
283f0 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20  _ constants are 
28400 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68  arranged such th
28410 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63  at we.  ** can c
28420 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69  ompute the mappi
28430 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74  ng above using t
28440 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
28450 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73  ression..  ** As
28460 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74  sert()s verify t
28470 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74  hat the computat
28480 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ion is correct..
28490 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45    */.  op = ((pE
284a0 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55  xpr->op+(TK_ISNU
284b0 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53  LL&1))^1)-(TK_IS
284c0 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56  NULL&1);..  /* V
284d0 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c  erify correct al
284e0 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61  ignment of TK_ a
284f0 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
28500 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
28510 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53  pExpr->op!=TK_IS
28520 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  NULL || op==OP_N
28530 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  otNull );.  asse
28540 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
28550 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  K_NOTNULL || op=
28560 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
28570 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28580 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_NE || op==
28590 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72  OP_Eq );.  asser
285a0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
285b0 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65  _EQ || op==OP_Ne
285c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
285d0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c  xpr->op!=TK_LT |
285e0 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  | op==OP_Ge );. 
285f0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
28600 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op!=TK_LE || op=
28610 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
28620 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
28630 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GT || op==OP_L
28640 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
28650 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20  Expr->op!=TK_GE 
28660 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  || op==OP_Lt );.
28670 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
28680 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
28690 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
286a0 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
286b0 20 45 78 70 72 20 2a 70 41 6c 74 20 3d 20 73 71   Expr *pAlt = sq
286c0 6c 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66  lite3ExprSimplif
286d0 69 65 64 41 6e 64 4f 72 28 70 45 78 70 72 29 3b  iedAndOr(pExpr);
286e0 0a 20 20 20 20 20 20 69 66 28 20 70 41 6c 74 21  .      if( pAlt!
286f0 3d 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  =pExpr ){.      
28700 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
28710 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 41 6c  alse(pParse, pAl
28720 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
28730 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ull);.      }els
28740 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
28750 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20  =TK_AND ){.     
28760 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
28770 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28780 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28790 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
287a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
287b0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
287c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
287d0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
287e0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
287f0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
28800 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Null);.      }el
28810 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
28820 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
28830 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
28840 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
28850 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
28860 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
28870 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
28880 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28890 4c 65 66 74 2c 20 64 32 2c 0a 20 20 20 20 20 20  Left, d2,.      
288a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288b0 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53      jumpIfNull^S
288c0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
288d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
288e0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
288f0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
28900 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
28910 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
28920 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
28930 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
28940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
28950 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
28960 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
28970 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
28980 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
28990 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
289a0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
289b0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
289c0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
289d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
289e0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
289f0 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RUTH: {.      in
28a00 74 20 69 73 4e 6f 74 3b 20 20 20 2f 2a 20 49 53  t isNot;   /* IS
28a10 20 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20   NOT TRUE or IS 
28a20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20  NOT FALSE */.   
28a30 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20     int isTrue;  
28a40 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
28a50 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20   NOT TRUE */.   
28a60 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
28a70 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28a80 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70      isNot = pExp
28a90 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54  r->op2==TK_ISNOT
28aa0 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d  ;.      isTrue =
28ab0 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74   sqlite3ExprTrut
28ac0 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52  hValue(pExpr->pR
28ad0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73  ight);.      tes
28ae0 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26  tcase( isTrue &&
28af0 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20   isNot );.      
28b00 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75  testcase( !isTru
28b10 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20  e && isNot );.  
28b20 20 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e      if( isTrue ^
28b30 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20   isNot ){.      
28b40 20 20 2f 2a 20 49 53 20 54 52 55 45 20 61 6e 64    /* IS TRUE and
28b50 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f   IS NOT FALSE */
28b60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28b70 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
28b80 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
28b90 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20  , dest,.        
28ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bb0 20 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53     isNot ? 0 : S
28bc0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
28bd0 29 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  );..      }else{
28be0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20 46  .        /* IS F
28bf0 41 4c 53 45 20 61 6e 64 20 49 53 20 4e 4f 54 20  ALSE and IS NOT 
28c00 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  TRUE */.        
28c10 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
28c20 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
28c30 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20  >pLeft, dest,.  
28c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c50 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20          isNot ? 
28c60 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  0 : SQLITE_JUMPI
28c70 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
28c80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28c90 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
28ca0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
28cb0 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
28cc0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
28cd0 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
28ce0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
28cf0 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
28d00 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78  .      op = (pEx
28d10 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f  pr->op==TK_IS) ?
28d20 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a   TK_NE : TK_EQ;.
28d30 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c        jumpIfNull
28d40 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
28d50 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
28d60 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65  thru */.    case
28d70 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
28d80 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
28d90 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
28da0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
28db0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
28dc0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
28dd0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
28de0 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70  sVector(pExpr->p
28df0 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66  Left) ) goto def
28e00 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20  ault_expr;.     
28e10 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
28e20 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
28e30 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
28e40 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
28e50 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
28e60 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
28e70 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
28e80 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
28e90 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
28ea0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
28eb0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
28ec0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
28ed0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
28ee0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
28f00 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
28f10 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
28f20 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
28f30 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
28f40 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
28f50 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
28f60 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Lt);.      asser
28f70 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
28f80 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
28f90 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
28fa0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
28fb0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28fc0 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
28fd0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
28fe0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
28ff0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
29000 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
29010 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
29020 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
29030 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
29040 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
29050 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
29060 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
29070 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  ase(op==OP_Eq);.
29080 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
29090 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
290a0 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  q && jumpIfNull!
290b0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
290c0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
290d0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
290e0 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
290f0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
29100 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
29110 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
29120 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
29130 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
29140 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
29150 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
29160 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
29170 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
29180 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
29190 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
291a0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
291b0 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
291c0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
291d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
291e0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
291f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
29200 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
29210 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
29220 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
29230 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
29240 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
29250 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
29260 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
29270 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
29280 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
29290 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
292a0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
292b0 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56  TK_ISNULL );   V
292c0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
292d0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
292e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
292f0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
29300 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
29310 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
29320 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
29330 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
29340 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
29350 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
29360 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
29370 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29380 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
29390 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
293a0 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
293b0 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69  Expr, dest, sqli
293c0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c 20  te3ExprIfFalse, 
293d0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
293e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
293f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29400 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
29410 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
29420 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e       if( jumpIfN
29430 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
29440 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
29450 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
29460 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  dest, dest);.   
29470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29480 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
29490 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
294a0 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
294b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
294c0 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
294d0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
294e0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
294f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29500 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
29510 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
29520 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
29530 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
29540 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
29550 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20    default_expr: 
29560 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 41  .      if( ExprA
29570 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
29580 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
29590 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
295a0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
295b0 73 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79  se if( ExprAlway
295c0 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a  sTrue(pExpr) ){.
295d0 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70          /* no-op
295e0 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
295f0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
29600 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
29610 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
29620 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
29630 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29640 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
29650 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  ot, r1, dest, ju
29660 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
29670 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
29680 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  ge(v);.        t
29690 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
296a0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
296b0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
296c0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
296d0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
296e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
296f0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
29700 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
29710 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
29720 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
29730 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
29740 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71  }../*.** Like sq
29750 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
29760 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 61  () except that a
29770 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
29780 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a   pExpr before.**
29790 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
297a0 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20  , and that copy 
297b0 69 73 20 64 65 6c 65 74 65 64 20 61 66 74 65 72  is deleted after
297c0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
297d0 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65  . This.** ensure
297e0 73 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  s that the origi
297f0 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63  nal pExpr is unc
29800 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  hanged..*/.void 
29810 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
29820 73 65 44 75 70 28 50 61 72 73 65 20 2a 70 50 61  seDup(Parse *pPa
29830 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
29840 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a  , int dest,int j
29850 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71  umpIfNull){.  sq
29860 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
29870 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
29880 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45  pCopy = sqlite3E
29890 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
298a0 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  , 0);.  if( db->
298b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
298c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
298d0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
298e0 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a  , pCopy, dest, j
298f0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  umpIfNull);.  }.
29900 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
29910 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a  ete(db, pCopy);.
29920 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73  }../*.** Express
29930 69 6f 6e 20 70 56 61 72 20 69 73 20 67 75 61 72  ion pVar is guar
29940 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20  anteed to be an 
29950 53 51 4c 20 76 61 72 69 61 62 6c 65 2e 20 70 45  SQL variable. pE
29960 78 70 72 20 6d 61 79 20 62 65 20 61 6e 79 0a 2a  xpr may be any.*
29970 2a 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73  * type of expres
29980 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  sion..**.** If p
29990 45 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65  Expr is a simple
299a0 20 53 51 4c 20 76 61 6c 75 65 20 2d 20 61 6e 20   SQL value - an 
299b0 69 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73  integer, real, s
299c0 74 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a 20 6f  tring, blob.** o
299d0 72 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2d 20 74  r NULL value - t
299e0 68 65 6e 20 74 68 65 20 56 44 42 45 20 63 75 72  hen the VDBE cur
299f0 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 72 65  rently being pre
29a00 70 61 72 65 64 20 69 73 20 63 6f 6e 66 69 67 75  pared is configu
29a10 72 65 64 0a 2a 2a 20 74 6f 20 72 65 2d 70 72 65  red.** to re-pre
29a20 70 61 72 65 20 65 61 63 68 20 74 69 6d 65 20 61  pare each time a
29a30 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 62 6f   new value is bo
29a40 75 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20  und to variable 
29a50 70 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69  pVar..**.** Addi
29a60 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 70 45 78  tionally, if pEx
29a70 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53  pr is a simple S
29a80 51 4c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  QL value and the
29a90 20 76 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a   value is the.**
29aa0 20 73 61 6d 65 20 61 73 20 74 68 61 74 20 63 75   same as that cu
29ab0 72 72 65 6e 74 6c 79 20 62 6f 75 6e 64 20 74 6f  rrently bound to
29ac0 20 76 61 72 69 61 62 6c 65 20 70 56 61 72 2c 20   variable pVar, 
29ad0 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
29ae0 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  rned..** Otherwi
29af0 73 65 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65  se, if the value
29b00 73 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61  s are not the sa
29b10 6d 65 20 6f 72 20 69 66 20 70 45 78 70 72 20 69  me or if pExpr i
29b20 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 0a 2a  s not a simple.*
29b30 2a 20 53 51 4c 20 76 61 6c 75 65 2c 20 7a 65 72  * SQL value, zer
29b40 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  o is returned..*
29b50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
29b60 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65  rCompareVariable
29b70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
29b80 45 78 70 72 20 2a 70 56 61 72 2c 20 45 78 70 72  Expr *pVar, Expr
29b90 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
29ba0 72 65 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  res = 0;.  int i
29bb0 56 61 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  Var;.  sqlite3_v
29bc0 61 6c 75 65 20 2a 70 4c 2c 20 2a 70 52 20 3d 20  alue *pL, *pR = 
29bd0 30 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 56  0;.  .  sqlite3V
29be0 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
29bf0 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
29c00 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
29c10 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2c 20 26 70  ITE_AFF_BLOB, &p
29c20 52 29 3b 0a 20 20 69 66 28 20 70 52 20 29 7b 0a  R);.  if( pR ){.
29c30 20 20 20 20 69 56 61 72 20 3d 20 70 56 61 72 2d      iVar = pVar-
29c40 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  >iColumn;.    sq
29c50 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
29c60 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ask(pParse->pVdb
29c70 65 2c 20 69 56 61 72 29 3b 0a 20 20 20 20 70 4c  e, iVar);.    pL
29c80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
29c90 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 50 61 72  tBoundValue(pPar
29ca0 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20  se->pReprepare, 
29cb0 69 56 61 72 2c 20 53 51 4c 49 54 45 5f 41 46 46  iVar, SQLITE_AFF
29cc0 5f 42 4c 4f 42 29 3b 0a 20 20 20 20 69 66 28 20  _BLOB);.    if( 
29cd0 70 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  pL ){.      if( 
29ce0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
29cf0 70 65 28 70 4c 29 3d 3d 53 51 4c 49 54 45 5f 54  pe(pL)==SQLITE_T
29d00 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  EXT ){.        s
29d10 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
29d20 74 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65 20 73  t(pL); /* Make s
29d30 75 72 65 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  ure the encoding
29d40 20 69 73 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20   is UTF-8 */.   
29d50 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d     }.      res =
29d60 20 20 30 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 43    0==sqlite3MemC
29d70 6f 6d 70 61 72 65 28 70 4c 2c 20 70 52 2c 20 30  ompare(pL, pR, 0
29d80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
29d90 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52  ite3ValueFree(pR
29da0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
29db0 6c 75 65 46 72 65 65 28 70 4c 29 3b 0a 20 20 7d  lueFree(pL);.  }
29dc0 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ..  return res;.
29dd0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
29de0 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
29df0 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
29e00 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30  trees.  Return 0
29e10 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
29e20 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63  xpressions are c
29e30 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69  ompletely identi
29e40 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69  cal.  Return 1 i
29e50 66 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e  f they differ on
29e60 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41  ly.** by a COLLA
29e70 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74  TE operator at t
29e80 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52  he top level.  R
29e90 65 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65  eturn 2 if there
29ea0 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73   are differences
29eb0 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74  .** other than t
29ec0 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c  he top-level COL
29ed0 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LATE operator..*
29ee0 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
29ef0 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
29f00 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
29f10 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
29f20 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
29f30 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
29f40 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
29f50 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
29f60 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
29f70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69  .**.** The pA si
29f80 64 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e  de might be usin
29f90 67 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20  g TK_REGISTER.  
29fa0 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
29fb0 61 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a  ase and pB is.**
29fc0 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45   not using TK_RE
29fd0 47 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74  GISTER but is ot
29fe0 68 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65  herwise equivale
29ff0 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72  nt, then still r
2a000 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53  eturn 0..**.** S
2a010 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f  ometimes this ro
2a020 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
2a030 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20  n 2 even if the 
2a040 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  two expressions.
2a050 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71  ** really are eq
2a060 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65  uivalent.  If we
2a070 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68   cannot prove th
2a080 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
2a090 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69  ns are.** identi
2a0a0 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32  cal, we return 2
2a0b0 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
2a0c0 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  .  So if this ro
2a0d0 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
2a0e0 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20   2, then you do 
2a0f0 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20  not really know 
2a100 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74  for certain if t
2a110 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
2a120 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
2a130 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20  me.  But if you 
2a140 67 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74  get a 0 or 1 ret
2a150 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a  urn, then you.**
2a160 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65   can be sure the
2a170 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
2a180 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74   the same.  In t
2a190 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a  he places where.
2a1a0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
2a1b0 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73  is used, it does
2a1c0 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74   not hurt to get
2a1d0 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68   an extra 2 - th
2a1e0 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74  at.** just might
2a1f0 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20   result in some 
2a200 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20  slightly slower 
2a210 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72  code.  But retur
2a220 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72  ning.** an incor
2a230 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c  rect 0 or 1 coul
2a240 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66  d lead to a malf
2a250 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
2a260 66 20 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20  f pParse is not 
2a270 4e 55 4c 4c 20 74 68 65 6e 20 54 4b 5f 56 41 52  NULL then TK_VAR
2a280 49 41 42 4c 45 20 74 65 72 6d 73 20 69 6e 20 70  IABLE terms in p
2a290 41 20 77 69 74 68 20 62 69 6e 64 69 6e 67 73 20  A with bindings 
2a2a0 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 52  in.** pParse->pR
2a2b0 65 70 72 65 70 61 72 65 20 63 61 6e 20 62 65 20  eprepare can be 
2a2c0 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20  matched against 
2a2d0 6c 69 74 65 72 61 6c 73 20 69 6e 20 70 42 2e 20  literals in pB. 
2a2e0 20 54 68 65 20 0a 2a 2a 20 70 50 61 72 73 65 2d   The .** pParse-
2a2f0 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20  >pVdbe->expmask 
2a300 62 69 74 6d 61 73 6b 20 69 73 20 75 70 64 61 74  bitmask is updat
2a310 65 64 20 66 6f 72 20 65 61 63 68 20 76 61 72 69  ed for each vari
2a320 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 64 2e  able referenced.
2a330 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73  .** If pParse is
2a340 20 4e 55 4c 4c 20 28 74 68 65 20 6e 6f 72 6d 61   NULL (the norma
2a350 6c 20 63 61 73 65 29 20 74 68 65 6e 20 61 6e 79  l case) then any
2a360 20 54 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72   TK_VARIABLE ter
2a370 6d 20 69 6e 20 0a 2a 2a 20 41 72 67 75 6d 65 6e  m in .** Argumen
2a380 74 20 70 50 61 72 73 65 20 73 68 6f 75 6c 64 20  t pParse should 
2a390 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 4e 55 4c 4c  normally be NULL
2a3a0 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  . If it is not N
2a3b0 55 4c 4c 20 61 6e 64 20 70 41 20 6f 72 0a 2a 2a  ULL and pA or.**
2a3c0 20 70 42 20 63 61 75 73 65 73 20 61 20 72 65 74   pB causes a ret
2a3d0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 2e 0a  urn value of 2..
2a3e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2a3f0 70 72 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20  prCompare(Parse 
2a400 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
2a410 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74  A, Expr *pB, int
2a420 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f   iTab){.  u32 co
2a430 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69  mbinedFlags;.  i
2a440 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
2a450 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2a460 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a  pB==pA ? 0 : 2;.
2a470 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
2a480 20 26 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56   && pA->op==TK_V
2a490 41 52 49 41 42 4c 45 20 26 26 20 65 78 70 72 43  ARIABLE && exprC
2a4a0 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 70  ompareVariable(p
2a4b0 50 61 72 73 65 2c 20 70 41 2c 20 70 42 29 20 29  Parse, pA, pB) )
2a4c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2a4d0 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c    }.  combinedFl
2a4e0 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20  ags = pA->flags 
2a4f0 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  | pB->flags;.  i
2a500 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
2a510 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
2a520 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66  {.    if( (pA->f
2a530 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45  lags&pB->flags&E
2a540 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26  P_IntValue)!=0 &
2a550 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d  & pA->u.iValue==
2a560 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a  pB->u.iValue ){.
2a570 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2a580 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2a590 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   2;.  }.  if( pA
2a5a0 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 7c 7c 20  ->op!=pB->op || 
2a5b0 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 52 41 49 53 45  pA->op==TK_RAISE
2a5c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
2a5d0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
2a5e0 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
2a5f0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d  pare(pParse, pA-
2a600 3e 70 4c 65 66 74 2c 70 42 2c 69 54 61 62 29 3c  >pLeft,pB,iTab)<
2a610 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
2a620 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
2a630 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pB->op==TK_CO
2a640 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
2a650 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2a660 73 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65 66 74  se, pA,pB->pLeft
2a670 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20  ,iTab)<2 ){.    
2a680 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2a690 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  }.    return 2;.
2a6a0 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
2a6b0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  !=TK_COLUMN && p
2a6c0 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  A->op!=TK_AGG_CO
2a6d0 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54  LUMN && pA->u.zT
2a6e0 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
2a6f0 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pA->op==TK_FUNCT
2a700 49 4f 4e 20 7c 7c 20 70 41 2d 3e 6f 70 3d 3d 54  ION || pA->op==T
2a710 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
2a720 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
2a730 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75  te3StrICmp(pA->u
2a740 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
2a750 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72  oken)!=0 ) retur
2a760 6e 20 32 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  n 2;.#ifndef SQL
2a770 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
2a780 55 4e 43 0a 20 20 20 20 20 20 61 73 73 65 72 74  UNC.      assert
2a790 28 20 70 41 2d 3e 6f 70 3d 3d 70 42 2d 3e 6f 70  ( pA->op==pB->op
2a7a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
2a7b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41  prHasProperty(pA
2a7c0 2c 45 50 5f 57 69 6e 46 75 6e 63 29 21 3d 45 78  ,EP_WinFunc)!=Ex
2a7d0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42  prHasProperty(pB
2a7e0 2c 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a  ,EP_WinFunc) ){.
2a7f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32          return 2
2a800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a810 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
2a820 72 74 79 28 70 41 2c 45 50 5f 57 69 6e 46 75 6e  rty(pA,EP_WinFun
2a830 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  c) ){.        if
2a840 28 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  ( sqlite3WindowC
2a850 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2a860 41 2d 3e 79 2e 70 57 69 6e 2c 20 70 42 2d 3e 79  A->y.pWin, pB->y
2a870 2e 70 57 69 6e 2c 20 31 29 21 3d 30 20 29 7b 0a  .pWin, 1)!=0 ){.
2a880 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2a890 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   2;.        }.  
2a8a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2a8b0 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f   }else if( pA->o
2a8c0 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20  p==TK_NULL ){.  
2a8d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2a8e0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e    }else if( pA->
2a8f0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
2a900 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
2a910 74 65 33 5f 73 74 72 69 63 6d 70 28 70 41 2d 3e  te3_stricmp(pA->
2a920 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
2a930 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75  Token)!=0 ) retu
2a940 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 2;.    }else 
2a950 69 66 28 20 41 4c 57 41 59 53 28 70 42 2d 3e 75  if( ALWAYS(pB->u
2a960 2e 7a 54 6f 6b 65 6e 21 3d 30 29 20 26 26 20 73  .zToken!=0) && s
2a970 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b  trcmp(pA->u.zTok
2a980 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  en,pB->u.zToken)
2a990 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
2a9a0 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 2;.    }.  }
2a9b0 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67  .  if( (pA->flag
2a9c0 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
2a9d0 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
2a9e0 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65  P_Distinct) ) re
2a9f0 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 28 63  turn 2;.  if( (c
2aa00 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
2aa10 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 20  P_TokenOnly)==0 
2aa20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69  ){.    if( combi
2aa30 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49  nedFlags & EP_xI
2aa40 73 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  sSelect ) return
2aa50 20 32 3b 0a 20 20 20 20 69 66 28 20 28 63 6f 6d   2;.    if( (com
2aa60 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
2aa70 46 69 78 65 64 43 6f 6c 29 3d 3d 30 0a 20 20 20  FixedCol)==0.   
2aa80 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
2aa90 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
2aaa0 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70  pA->pLeft, pB->p
2aab0 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20 72 65  Left, iTab) ) re
2aac0 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
2aad0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2aae0 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70  re(pParse, pA->p
2aaf0 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
2ab00 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
2ab10 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
2ab20 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
2ab30 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c  are(pA->x.pList,
2ab40 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54   pB->x.pList, iT
2ab50 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
2ab60 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d      if( pA->op!=
2ab70 54 4b 5f 53 54 52 49 4e 47 0a 20 20 20 20 20 26  TK_STRING.     &
2ab80 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 54 52 55  & pA->op!=TK_TRU
2ab90 45 46 41 4c 53 45 0a 20 20 20 20 20 26 26 20 28  EFALSE.     && (
2aba0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
2abb0 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 0a 20  EP_Reduced)==0. 
2abc0 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
2abd0 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
2abe0 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
2abf0 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 2;.      if( p
2ac00 41 2d 3e 6f 70 32 21 3d 70 42 2d 3e 6f 70 32 20  A->op2!=pB->op2 
2ac10 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2ac20 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
2ac30 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20  !=pB->iTable .  
2ac40 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61       && (pA->iTa
2ac50 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56  ble!=iTab || NEV
2ac60 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30  ER(pB->iTable>=0
2ac70 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  )) ) return 2;. 
2ac80 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2ac90 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
2aca0 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69  mpare two ExprLi
2acb0 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74  st objects.  Ret
2acc0 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72  urn 0 if they ar
2acd0 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
2ace0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  .** non-zero if 
2acf0 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
2ad00 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  ny way..**.** If
2ad10 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20   any subelement 
2ad20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69  of pB has Expr.i
2ad30 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e  Table==(-1) then
2ad40 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a   it is allowed.*
2ad50 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75  * to compare equ
2ad60 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c  al to an equival
2ad70 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70  ent element in p
2ad80 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62  A with Expr.iTab
2ad90 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20  le==iTab..**.** 
2ada0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
2adb0 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ht return non-ze
2adc0 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e  ro for equivalen
2add0 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68  t ExprLists.  Th
2ade0 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71  e.** only conseq
2adf0 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69  uence will be di
2ae00 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74  sabled optimizat
2ae10 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20  ions.  But this 
2ae20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20  routine.** must 
2ae30 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69  never return 0 i
2ae40 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69  f the two ExprLi
2ae50 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64  st objects are d
2ae60 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20  ifferent, or.** 
2ae70 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69  a malfunction wi
2ae80 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  ll result..**.**
2ae90 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   Two NULL pointe
2aea0 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
2aeb0 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  d to be the same
2aec0 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f  .  But a NULL po
2aed0 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20  inter.** always 
2aee0 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e  differs from a n
2aef0 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e  on-NULL pointer.
2af00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2af10 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45  xprListCompare(E
2af20 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70  xprList *pA, Exp
2af30 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69  rList *pB, int i
2af40 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Tab){.  int i;. 
2af50 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42   if( pA==0 && pB
2af60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2af70 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
2af80 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  B==0 ) return 1;
2af90 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72  .  if( pA->nExpr
2afa0 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65  !=pB->nExpr ) re
2afb0 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d  turn 1;.  for(i=
2afc0 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20  0; i<pA->nExpr; 
2afd0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
2afe0 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69  pExprA = pA->a[i
2aff0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ].pExpr;.    Exp
2b000 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e  r *pExprB = pB->
2b010 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
2b020 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72  if( pA->a[i].sor
2b030 74 46 6c 61 67 73 21 3d 70 42 2d 3e 61 5b 69 5d  tFlags!=pB->a[i]
2b040 2e 73 6f 72 74 46 6c 61 67 73 20 29 20 72 65 74  .sortFlags ) ret
2b050 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73  urn 1;.    if( s
2b060 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2b070 65 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45 78  e(0, pExprA, pEx
2b080 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74  prB, iTab) ) ret
2b090 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
2b0a0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2b0b0 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  Like sqlite3Expr
2b0c0 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70 74  Compare() except
2b0d0 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
2b0e0 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65  rs at the top-le
2b0f0 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72  vel.** are ignor
2b100 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2b110 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
2b120 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  p(Expr *pA, Expr
2b130 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
2b140 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2b150 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a  3ExprCompare(0,.
2b160 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2b170 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2b180 61 74 65 41 6e 64 4c 69 6b 65 6c 79 28 70 41 29  ateAndLikely(pA)
2b190 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73  ,.             s
2b1a0 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
2b1b0 6c 6c 61 74 65 41 6e 64 4c 69 6b 65 6c 79 28 70  llateAndLikely(p
2b1c0 42 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  B),.            
2b1d0 20 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iTab);.}../*.**
2b1e0 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
2b1f0 20 69 66 20 45 78 70 72 20 70 20 63 61 6e 20 6f   if Expr p can o
2b200 6e 6c 79 20 62 65 20 74 72 75 65 20 69 66 20 70  nly be true if p
2b210 4e 4e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a  NN is not NULL..
2b220 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
2b230 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c  prImpliesNotNull
2b240 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2b250 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
2b260 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
2b270 45 78 70 72 20 2a 70 2c 20 20 20 20 20 20 20 20  Expr *p,        
2b280 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
2b290 73 73 69 6f 6e 20 74 6f 20 62 65 20 63 68 65 63  ssion to be chec
2b2a0 6b 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ked */.  Expr *p
2b2b0 4e 4e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  NN,          /* 
2b2c0 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
2b2d0 68 61 74 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 20  hat is NOT NULL 
2b2e0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
2b2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
2b300 65 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  e being evaluate
2b310 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 4e  d */.  int seenN
2b320 6f 74 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ot         /* Tr
2b330 75 65 20 69 66 20 70 20 69 73 20 61 6e 20 6f 70  ue if p is an op
2b340 65 72 61 6e 64 20 6f 66 20 4e 4f 54 20 2a 2f 0a  erand of NOT */.
2b350 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  ){.  assert( p )
2b360 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 4e 20  ;.  assert( pNN 
2b370 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2b380 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2b390 73 65 2c 20 70 2c 20 70 4e 4e 2c 20 69 54 61 62  se, p, pNN, iTab
2b3a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
2b3b0 72 6e 20 70 4e 4e 2d 3e 6f 70 21 3d 54 4b 5f 4e  rn pNN->op!=TK_N
2b3c0 55 4c 4c 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  ULL;.  }.  switc
2b3d0 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
2b3e0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
2b3f0 20 20 20 20 69 66 28 20 73 65 65 6e 4e 6f 74 20      if( seenNot 
2b400 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
2b410 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
2b420 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ct) ) return 0;.
2b430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
2b440 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
2b450 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20  EP_xIsSelect).  
2b460 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 2d 3e           || (p->
2b470 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 70 2d  x.pList!=0 && p-
2b480 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  >x.pList->nExpr>
2b490 30 29 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  0) );.      retu
2b4a0 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f  rn exprImpliesNo
2b4b0 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d  tNull(pParse, p-
2b4c0 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61  >pLeft, pNN, iTa
2b4d0 62 2c 20 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20  b, seenNot);.   
2b4e0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
2b4f0 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
2b500 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
2b510 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  = p->x.pList;.  
2b520 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
2b530 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  t!=0 );.      as
2b540 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
2b550 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 20 20 69  pr==2 );.      i
2b560 66 28 20 73 65 65 6e 4e 6f 74 20 29 20 72 65 74  f( seenNot ) ret
2b570 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28  urn 0;.      if(
2b580 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e   exprImpliesNotN
2b590 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ull(pParse, pLis
2b5a0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
2b5b0 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65 6e 4e 6f  NN, iTab, seenNo
2b5c0 74 29 0a 20 20 20 20 20 20 20 7c 7c 20 65 78 70  t).       || exp
2b5d0 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28  rImpliesNotNull(
2b5e0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
2b5f0 5b 31 5d 2e 70 45 78 70 72 2c 20 70 4e 4e 2c 20  [1].pExpr, pNN, 
2b600 69 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29 0a 20  iTab, seenNot). 
2b610 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2b620 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2b630 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 65  }.      return e
2b640 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c  xprImpliesNotNul
2b650 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65  l(pParse, p->pLe
2b660 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73  ft, pNN, iTab, s
2b670 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a 20  eenNot);.    }. 
2b680 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20     case TK_EQ:. 
2b690 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
2b6a0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
2b6b0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
2b6c0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
2b6d0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
2b6e0 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
2b6f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
2b700 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
2b710 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
2b720 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
2b730 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
2b740 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
2b750 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
2b760 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
2b770 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
2b780 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
2b790 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
2b7a0 20 20 20 20 20 20 69 66 28 20 65 78 70 72 49 6d        if( exprIm
2b7b0 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70 50 61  pliesNotNull(pPa
2b7c0 72 73 65 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  rse, p->pRight, 
2b7d0 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65 6e 4e  pNN, iTab, seenN
2b7e0 6f 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ot) ) return 1;.
2b7f0 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
2b800 72 75 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74  ru into the next
2b810 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
2b820 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a     case TK_SPAN:
2b830 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
2b840 4c 41 54 45 3a 0a 20 20 20 20 63 61 73 65 20 54  LATE:.    case T
2b850 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61  K_BITNOT:.    ca
2b860 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20  se TK_UPLUS:.   
2b870 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
2b880 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
2b890 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75  exprImpliesNotNu
2b8a0 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  ll(pParse, p->pL
2b8b0 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20  eft, pNN, iTab, 
2b8c0 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a  seenNot);.    }.
2b8d0 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54      case TK_TRUT
2b8e0 48 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  H: {.      if( s
2b8f0 65 65 6e 4e 6f 74 20 29 20 72 65 74 75 72 6e 20  eenNot ) return 
2b900 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  0;.      if( p->
2b910 6f 70 32 21 3d 54 4b 5f 49 53 20 29 20 72 65 74  op2!=TK_IS ) ret
2b920 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 72 65 74  urn 0;.      ret
2b930 75 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e  urn exprImpliesN
2b940 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70  otNull(pParse, p
2b950 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54  ->pLeft, pNN, iT
2b960 61 62 2c 20 73 65 65 6e 4e 6f 74 29 3b 0a 20 20  ab, seenNot);.  
2b970 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
2b980 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  NOT: {.      ret
2b990 75 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e  urn exprImpliesN
2b9a0 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70  otNull(pParse, p
2b9b0 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54  ->pLeft, pNN, iT
2b9c0 61 62 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ab, 1);.    }.  
2b9d0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2b9e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2b9f0 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f  ue if we can pro
2ba00 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20  ve the pE2 will 
2ba10 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69  always be true i
2ba20 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65  f pE1 is.** true
2ba30 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
2ba40 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d  if we cannot com
2ba50 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20  plete the proof 
2ba60 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a  or if pE2 might.
2ba70 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78  ** be false.  Ex
2ba80 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
2ba90 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20    pE1: x==5     
2baa0 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20    pE2: x==5     
2bab0 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20          Result: 
2bac0 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
2bad0 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a   x>0        pE2:
2bae0 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20   x==5           
2baf0 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a    Result: false.
2bb00 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31  **     pE1: x=21
2bb10 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31         pE2: x=21
2bb20 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73   OR y=43     Res
2bb30 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
2bb40 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20   pE1: x!=123    
2bb50 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
2bb60 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74  ULL    Result: t
2bb70 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
2bb80 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20  x!=?1      pE2: 
2bb90 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
2bba0 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
2bbb0 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e       pE1: x IS N
2bbc0 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e  ULL  pE2: x IS N
2bbd0 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
2bbe0 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
2bbf0 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20  pE1: x IS ?2    
2bc00 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
2bc10 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61  LL    Reuslt: fa
2bc20 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63  lse.**.** When c
2bc30 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55  omparing TK_COLU
2bc40 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e  MN nodes between
2bc50 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66   pE1 and pE2, if
2bc60 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72   pE2 has.** Expr
2bc70 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61  .iTable<0 then a
2bc80 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75  ssume a table nu
2bc90 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54  mber given by iT
2bca0 61 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61  ab..**.** If pPa
2bcb0 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  rse is not NULL,
2bcc0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73   then the values
2bcd0 20 6f 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62   of bound variab
2bce0 6c 65 73 20 69 6e 20 70 45 31 20 61 72 65 20 0a  les in pE1 are .
2bcf0 2a 2a 20 63 6f 6d 70 61 72 65 64 20 61 67 61 69  ** compared agai
2bd00 6e 73 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  nst literal valu
2bd10 65 73 20 69 6e 20 70 45 32 20 61 6e 64 20 70 50  es in pE2 and pP
2bd20 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70  arse->pVdbe->exp
2bd30 6d 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66  mask is.** modif
2bd40 69 65 64 20 74 6f 20 72 65 63 6f 72 64 20 77 68  ied to record wh
2bd50 69 63 68 20 62 6f 75 6e 64 20 76 61 72 69 61 62  ich bound variab
2bd60 6c 65 73 20 61 72 65 20 72 65 66 65 72 65 6e 63  les are referenc
2bd70 65 64 2e 20 20 49 66 20 70 50 61 72 73 65 20 0a  ed.  If pParse .
2bd80 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  ** is NULL, then
2bd90 20 66 61 6c 73 65 20 77 69 6c 6c 20 62 65 20 72   false will be r
2bda0 65 74 75 72 6e 65 64 20 69 66 20 70 45 31 20 63  eturned if pE1 c
2bdb0 6f 6e 74 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e  ontains any boun
2bdc0 64 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  d variables..**.
2bdd0 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  ** When in doubt
2bde0 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20  , return false. 
2bdf0 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20   Returning true 
2be00 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72  might give a per
2be10 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72  formance.** impr
2be20 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  ovement.  Return
2be30 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20  ing false might 
2be40 63 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61  cause a performa
2be50 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62  nce reduction, b
2be60 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c  ut.** it will al
2be70 77 61 79 73 20 67 69 76 65 20 74 68 65 20 63 6f  ways give the co
2be80 72 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64  rrect answer and
2be90 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73   is hence always
2bea0 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   safe..*/.int sq
2beb0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
2bec0 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72  Expr(Parse *pPar
2bed0 73 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45  se, Expr *pE1, E
2bee0 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54  xpr *pE2, int iT
2bef0 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  ab){.  if( sqlit
2bf00 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
2bf10 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2c 20  arse, pE1, pE2, 
2bf20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iTab)==0 ){.    
2bf30 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2bf40 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
2bf50 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65  OR.   && (sqlite
2bf60 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
2bf70 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45  (pParse, pE1, pE
2bf80 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a  2->pLeft, iTab).
2bf90 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2bfa0 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
2bfb0 65 73 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  esExpr(pParse, p
2bfc0 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c  E1, pE2->pRight,
2bfd0 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20   iTab) ).  ){.  
2bfe0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2bff0 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54    if( pE2->op==T
2c000 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20  K_NOTNULL.   && 
2c010 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75  exprImpliesNotNu
2c020 6c 6c 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20  ll(pParse, pE1, 
2c030 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
2c040 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  , 0).  ){.    re
2c050 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2c060 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2c070 20 54 68 69 73 20 69 73 20 74 68 65 20 45 78 70   This is the Exp
2c080 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20  r node callback 
2c090 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72 49  for sqlite3ExprI
2c0a0 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77  mpliesNotNullRow
2c0b0 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ()..** If the ex
2c0c0 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
2c0d0 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65 20  quires that the 
2c0e0 74 61 62 6c 65 20 61 74 20 70 57 61 6c 6b 65 72  table at pWalker
2c0f0 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65 20 6f  ->iCur.** have o
2c100 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 6f 6e 2d 4e  ne or more non-N
2c110 55 4c 4c 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  ULL column, then
2c120 20 73 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43   set pWalker->eC
2c130 6f 64 65 20 74 6f 20 31 20 61 6e 64 20 61 62 6f  ode to 1 and abo
2c140 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  rt..**.** This r
2c150 6f 75 74 69 6e 65 20 63 6f 6e 74 72 6f 6c 73 20  outine controls 
2c160 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
2c170 20 20 46 61 6c 73 65 20 70 6f 73 69 74 69 76 65    False positive
2c180 73 20 28 73 65 74 74 69 6e 67 0a 2a 2a 20 70 57  s (setting.** pW
2c190 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20  alker->eCode to 
2c1a0 31 20 77 68 65 6e 20 69 74 20 73 68 6f 75 6c 64  1 when it should
2c1b0 20 6e 6f 74 20 62 65 29 20 61 72 65 20 64 65 61   not be) are dea
2c1c0 64 6c 79 2c 20 62 75 74 20 66 61 6c 73 65 2d 6e  dly, but false-n
2c1d0 65 67 61 74 69 76 65 73 0a 2a 2a 20 28 6e 65 76  egatives.** (nev
2c1e0 65 72 20 73 65 74 74 69 6e 67 20 70 57 61 6c 6b  er setting pWalk
2c1f0 65 72 2d 3e 65 43 6f 64 65 29 20 69 73 20 61 20  er->eCode) is a 
2c200 68 61 72 6d 6c 65 73 73 20 6d 69 73 73 65 64 20  harmless missed 
2c210 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f  optimization..*/
2c220 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6d 70 6c  .static int impl
2c230 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57 61  iesNotNullRow(Wa
2c240 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2c250 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 74  xpr *pExpr){.  t
2c260 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2c270 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
2c280 4e 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  N );.  testcase(
2c290 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
2c2a0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
2c2b0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
2c2c0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
2c2d0 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
2c2e0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 73  n WRC_Prune;.  s
2c2f0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
2c300 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
2c310 49 53 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ISNOT:.    case 
2c320 54 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  TK_NOT:.    case
2c330 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
2c340 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
2c350 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
2c360 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
2c370 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
2c380 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  E:.    case TK_I
2c390 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  N:.    case TK_F
2c3a0 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 74  UNCTION:.      t
2c3b0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2c3c0 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
2c3d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c3e0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  pExpr->op==TK_NO
2c3f0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
2c400 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2c410 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
2c420 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2c430 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  pr->op==TK_NOTNU
2c440 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
2c450 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2c460 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
2c470 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2c480 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20  >op==TK_OR );.  
2c490 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2c4a0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53 45  xpr->op==TK_CASE
2c4b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2c4c0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2c4d0 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IN );.      te
2c4e0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c4f0 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
2c500 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
2c510 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 63 61  RC_Prune;.    ca
2c520 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
2c530 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
2c540 3e 75 2e 69 43 75 72 3d 3d 70 45 78 70 72 2d 3e  >u.iCur==pExpr->
2c550 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
2c560 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2c570 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
2c580 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2c590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2c5a0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2c5b0 0a 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20  .    /* Virtual 
2c5c0 74 61 62 6c 65 73 20 61 72 65 20 61 6c 6c 6f 77  tables are allow
2c5d0 65 64 20 74 6f 20 75 73 65 20 63 6f 6e 73 74 72  ed to use constr
2c5e0 61 69 6e 74 73 20 6c 69 6b 65 20 78 3d 4e 55 4c  aints like x=NUL
2c5f0 4c 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 61 20  L.  So.    ** a 
2c600 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
2c610 20 78 3d 79 20 64 6f 65 73 20 6e 6f 74 20 70 72   x=y does not pr
2c620 6f 76 65 20 74 68 61 74 20 79 20 69 73 20 6e 6f  ove that y is no
2c630 74 20 6e 75 6c 6c 20 69 66 20 78 0a 20 20 20 20  t null if x.    
2c640 2a 2a 20 69 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ** is the column
2c650 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61   of a virtual ta
2c660 62 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ble */.    case 
2c670 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65 20  TK_EQ:.    case 
2c680 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
2c690 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
2c6a0 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
2c6b0 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
2c6c0 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20 74 65 73  TK_GE:.      tes
2c6d0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2c6e0 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==TK_EQ );.     
2c6f0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2c700 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ->op==TK_NE );. 
2c710 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2c720 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
2c730 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2c740 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2c750 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LE );.      tes
2c760 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2c770 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
2c780 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2c790 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op==TK_GE );. 
2c7a0 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d       if( (pExpr-
2c7b0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  >pLeft->op==TK_C
2c7c0 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 72 74 75  OLUMN && IsVirtu
2c7d0 61 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  al(pExpr->pLeft-
2c7e0 3e 79 2e 70 54 61 62 29 29 0a 20 20 20 20 20 20  >y.pTab)).      
2c7f0 20 7c 7c 20 28 70 45 78 70 72 2d 3e 70 52 69 67   || (pExpr->pRig
2c800 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
2c810 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70  N && IsVirtual(p
2c820 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 79 2e  Expr->pRight->y.
2c830 70 54 61 62 29 29 0a 20 20 20 20 20 20 29 7b 0a  pTab)).      ){.
2c840 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2c850 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
2c860 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
2c870 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
2c880 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a  ontinue;.  }.}..
2c890 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
2c8a0 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  e (non-zero) if 
2c8b0 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 61 6e  expression p can
2c8c0 20 6f 6e 6c 79 20 62 65 20 74 72 75 65 20 69 66   only be true if
2c8d0 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65   at least.** one
2c8e0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
2c8f0 20 69 54 61 62 20 69 73 20 6e 6f 6e 2d 6e 75 6c   iTab is non-nul
2c900 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  l.  In other wor
2c910 64 73 2c 20 72 65 74 75 72 6e 20 74 72 75 65 0a  ds, return true.
2c920 2a 2a 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e  ** if expression
2c930 20 70 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62   p will always b
2c940 65 20 4e 55 4c 4c 20 6f 72 20 66 61 6c 73 65 20  e NULL or false 
2c950 69 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  if every column 
2c960 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55  of iTab.** is NU
2c970 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20  LL..**.** False 
2c980 6e 65 67 61 74 69 76 65 73 20 61 72 65 20 61 63  negatives are ac
2c990 63 65 70 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74  ceptable.  In ot
2c9a0 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 69 73  her words, it is
2c9b0 20 6f 6b 20 74 6f 20 72 65 74 75 72 6e 0a 2a 2a   ok to return.**
2c9c0 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 65 78   zero even if ex
2c9d0 70 72 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20  pression p will 
2c9e0 6e 65 76 65 72 20 62 65 20 74 72 75 65 20 6f 66  never be true of
2c9f0 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66   every column of
2ca00 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c   iTab.** is NULL
2ca10 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74  .  A false negat
2ca20 69 76 65 20 69 73 20 6d 65 72 65 6c 79 20 61 20  ive is merely a 
2ca30 6d 69 73 73 65 64 20 6f 70 74 69 6d 69 7a 61 74  missed optimizat
2ca40 69 6f 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e  ion opportunity.
2ca50 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 70 6f 73  .**.** False pos
2ca60 69 74 69 76 65 73 20 61 72 65 20 6e 6f 74 20 61  itives are not a
2ca70 6c 6c 6f 77 65 64 2c 20 68 6f 77 65 76 65 72 2e  llowed, however.
2ca80 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69    A false positi
2ca90 76 65 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a  ve may result.**
2caa0 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74   in an incorrect
2cab0 20 61 6e 73 77 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   answer..**.** T
2cac0 65 72 6d 73 20 6f 66 20 70 20 74 68 61 74 20 61  erms of p that a
2cad0 72 65 20 6d 61 72 6b 65 64 20 77 69 74 68 20 45  re marked with E
2cae0 50 5f 46 72 6f 6d 4a 6f 69 6e 20 28 61 6e 64 20  P_FromJoin (and 
2caf0 68 65 6e 63 65 20 74 68 61 74 20 63 6f 6d 65 20  hence that come 
2cb00 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 4f 4e 20 6f  from.** the ON o
2cb10 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
2cb20 6f 66 20 4c 45 46 54 20 4a 4f 49 4e 53 29 20 61  of LEFT JOINS) a
2cb30 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
2cb40 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 0a 2a   the analysis..*
2cb50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2cb60 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
2cb70 63 6b 20 69 66 20 61 20 4c 45 46 54 20 4a 4f 49  ck if a LEFT JOI
2cb80 4e 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72 74  N can be convert
2cb90 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f 72  ed into.** an or
2cba0 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 20 20 54 68  dinary JOIN.  Th
2cbb0 65 20 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20  e p argument is 
2cbc0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2cbd0 2e 20 20 49 66 20 74 68 65 20 57 48 45 52 45 0a  .  If the WHERE.
2cbe0 2a 2a 20 63 6c 61 75 73 65 20 72 65 71 75 69 72  ** clause requir
2cbf0 65 73 20 74 68 61 74 20 73 6f 6d 65 20 63 6f 6c  es that some col
2cc00 75 6d 6e 20 6f 66 20 74 68 65 20 72 69 67 68 74  umn of the right
2cc10 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 4c 45   table of the LE
2cc20 46 54 20 4a 4f 49 4e 0a 2a 2a 20 62 65 20 6e 6f  FT JOIN.** be no
2cc30 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  n-NULL, then the
2cc40 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62   LEFT JOIN can b
2cc50 65 20 73 61 66 65 6c 79 20 63 6f 6e 76 65 72 74  e safely convert
2cc60 65 64 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 6f 72  ed into an.** or
2cc70 64 69 6e 61 72 79 20 6a 6f 69 6e 2e 0a 2a 2f 0a  dinary join..*/.
2cc80 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
2cc90 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77  mpliesNonNullRow
2cca0 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54  (Expr *p, int iT
2ccb0 61 62 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ab){.  Walker w;
2ccc0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
2ccd0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64  prSkipCollateAnd
2cce0 4c 69 6b 65 6c 79 28 70 29 3b 0a 20 20 77 68 69  Likely(p);.  whi
2ccf0 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
2cd00 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55   p->op==TK_NOTNU
2cd10 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  LL ){.      p = 
2cd20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 7d 65  p->pLeft;.    }e
2cd30 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  lse if( p->op==T
2cd40 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 69  K_AND ){.      i
2cd50 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  f( sqlite3ExprIm
2cd60 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28  pliesNonNullRow(
2cd70 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20  p->pLeft, iTab) 
2cd80 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
2cd90 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
2cda0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2cdb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2cdc0 20 7d 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c   }.  w.xExprCall
2cdd0 62 61 63 6b 20 3d 20 69 6d 70 6c 69 65 73 4e 6f  back = impliesNo
2cde0 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77 2e 78 53  tNullRow;.  w.xS
2cdf0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2ce00 30 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  0;.  w.xSelectCa
2ce10 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77  llback2 = 0;.  w
2ce20 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 77 2e  .eCode = 0;.  w.
2ce30 75 2e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20  u.iCur = iTab;. 
2ce40 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2ce50 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
2ce60 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
2ce70 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2ce80 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2ce90 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
2cea0 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77  ed by the tree w
2ceb0 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65  alker.** to dete
2cec0 72 6d 69 6e 65 20 69 66 20 61 6e 20 65 78 70 72  rmine if an expr
2ced0 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 65 76  ession can be ev
2cee0 61 6c 75 61 74 65 64 20 62 79 20 72 65 66 65 72  aluated by refer
2cef0 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69  ence to the.** i
2cf00 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f  ndex only, witho
2cf10 75 74 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 20  ut having to do 
2cf20 61 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  a search for the
2cf30 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
2cf40 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 20  * table entry.  
2cf50 54 68 65 20 49 64 78 43 6f 76 65 72 2e 70 49 64  The IdxCover.pId
2cf60 78 20 66 69 65 6c 64 20 69 73 20 74 68 65 20 69  x field is the i
2cf70 6e 64 65 78 2e 20 20 49 64 78 43 6f 76 65 72 2e  ndex.  IdxCover.
2cf80 69 43 75 72 0a 2a 2a 20 69 73 20 74 68 65 20 63  iCur.** is the c
2cf90 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61  ursor for the ta
2cfa0 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49  ble..*/.struct I
2cfb0 64 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65  dxCover {.  Inde
2cfc0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a 20  x *pIdx;     /* 
2cfd0 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
2cfe0 74 65 73 74 65 64 20 66 6f 72 20 63 6f 76 65 72  tested for cover
2cff0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  age */.  int iCu
2d000 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  r;        /* Cur
2d010 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
2d020 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
2d030 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
2d040 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  dex */.};../*.**
2d050 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2d060 20 74 68 65 72 65 20 61 72 65 20 72 65 66 65 72   there are refer
2d070 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2d080 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57   in table .** pW
2d090 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76  alker->u.pIdxCov
2d0a0 65 72 2d 3e 69 43 75 72 20 63 61 6e 20 62 65 20  er->iCur can be 
2d0b0 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
2d0c0 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61  the index.** pWa
2d0d0 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2d0e0 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  r->pIdx..*/.stat
2d0f0 69 63 20 69 6e 74 20 65 78 70 72 49 64 78 43 6f  ic int exprIdxCo
2d100 76 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ver(Walker *pWal
2d110 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
2d120 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  ){.  if( pExpr->
2d130 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
2d140 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
2d150 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  e==pWalker->u.pI
2d160 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20  dxCover->iCur.  
2d170 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d   && sqlite3Colum
2d180 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b 65 72  nOfIndex(pWalker
2d190 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70  ->u.pIdxCover->p
2d1a0 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  Idx, pExpr->iCol
2d1b0 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20  umn)<0.  ){.    
2d1c0 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
2d1d0 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   1;.    return W
2d1e0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
2d1f0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2d200 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  nue;.}../*.** De
2d210 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e  termine if an in
2d220 64 65 78 20 70 49 64 78 20 6f 6e 20 74 61 62 6c  dex pIdx on tabl
2d230 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43  e with cursor iC
2d240 75 72 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c  ur contains will
2d250 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
2d260 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 74 75 72  on pExpr.  Retur
2d270 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 6e  n true if the in
2d280 64 65 78 20 64 6f 65 73 20 63 6f 76 65 72 20 74  dex does cover t
2d290 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2d2a0 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
2d2b0 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69  e pExpr expressi
2d2c0 6f 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74 61  on references ta
2d2d0 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74  ble columns.** t
2d2e0 68 61 74 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e  hat are not foun
2d2f0 64 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70  d in the index p
2d300 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  Idx..**.** An in
2d310 64 65 78 20 63 6f 76 65 72 69 6e 67 20 61 6e 20  dex covering an 
2d320 65 78 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73  expression means
2d330 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
2d340 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65  sion can be.** e
2d350 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6f  valuated using o
2d360 6e 6c 79 20 74 68 65 20 69 6e 64 65 78 20 61 6e  nly the index an
2d370 64 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  d without having
2d380 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a   to lookup the.*
2d390 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
2d3a0 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a  table entry..*/.
2d3b0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
2d3c0 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28 0a 20  overedByIndex(. 
2d3d0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
2d3e0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2d3f0 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 2a  x to be tested *
2d400 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
2d410 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2d420 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
2d430 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2d440 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e  ng table */.  In
2d450 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2d460 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
2d470 68 61 74 20 6d 69 67 68 74 20 62 65 20 75 73 65  hat might be use
2d480 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a  d for coverage *
2d490 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  /.){.  Walker w;
2d4a0 0a 20 20 73 74 72 75 63 74 20 49 64 78 43 6f 76  .  struct IdxCov
2d4b0 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65  er xcov;.  memse
2d4c0 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
2d4d0 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72  w));.  xcov.iCur
2d4e0 20 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e   = iCur;.  xcov.
2d4f0 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 77  pIdx = pIdx;.  w
2d500 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2d510 20 65 78 70 72 49 64 78 43 6f 76 65 72 3b 0a 20   exprIdxCover;. 
2d520 20 77 2e 75 2e 70 49 64 78 43 6f 76 65 72 20 3d   w.u.pIdxCover =
2d530 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65   &xcov;.  sqlite
2d540 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45  3WalkExpr(&w, pE
2d550 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 21  xpr);.  return !
2d560 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  w.eCode;.}.../*.
2d570 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
2d580 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2d590 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
2d5a0 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61  d by the tree wa
2d5b0 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74  lker.** to count
2d5c0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
2d5d0 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  able columns in 
2d5e0 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66  the arguments of
2d5f0 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74   an .** aggregat
2d600 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f  e function, in o
2d610 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  rder to implemen
2d620 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  t the.** sqlite3
2d630 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28  FunctionThisSrc(
2d640 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
2d650 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a  ruct SrcCount {.
2d660 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
2d670 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63     /* One partic
2d680 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ular FROM clause
2d690 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65   in a nested que
2d6a0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69  ry */.  int nThi
2d6b0 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
2d6c0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
2d6d0 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70   to columns in p
2d6e0 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  SrcList */.  int
2d6f0 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a   nOther;      /*
2d700 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
2d710 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2d720 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63   in other FROM c
2d730 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lauses */.};../*
2d740 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
2d750 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2d760 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  es to columns..*
2d770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
2d780 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72  rSrcCount(Walker
2d790 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2d7a0 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68  *pExpr){.  /* Th
2d7b0 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65  e NEVER() on the
2d7c0 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20   second term is 
2d7d0 62 65 63 61 75 73 65 20 73 71 6c 69 74 65 33 46  because sqlite3F
2d7e0 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
2d7f0 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77  rc().  ** is alw
2d800 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72  ays called befor
2d810 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
2d820 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
2d830 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a   and so the.  **
2d840 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65   TK_COLUMNs have
2d850 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f   not yet been co
2d860 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f  nverted into TK_
2d870 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a  AGG_COLUMN.  If.
2d880 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63    ** sqlite3Func
2d890 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
2d8a0 29 20 69 73 20 75 73 65 64 20 64 69 66 66 65 72  ) is used differ
2d8b0 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74  ently in the fut
2d8c0 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45  ure, the.  ** NE
2d8d0 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20  VER() will need 
2d8e0 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a  to be removed. *
2d8f0 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
2d900 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
2d910 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d  NEVER(pExpr->op=
2d920 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20  =TK_AGG_COLUMN) 
2d930 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2d940 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e    struct SrcCoun
2d950 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  t *p = pWalker->
2d960 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20  u.pSrcCount;.   
2d970 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
2d980 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e   p->pSrc;.    in
2d990 74 20 6e 53 72 63 20 3d 20 70 53 72 63 20 3f 20  t nSrc = pSrc ? 
2d9a0 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a  pSrc->nSrc : 0;.
2d9b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2d9c0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
2d9d0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
2d9e0 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  le==pSrc->a[i].i
2d9f0 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
2da00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
2da10 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d  nSrc ){.      p-
2da20 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65  >nThis++;.    }e
2da30 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  lse{.      p->nO
2da40 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ther++;.    }.  
2da50 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2da60 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2da70 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
2da80 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ny of the argume
2da90 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70 72  nts to the pExpr
2daa0 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65   Function refere
2dab0 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e  nce.** pSrcList.
2dac0 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
2dad0 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20   they do.  Also 
2dae0 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  return true if t
2daf0 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  he function.** h
2db00 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  as no arguments 
2db10 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73  or has only cons
2db20 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
2db30 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
2db40 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65   pExpr.** refere
2db50 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74  nces columns but
2db60 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   not columns of 
2db70 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20  tables found in 
2db80 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74  pSrcList..*/.int
2db90 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
2dba0 55 73 65 73 54 68 69 73 53 72 63 28 45 78 70 72  UsesThisSrc(Expr
2dbb0 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74   *pExpr, SrcList
2dbc0 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57   *pSrcList){.  W
2dbd0 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63  alker w;.  struc
2dbe0 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a  t SrcCount cnt;.
2dbf0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
2dc00 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
2dc10 54 49 4f 4e 20 29 3b 0a 20 20 77 2e 78 45 78 70  TION );.  w.xExp
2dc20 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
2dc30 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 78 53  SrcCount;.  w.xS
2dc40 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2dc50 30 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75  0;.  w.u.pSrcCou
2dc60 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74  nt = &cnt;.  cnt
2dc70 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74  .pSrc = pSrcList
2dc80 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20  ;.  cnt.nThis = 
2dc90 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20  0;.  cnt.nOther 
2dca0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  = 0;.  sqlite3Wa
2dcb0 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70  lkExprList(&w, p
2dcc0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
2dcd0 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68    return cnt.nTh
2dce0 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68  is>0 || cnt.nOth
2dcf0 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  er==0;.}../*.** 
2dd00 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
2dd10 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
2dd20 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  o->aCol[] array.
2dd30 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
2dd40 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
2dd50 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
2dd60 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
2dd70 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
2dd80 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2dd90 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c  nt addAggInfoCol
2dda0 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  umn(sqlite3 *db,
2ddb0 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
2ddc0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
2ddd0 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74  fo->aCol = sqlit
2dde0 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
2ddf0 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  .       db,.    
2de00 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a     pInfo->aCol,.
2de10 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
2de20 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20  nfo->aCol[0]),. 
2de30 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
2de40 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69  olumn,.       &i
2de50 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
2de60 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41  ;.}    ../*.** A
2de70 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
2de80 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
2de90 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e  ->aFunc[] array.
2dea0 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
2deb0 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
2dec0 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
2ded0 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
2dee0 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
2def0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2df00 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e  nt addAggInfoFun
2df10 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  c(sqlite3 *db, A
2df20 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
2df30 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
2df40 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
2df50 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
2df60 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20         db, .    
2df70 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c     pInfo->aFunc,
2df80 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
2df90 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c  Info->aFunc[0]),
2dfa0 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
2dfb0 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69  nFunc,.       &i
2dfc0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
2dfd0 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  ;.}    ../*.** T
2dfe0 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72  his is the xExpr
2dff0 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74  Callback for a t
2e000 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20  ree walker.  It 
2e010 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d  is used to.** im
2e020 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45  plement sqlite3E
2e030 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2e040 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c  ates().  See sql
2e050 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2e060 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72  ggregates.** for
2e070 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2e080 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
2e090 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
2e0a0 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a  gregate(Walker *
2e0b0 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2e0c0 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
2e0d0 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
2e0e0 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  NC = pWalker->u.
2e0f0 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pNC;.  Parse *pP
2e100 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
2e110 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
2e120 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
2e130 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
2e140 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
2e150 4e 43 2d 3e 75 4e 43 2e 70 41 67 67 49 6e 66 6f  NC->uNC.pAggInfo
2e160 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  ;..  assert( pNC
2e170 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 55  ->ncFlags & NC_U
2e180 41 67 67 49 6e 66 6f 20 29 3b 0a 20 20 73 77 69  AggInfo );.  swi
2e190 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
2e1a0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
2e1b0 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
2e1c0 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
2e1d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2e1e0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
2e1f0 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
2e200 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2e210 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2e220 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65   );.      /* Che
2e230 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
2e240 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e   column is in on
2e250 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
2e260 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20  in the FROM.    
2e270 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
2e280 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
2e290 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ry */.      if( 
2e2a0 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21  ALWAYS(pSrcList!
2e2b0 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =0) ){.        s
2e2c0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2e2d0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
2e2e0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
2e2f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
2e300 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
2e310 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2e320 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2e330 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
2e340 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2e350 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2e360 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
2e370 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
2e380 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
2e390 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
2e3a0 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
2e3b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e3c0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
2e3d0 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
2e3e0 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
2e3f0 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
2e400 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2e410 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
2e420 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
2e430 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
2e440 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
2e450 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
2e460 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
2e470 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
2e480 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
2e490 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
2e4a0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
2e4b0 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
2e4c0 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
2e4d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2e4e0 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
2e4f0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
2e500 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
2e510 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2e520 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
2e530 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
2e540 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
2e550 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
2e560 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
2e570 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
2e580 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2e590 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
2e5a0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
2e5b0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2e5c0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2e5d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2e5e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2e5f0 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e   (k>=pAggInfo->n
2e600 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20  Column).        
2e610 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64       && (k = add
2e620 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50  AggInfoColumn(pP
2e630 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
2e640 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  fo))>=0 .       
2e650 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2e660 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41        pCol = &pA
2e670 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b  ggInfo->aCol[k];
2e680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2e690 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70  Col->pTab = pExp
2e6a0 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20  r->y.pTab;.     
2e6b0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2e6c0 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
2e6d0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
2e6e0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
2e6f0 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
2e700 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
2e710 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
2e720 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2e740 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2e750 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2e760 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
2e770 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
2e780 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
2e790 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
2e7a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e7b0 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
2e7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
2e7d0 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
2e7e0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
2e7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e800 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2e810 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
2e820 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
2e830 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
2e840 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
2e850 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2e860 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
2e870 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2e880 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2e890 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
2e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8b0 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
2e8c0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
2e8d0 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
2e8e0 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
2e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
2e900 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
2e910 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
2e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e930 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2e940 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
2e950 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2e960 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2e970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e980 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e9a0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
2e9b0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
2e9c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2e9d0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
2e9e0 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
2e9f0 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
2ea00 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
2ea10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ea20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2ea30 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
2ea40 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
2ea50 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
2ea60 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
2ea70 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
2ea80 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
2ea90 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
2eaa0 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
2eab0 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
2eac0 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
2ead0 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
2eae0 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
2eaf0 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
2eb00 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
2eb10 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
2eb20 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
2eb30 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2eb40 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
2eb50 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2eb60 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2eb70 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2eb80 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
2eb90 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
2eba0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
2ebb0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
2ebc0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2ebd0 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20  iAgg = (i16)k;. 
2ebe0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2ebf0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
2ec00 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
2ec10 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
2ec20 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
2ec30 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
2ec40 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
2ec50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2ec60 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2ec70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
2ec80 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
2ec90 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d  .      if( (pNC-
2eca0 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e  >ncFlags & NC_In
2ecb0 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20  AggFunc)==0.    
2ecc0 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77     && pWalker->w
2ecd0 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70  alkerDepth==pExp
2ece0 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a  r->op2.      ){.
2ecf0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2ed00 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
2ed10 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
2ed20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
2ed30 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
2ed40 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
2ed50 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2ed60 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
2ed70 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
2ed80 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2ed90 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
2eda0 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
2edb0 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
2edc0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2edd0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
2ede0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2edf0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2ee00 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 49 74 65  rCompare(0, pIte
2ee10 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c  m->pExpr, pExpr,
2ee20 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
2ee30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2ee40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ee50 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2ee60 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  i>=pAggInfo->nFu
2ee70 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
2ee80 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67  /* pExpr is orig
2ee90 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65  inal.  Make a ne
2eea0 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49  w entry in pAggI
2eeb0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20  nfo->aFunc[].   
2eec0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2eed0 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
2eee0 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
2eef0 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41          i = addA
2ef00 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73  ggInfoFunc(pPars
2ef10 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
2ef20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ef30 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
2ef40 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2ef50 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2ef60 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2ef70 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
2ef80 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
2ef90 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
2efa0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2efb0 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
2efc0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2efd0 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  m->iMem = ++pPar
2efe0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2eff0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2f000 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2f010 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
2f020 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2f030 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
2f040 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
2f050 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
2f060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f070 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
2f080 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ken, .          
2f090 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2f0a0 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  x.pList ? pExpr-
2f0b0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
2f0c0 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  : 0, enc, 0);.  
2f0d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2f0e0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
2f0f0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2f100 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2f110 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  >iDistinct = pPa
2f120 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2f130 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2f150 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
2f160 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
2f170 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2f180 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f190 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70   /* Make pExpr p
2f1a0 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72  oint to the appr
2f1b0 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f  opriate pAggInfo
2f1c0 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a  ->aFunc[] entry.
2f1d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f1e0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2f1f0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2f200 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
2f210 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2f220 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56         ExprSetVV
2f230 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
2f240 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2f250 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
2f260 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20  gg = (i16)i;.   
2f270 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
2f280 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
2f290 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f2a0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
2f2b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f2c0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2f2d0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2f2e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2f2f0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2f300 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
2f310 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2f320 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  lect(Walker *pWa
2f330 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
2f340 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44  elect){.  UNUSED
2f350 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65  _PARAMETER(pSele
2f360 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ct);.  pWalker->
2f370 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b 0a 20  walkerDepth++;. 
2f380 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2f390 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76  inue;.}.static v
2f3a0 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  oid analyzeAggre
2f3b0 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64  gatesInSelectEnd
2f3c0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2f3d0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
2f3e0 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
2f3f0 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b  AMETER(pSelect);
2f400 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  .  pWalker->walk
2f410 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a  erDepth--;.}../*
2f420 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
2f430 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
2f440 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
2f450 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
2f460 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
2f470 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
2f480 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41  to be added to A
2f490 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  ggInfo object th
2f4a0 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f  at pNC->pAggInfo
2f4b0 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  .** points to.  
2f4c0 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  Additional entri
2f4d0 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74  es are made on t
2f4e0 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  he AggInfo objec
2f4f0 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72  t as.** necessar
2f500 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2f510 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2f520 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
2f530 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
2f540 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61   has been.** ana
2f550 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lyzed by sqlite3
2f560 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
2f570 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
2f580 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2f590 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
2f5a0 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
2f5b0 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
2f5c0 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
2f5d0 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
2f5e0 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
2f5f0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
2f600 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2f610 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
2f620 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2f630 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2f640 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 3b  atesInSelectEnd;
2f650 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68  .  w.walkerDepth
2f660 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20   = 0;.  w.u.pNC 
2f670 3d 20 70 4e 43 3b 0a 20 20 77 2e 70 50 61 72 73  = pNC;.  w.pPars
2f680 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  e = 0;.  assert(
2f690 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
2f6a0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  0 );.  sqlite3Wa
2f6b0 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
2f6c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  );.}../*.** Call
2f6d0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2f6e0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
2f6f0 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
2f700 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
2f710 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
2f720 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2f730 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
2f740 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
2f750 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
2f760 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
2f770 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
2f780 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2f790 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78  gList(NameContex
2f7a0 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74  t *pNC, ExprList
2f7b0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75   *pList){.  stru
2f7c0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2f7d0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
2f7e0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
2f7f0 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
2f800 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
2f810 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
2f820 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2f830 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2f840 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2f850 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
2f860 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
2f870 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2f880 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67  a single new reg
2f890 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f  ister for use to
2f8a0 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72   hold some inter
2f8b0 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a  mediate result..
2f8c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
2f8d0 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  tTempReg(Parse *
2f8e0 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
2f8f0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d  Parse->nTempReg=
2f900 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2f910 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2f920 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
2f930 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d  arse->aTempReg[-
2f940 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  -pParse->nTempRe
2f950 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  g];.}../*.** Dea
2f960 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74  llocate a regist
2f970 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c  er, making avail
2f980 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66  able for reuse f
2f990 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
2f9a0 20 70 75 72 70 6f 73 65 2e 0a 2a 2f 0a 76 6f 69   purpose..*/.voi
2f9b0 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2f9c0 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
2f9d0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
2f9e0 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20  {.  if( iReg && 
2f9f0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2fa00 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
2fa10 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
2fa20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
2fa30 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
2fa40 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
2fa50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
2fa60 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
2fa70 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
2fa80 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
2fa90 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69   registers..*/.i
2faa0 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
2fab0 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
2fac0 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
2fad0 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
2fae0 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74  f( nReg==1 ) ret
2faf0 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65  urn sqlite3GetTe
2fb00 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
2fb10 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61   i = pParse->iRa
2fb20 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50  ngeReg;.  n = pP
2fb30 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b  arse->nRangeReg;
2fb40 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29  .  if( nReg<=n )
2fb50 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  {.    pParse->iR
2fb60 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b  angeReg += nReg;
2fb70 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
2fb80 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a  ngeReg -= nReg;.
2fb90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d    }else{.    i =
2fba0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
2fbb0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
2fbc0 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20  m += nReg;.  }. 
2fbd0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69   return i;.}.voi
2fbe0 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2fbf0 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
2fc00 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
2fc10 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
2fc20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
2fc30 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2fc40 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2fc50 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75   iReg);.    retu
2fc60 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  rn;.  }.  if( nR
2fc70 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg>pParse->nRang
2fc80 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72  eReg ){.    pPar
2fc90 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
2fca0 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
2fcb0 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52  ->iRangeReg = iR
2fcc0 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
2fcd0 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72   Mark all tempor
2fce0 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73  ary registers as
2fcf0 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62   being unavailab
2fd00 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  le for reuse..*/
2fd10 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65  .void sqlite3Cle
2fd20 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50  arTempRegCache(P
2fd30 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
2fd40 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2fd50 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  g = 0;.  pParse-
2fd60 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a  >nRangeReg = 0;.
2fd70 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74  }../*.** Validat
2fd80 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72  e that no tempor
2fd90 61 72 79 20 72 65 67 69 73 74 65 72 20 66 61 6c  ary register fal
2fda0 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 72 61  ls within the ra
2fdb0 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74  nge of.** iFirst
2fdc0 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69  ..iLast, inclusi
2fdd0 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ve.  This routin
2fde0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66  e is only call f
2fdf0 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72  rom within asser
2fe00 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
2fe10 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
2fe20 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71  ITE_DEBUG.int sq
2fe30 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61  lite3NoTempsInRa
2fe40 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
2fe50 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69  e, int iFirst, i
2fe60 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74  nt iLast){.  int
2fe70 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   i;.  if( pParse
2fe80 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20  ->nRangeReg>0.  
2fe90 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e   && pParse->iRan
2fea0 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52  geReg+pParse->nR
2feb0 61 6e 67 65 52 65 67 20 3e 20 69 46 69 72 73 74  angeReg > iFirst
2fec0 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
2fed0 52 61 6e 67 65 52 65 67 20 3c 3d 20 69 4c 61 73  RangeReg <= iLas
2fee0 74 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75  t.  ){.     retu
2fef0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
2ff00 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
2ff10 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20  TempReg; i++){. 
2ff20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
2ff30 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72  TempReg[i]>=iFir
2ff40 73 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54  st && pParse->aT
2ff50 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74  empReg[i]<=iLast
2ff60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2ff70 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2ff80 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
2ff90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
2ffa0 55 47 20 2a 2f 0a                                UG */.