/ Hex Artifact Content
Login

Artifact 85239130e25f54279b1dfb3641984a335ce5a38709af29f9b62b555ed1459d07:


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 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b  rs and any unlik
0db0: 65 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65  ely().** or like
0dc0: 6c 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f  lihood() functio
0dd0: 6e 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66  n at the root of
0de0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   an expression..
0df0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
0e00: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
0e10: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
0e20: 77 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20  while( pExpr && 
0e30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0e40: 70 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 7c 45  pExpr, EP_Skip|E
0e50: 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20  P_Unlikely) ){. 
0e60: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
0e70: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
0e80: 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20  _Unlikely) ){.  
0e90: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
0ea0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
0eb0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
0ec0: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
0ed0: 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  t( pExpr->x.pLis
0ee0: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
0ef0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0f00: 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  r->op==TK_FUNCTI
0f10: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ON );.      pExp
0f20: 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  r = pExpr->x.pLi
0f30: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
0f40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
0f50: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0f60: 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
0f70: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
0f80: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
0f90: 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65 74    }.  }   .  ret
0fa0: 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a  urn pExpr;.}../*
0fb0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
0fc0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
0fd0: 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
0fe0: 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a  sion pExpr. If.*
0ff0: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65  * there is no de
1000: 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20  fined collating 
1010: 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e  sequence, return
1020: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
1030: 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 45 78   also: sqlite3Ex
1040: 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29 0a 2a 2a  prNNCollSeq().**
1050: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45  .** The sqlite3E
1060: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29 20 77  xprNNCollSeq() w
1070: 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 65 78  orks the same ex
1080: 61 63 74 20 74 68 61 74 20 69 74 20 72 65 74 75  act that it retu
1090: 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65 66 61 75  rns the.** defau
10a0: 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 66 20  lt collation if 
10b0: 70 45 78 70 72 20 68 61 73 20 6e 6f 20 64 65 66  pExpr has no def
10c0: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a  ined collation..
10d0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
10e0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 69 67  ing sequence mig
10f0: 68 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64  ht be determined
1100: 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70   by a COLLATE op
1110: 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20 62 79 20  erator.** or by 
1120: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
1130: 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20  a column with a 
1140: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
1150: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 43  g sequence..** C
1160: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
1170: 20 74 61 6b 65 20 66 69 72 73 74 20 70 72 65 63   take first prec
1180: 65 64 65 6e 63 65 2e 20 20 4c 65 66 74 20 6f 70  edence.  Left op
1190: 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a 2a 20 70  erands take.** p
11a0: 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20 72  recedence over r
11b0: 69 67 68 74 20 6f 70 65 72 61 6e 64 73 2e 0a 2a  ight operands..*
11c0: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
11d0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61  e3ExprCollSeq(Pa
11e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
11f0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c  r *pExpr){.  sql
1200: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1210: 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c 53 65 71  e->db;.  CollSeq
1220: 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 45   *pColl = 0;.  E
1230: 78 70 72 20 2a 70 20 3d 20 70 45 78 70 72 3b 0a  xpr *p = pExpr;.
1240: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
1250: 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e 6f 70    int op = p->op
1260: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61  ;.    if( p->fla
1270: 67 73 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20  gs & EP_Generic 
1280: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
1290: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
12a0: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
12b0: 20 20 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f      if( (op==TK_
12c0: 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70  AGG_COLUMN || op
12d0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f  ==TK_COLUMN || o
12e0: 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a 20  p==TK_TRIGGER). 
12f0: 20 20 20 20 26 26 20 70 2d 3e 79 2e 70 54 61 62      && p->y.pTab
1300: 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
1310: 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53   /* op==TK_REGIS
1320: 54 45 52 20 26 26 20 70 2d 3e 79 2e 70 54 61 62  TER && p->y.pTab
1330: 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e  !=0 happens when
1340: 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67 69   pExpr was origi
1350: 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61  nally.      ** a
1360: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77   TK_COLUMN but w
1370: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76  as previously ev
1380: 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63 68  aluated and cach
1390: 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ed in a register
13a0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 20   */.      int j 
13b0: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
13c0: 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a      if( j>=0 ){.
13d0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
13e0: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 79  ar *zColl = p->y
13f0: 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  .pTab->aCol[j].z
1400: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43  Coll;.        pC
1410: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
1420: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
1430: 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b  (db), zColl, 0);
1440: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1450: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1460: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
1470: 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  || op==TK_UPLUS 
1480: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  ){.      p = p->
1490: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63 6f 6e  pLeft;.      con
14a0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
14b0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   if( op==TK_COLL
14c0: 41 54 45 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  ATE ){.      pCo
14d0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
14e0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45  ollSeq(pParse, E
14f0: 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e  NC(db), 0, p->u.
1500: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
1510: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1520: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
1530: 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
1540: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
1550: 26 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c  && (p->pLeft->fl
1560: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
1570: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1580: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
1590: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15a0: 20 20 20 45 78 70 72 20 2a 70 4e 65 78 74 20 20     Expr *pNext  
15b0: 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  = p->pRight;.   
15c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72       /* The Expr
15d0: 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65  .x union is neve
15e0: 72 20 75 73 65 64 20 61 74 20 74 68 65 20 73 61  r used at the sa
15f0: 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e  me time as Expr.
1600: 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20  pRight */.      
1610: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70    assert( p->x.p
1620: 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  List==0 || p->pR
1630: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
1640: 20 20 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20 68     /* p->flags h
1650: 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65 20  olds EP_Collate 
1660: 61 6e 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c  and p->pLeft->fl
1670: 61 67 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20 41  ags does not.  A
1680: 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d  nd.        ** p-
1690: 3e 78 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e 6f  >x.pSelect canno
16a0: 74 2e 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e 70  t.  So if p->x.p
16b0: 4c 65 66 74 20 65 78 69 73 74 73 2c 20 69 74 20  Left exists, it 
16c0: 6d 75 73 74 20 68 6f 6c 64 20 61 74 0a 20 20 20  must hold at.   
16d0: 20 20 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f 6e       ** least on
16e0: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54 68  e EP_Collate. Th
16f0: 75 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  us the following
1700: 20 74 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f 0a   two ALWAYS. */.
1710: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78          if( p->x
1720: 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 41 4c 57  .pList!=0 && ALW
1730: 41 59 53 28 21 45 78 70 72 48 61 73 50 72 6f 70  AYS(!ExprHasProp
1740: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
1750: 6c 65 63 74 29 29 20 29 7b 0a 20 20 20 20 20 20  lect)) ){.      
1760: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1770: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c       for(i=0; AL
1780: 57 41 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69 73  WAYS(i<p->x.pLis
1790: 74 2d 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29 7b  t->nExpr); i++){
17a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
17b0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
17c0: 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  (p->x.pList->a[i
17d0: 5d 2e 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c 6c  ].pExpr, EP_Coll
17e0: 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ate) ){.        
17f0: 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d        pNext = p-
1800: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
1810: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
1820: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1830: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1840: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1850: 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74         p = pNext
1860: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1870: 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  lse{.      break
1880: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1890: 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f  ( sqlite3CheckCo
18a0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43  llSeq(pParse, pC
18b0: 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f  oll) ){ .    pCo
18c0: 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ll = 0;.  }.  re
18d0: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
18e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18f0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1900: 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ce for the expre
1910: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a  ssion pExpr. If.
1920: 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  ** there is no d
1930: 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  efined collating
1940: 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72   sequence, retur
1950: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1960: 68 65 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63 6f  he.** defautl co
1970: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1980: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1990: 3a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  : sqlite3ExprCol
19a0: 6c 53 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65  lSeq().**.** The
19b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
19c0: 53 65 71 28 29 20 72 6f 75 74 69 6e 65 20 77 6f  Seq() routine wo
19d0: 72 6b 73 20 74 68 65 20 73 61 6d 65 20 65 78 63  rks the same exc
19e0: 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 72  ept that it.** r
19f0: 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
1a00: 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e  here is no defin
1a10: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f  ed collation..*/
1a20: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
1a30: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 50  3ExprNNCollSeq(P
1a40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1a50: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f  pr *pExpr){.  Co
1a60: 6c 6c 53 65 71 20 2a 70 20 3d 20 73 71 6c 69 74  llSeq *p = sqlit
1a70: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1a80: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
1a90: 69 66 28 20 70 3d 3d 30 20 29 20 70 20 3d 20 70  if( p==0 ) p = p
1aa0: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
1ab0: 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Coll;.  assert( 
1ac0: 70 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  p!=0 );.  return
1ad0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
1ae0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1af0: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
1b00: 68 61 76 65 20 65 71 75 69 76 61 6c 65 6e 74 20  have equivalent 
1b10: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1b20: 63 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ces..*/.int sqli
1b30: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61  te3ExprCollSeqMa
1b40: 74 63 68 28 50 61 72 73 65 20 2a 70 50 61 72 73  tch(Parse *pPars
1b50: 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78  e, Expr *pE1, Ex
1b60: 70 72 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c 6c  pr *pE2){.  Coll
1b70: 53 65 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73 71  Seq *pColl1 = sq
1b80: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
1b90: 65 71 28 70 50 61 72 73 65 2c 20 70 45 31 29 3b  eq(pParse, pE1);
1ba0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1bb0: 6c 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  l2 = sqlite3Expr
1bc0: 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  NNCollSeq(pParse
1bd0: 2c 20 70 45 32 29 3b 0a 20 20 72 65 74 75 72 6e  , pE2);.  return
1be0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1bf0: 70 43 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20 70  pColl1->zName, p
1c00: 43 6f 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  Coll2->zName)==0
1c10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
1c20: 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f   is an operand o
1c30: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
1c40: 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69  perator.  aff2 i
1c50: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
1c60: 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74  finity of the ot
1c70: 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68  her operand.  Th
1c80: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1c90: 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61  ns the.** type a
1ca0: 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
1cb0: 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
1cc0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  the comparison o
1cd0: 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72  perator..*/.char
1ce0: 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
1cf0: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
1d00: 78 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b  xpr, char aff2){
1d10: 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73  .  char aff1 = s
1d20: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
1d30: 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28  ty(pExpr);.  if(
1d40: 20 61 66 66 31 3e 53 51 4c 49 54 45 5f 41 46 46   aff1>SQLITE_AFF
1d50: 5f 4e 4f 4e 45 20 26 26 20 61 66 66 32 3e 53 51  _NONE && aff2>SQ
1d60: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
1d70: 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64  .    /* Both sid
1d80: 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  es of the compar
1d90: 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ison are columns
1da0: 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d  . If one has num
1db0: 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69  eric.    ** affi
1dc0: 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20  nity, use that. 
1dd0: 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f  Otherwise use no
1de0: 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a   affinity..    *
1df0: 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
1e00: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1e10: 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69  ty(aff1) || sqli
1e20: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
1e30: 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20  nity(aff2) ){.  
1e40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e50: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
1e60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
1e80: 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20  F_BLOB;.    }.  
1e90: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e  }else{.    /* On
1ea0: 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75  e side is a colu
1eb0: 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73  mn, the other is
1ec0: 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f   not. Use the co
1ed0: 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20  lumns affinity. 
1ee0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  */.    assert( a
1ef0: 66 66 31 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ff1<=SQLITE_AFF_
1f00: 4e 4f 4e 45 20 7c 7c 20 61 66 66 32 3c 3d 53 51  NONE || aff2<=SQ
1f10: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 3b  LITE_AFF_NONE );
1f20: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66  .    return (aff
1f30: 31 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  1<=SQLITE_AFF_NO
1f40: 4e 45 20 3f 20 61 66 66 32 20 3a 20 61 66 66 31  NE ? aff2 : aff1
1f50: 29 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ) | SQLITE_AFF_N
1f60: 4f 4e 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ONE;.  }.}../*.*
1f70: 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d  * pExpr is a com
1f80: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
1f90: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 74 79  .  Return the ty
1fa0: 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  pe affinity that
1fb0: 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70   should.** be ap
1fc0: 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f 70  plied to both op
1fd0: 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f 20  erands prior to 
1fe0: 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72  doing the compar
1ff0: 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ison..*/.static 
2000: 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41  char comparisonA
2010: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
2020: 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66 66  xpr){.  char aff
2030: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
2040: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20  r->op==TK_EQ || 
2050: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
2060: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
2070: 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20 20  K_LT ||.        
2080: 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f    pExpr->op==TK_
2090: 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  GT || pExpr->op=
20a0: 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d  =TK_GE || pExpr-
20b0: 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20  >op==TK_LE ||.  
20c0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
20d0: 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70  p==TK_NE || pExp
20e0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20  r->op==TK_IS || 
20f0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
2100: 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NOT );.  assert(
2110: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b   pExpr->pLeft );
2120: 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  .  aff = sqlite3
2130: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
2140: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
2150: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
2160: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
2170: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
2180: 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ity(pExpr->pRigh
2190: 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65  t, aff);.  }else
21a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
21b0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
21c0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
21d0: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f   aff = sqlite3Co
21e0: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
21f0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
2200: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
2210: 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73  pr, aff);.  }els
2220: 65 20 69 66 28 20 61 66 66 3d 3d 30 20 29 7b 0a  e if( aff==0 ){.
2230: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
2240: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20  _AFF_BLOB;.  }. 
2250: 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a   return aff;.}..
2260: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
2270: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72   comparison expr
2280: 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c  ession, eg. '=',
2290: 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74   '<', IN(...) et
22a0: 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69  c..** idx_affini
22b0: 74 79 20 69 73 20 74 68 65 20 61 66 66 69 6e 69  ty is the affini
22c0: 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64  ty of an indexed
22d0: 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20   column. Return 
22e0: 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69  true.** if the i
22f0: 6e 64 65 78 20 77 69 74 68 20 61 66 66 69 6e 69  ndex with affini
2300: 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20  ty idx_affinity 
2310: 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69  may be used to i
2320: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20  mplement.** the 
2330: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45  comparison in pE
2340: 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  xpr..*/.int sqli
2350: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
2360: 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  Ok(Expr *pExpr, 
2370: 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74  char idx_affinit
2380: 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d  y){.  char aff =
2390: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
23a0: 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ity(pExpr);.  if
23b0: 28 20 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46  ( aff<SQLITE_AFF
23c0: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 72 65 74  _TEXT ){.    ret
23d0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
23e0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
23f0: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 72 65 74  _TEXT ){.    ret
2400: 75 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79  urn idx_affinity
2410: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
2420: 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
2430: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
2440: 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66 66  Affinity(idx_aff
2450: 69 6e 69 74 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  inity);.}../*.**
2460: 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76   Return the P5 v
2470: 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64  alue that should
2480: 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62   be used for a b
2490: 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e  inary comparison
24a0: 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45  .** opcode (OP_E
24b0: 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75  q, OP_Ge etc.) u
24c0: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70  sed to compare p
24d0: 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32  Expr1 and pExpr2
24e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62  ..*/.static u8 b
24f0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45  inaryCompareP5(E
2500: 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70  xpr *pExpr1, Exp
2510: 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a  r *pExpr2, int j
2520: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38  umpIfNull){.  u8
2530: 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c   aff = (char)sql
2540: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
2550: 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20  (pExpr2);.  aff 
2560: 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d  = (u8)sqlite3Com
2570: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
2580: 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29  pr1, aff) | (u8)
2590: 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65  jumpIfNull;.  re
25a0: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
25b0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
25c0: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61  ter to the colla
25d0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68  tion sequence th
25e0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
25f0: 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79  d by.** a binary
2600: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
2610: 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70  ator comparing p
2620: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
2630: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65  .**.** If the le
2640: 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ft hand expressi
2650: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
2660: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65  ng sequence type
2670: 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
2680: 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  used. Otherwise 
2690: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
26a0: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
26b0: 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73  ight hand expres
26c0: 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c  sion.** is used,
26d0: 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20   or the default 
26e0: 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74  (BINARY) if neit
26f0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68  her expression h
2700: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  as a collating.*
2710: 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72  * type..**.** Ar
2720: 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62  gument pRight (b
2730: 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61  ut not pLeft) ma
2740: 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  y be a null poin
2750: 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ter. In this cas
2760: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  e,.** it is not 
2770: 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43  considered..*/.C
2780: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42  ollSeq *sqlite3B
2790: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
27a0: 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Seq(.  Parse *pP
27b0: 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70  arse, .  Expr *p
27c0: 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70  Left, .  Expr *p
27d0: 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53  Right.){.  CollS
27e0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73  eq *pColl;.  ass
27f0: 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
2800: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
2810: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
2820: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2830: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2840: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
2850: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
2860: 68 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66  ht && (pRight->f
2870: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
2880: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  e)!=0 ){.    pCo
2890: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
28a0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
28b0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
28c0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
28d0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
28e0: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
28f0: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
2900: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  ){.      pColl =
2910: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2920: 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67  Seq(pParse, pRig
2930: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ht);.    }.  }. 
2940: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
2950: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
2960: 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
2970: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
2980: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2990: 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61  odeCompare(.  Pa
29a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
29b0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28  /* The parsing (
29c0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
29d0: 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ing) context */.
29e0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
29f0: 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
2a00: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
2a10: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f  r *pRight,     /
2a20: 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72  * The right oper
2a30: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63  and */.  int opc
2a40: 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ode,       /* Th
2a50: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63  e comparison opc
2a60: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31  ode */.  int in1
2a70: 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65  , int in2, /* Re
2a80: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f  gister holding o
2a90: 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74  perands */.  int
2aa0: 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
2ab0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
2ac0: 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a  rue.  */.  int j
2ad0: 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
2ae0: 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66  If true, jump if
2af0: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
2b00: 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  is NULL */.){.  
2b10: 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64  int p5;.  int ad
2b20: 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dr;.  CollSeq *p
2b30: 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74  4;..  p4 = sqlit
2b40: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
2b50: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2b60: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
2b70: 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70   p5 = binaryComp
2b80: 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69  areP5(pLeft, pRi
2b90: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
2ba0: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
2bb0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61  e3VdbeAddOp4(pPa
2bc0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f  rse->pVdbe, opco
2bd0: 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69  de, in2, dest, i
2be0: 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n1,.            
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2c00: 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c  void*)p4, P4_COL
2c10: 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33  LSEQ);.  sqlite3
2c20: 56 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61  VdbeChangeP5(pPa
2c30: 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29  rse->pVdbe, (u8)
2c40: 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  p5);.  return ad
2c50: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dr;.}../*.** Ret
2c60: 75 72 6e 20 74 72 75 65 20 69 66 20 65 78 70 72  urn true if expr
2c70: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
2c80: 61 20 76 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c  a vector, or fal
2c90: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  se otherwise..**
2ca0: 0a 2a 2a 20 41 20 76 65 63 74 6f 72 20 69 73 20  .** A vector is 
2cb0: 64 65 66 69 6e 65 64 20 61 73 20 61 6e 79 20 65  defined as any e
2cc0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 72  xpression that r
2cd0: 65 73 75 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72  esults in two or
2ce0: 20 6d 6f 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73   more.** columns
2cf0: 20 6f 66 20 72 65 73 75 6c 74 2e 20 20 45 76 65   of result.  Eve
2d00: 72 79 20 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64  ry TK_VECTOR nod
2d10: 65 20 69 73 20 61 6e 20 76 65 63 74 6f 72 20 62  e is an vector b
2d20: 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61  ecause the.** pa
2d30: 72 73 65 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65  rser will not ge
2d40: 6e 65 72 61 74 65 20 61 20 54 4b 5f 56 45 43 54  nerate a TK_VECT
2d50: 4f 52 20 77 69 74 68 20 66 65 77 65 72 20 74 68  OR with fewer th
2d60: 61 6e 20 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a  an two entries..
2d70: 2a 2a 20 42 75 74 20 61 20 54 4b 5f 53 45 4c 45  ** But a TK_SELE
2d80: 43 54 20 6d 69 67 68 74 20 62 65 20 65 69 74 68  CT might be eith
2d90: 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61  er a vector or a
2da0: 20 73 63 61 6c 61 72 2e 20 49 74 20 69 73 20 6f   scalar. It is o
2db0: 6e 6c 79 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  nly.** considere
2dc0: 64 20 61 20 76 65 63 74 6f 72 20 69 66 20 69 74  d a vector if it
2dd0: 20 68 61 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65   has two or more
2de0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e   result columns.
2df0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2e00: 78 70 72 49 73 56 65 63 74 6f 72 28 45 78 70 72  xprIsVector(Expr
2e10: 20 2a 70 45 78 70 72 29 7b 0a 20 20 72 65 74 75   *pExpr){.  retu
2e20: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 56 65  rn sqlite3ExprVe
2e30: 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3e  ctorSize(pExpr)>
2e40: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  1;.}../*.** If t
2e50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  he expression pa
2e60: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
2e70: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20   argument is of 
2e80: 74 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a  type TK_VECTOR .
2e90: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ** return the nu
2ea0: 6d 62 65 72 20 6f 66 20 65 78 70 72 65 73 73 69  mber of expressi
2eb0: 6f 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f  ons in the vecto
2ec0: 72 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 65 78  r. Or, if the ex
2ed0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61  pression.** is a
2ee0: 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 72 65 74   sub-select, ret
2ef0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2f00: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
2f10: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72   sub-select. For
2f20: 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 74 79  .** any other ty
2f30: 70 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  pe of expression
2f40: 2c 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69  , return 1..*/.i
2f50: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 56 65  nt sqlite3ExprVe
2f60: 63 74 6f 72 53 69 7a 65 28 45 78 70 72 20 2a 70  ctorSize(Expr *p
2f70: 45 78 70 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d  Expr){.  u8 op =
2f80: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
2f90: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
2fa0: 52 20 29 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  R ) op = pExpr->
2fb0: 6f 70 32 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  op2;.  if( op==T
2fc0: 4b 5f 56 45 43 54 4f 52 20 29 7b 0a 20 20 20 20  K_VECTOR ){.    
2fd0: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e  return pExpr->x.
2fe0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
2ff0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
3000: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72  _SELECT ){.    r
3010: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70  eturn pExpr->x.p
3020: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
3030: 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nExpr;.  }else{.
3040: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3050: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
3060: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
3070: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 6f   subexpression o
3080: 66 20 70 56 65 63 74 6f 72 20 74 68 61 74 20 69  f pVector that i
3090: 73 20 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f  s the i-th.** co
30a0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
30b0: 6f 72 20 28 6e 75 6d 62 65 72 65 64 20 73 74 61  or (numbered sta
30c0: 72 74 69 6e 67 20 77 69 74 68 20 30 29 2e 20 20  rting with 0).  
30d0: 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a  The caller must.
30e0: 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 69  ** ensure that i
30f0: 20 69 73 20 77 69 74 68 69 6e 20 72 61 6e 67 65   is within range
3100: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74  ..**.** If pVect
3110: 6f 72 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73  or is really a s
3120: 63 61 6c 61 72 20 28 61 6e 64 20 22 73 63 61 6c  calar (and "scal
3130: 61 72 22 20 68 65 72 65 20 69 6e 63 6c 75 64 65  ar" here include
3140: 73 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20  s subqueries.** 
3150: 74 68 61 74 20 72 65 74 75 72 6e 20 61 20 73 69  that return a si
3160: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68  ngle column!) th
3170: 65 6e 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f  en return pVecto
3180: 72 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a  r unmodified..**
3190: 0a 2a 2a 20 70 56 65 63 74 6f 72 20 72 65 74 61  .** pVector reta
31a0: 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  ins ownership of
31b0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 75   the returned su
31c0: 62 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a  bexpression..**.
31d0: 2a 2a 20 49 66 20 74 68 65 20 76 65 63 74 6f 72  ** If the vector
31e0: 20 69 73 20 61 20 28 53 45 4c 45 43 54 20 2e 2e   is a (SELECT ..
31f0: 2e 29 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  .) then the expr
3200: 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  ession returned 
3210: 69 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20 65  is.** just the e
3220: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68  xpression for th
3230: 65 20 69 2d 74 68 20 74 65 72 6d 20 6f 66 20 74  e i-th term of t
3240: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61  he result set, a
3250: 6e 64 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65  nd may.** not be
3260: 20 72 65 61 64 79 20 66 6f 72 20 65 76 61 6c 75   ready for evalu
3270: 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68  ation because th
3280: 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 68  e table cursor h
3290: 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65  as not yet.** be
32a0: 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a  en positioned..*
32b0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 56  /.Expr *sqlite3V
32c0: 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
32d0: 72 28 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c  r(Expr *pVector,
32e0: 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72   int i){.  asser
32f0: 74 28 20 69 3c 73 71 6c 69 74 65 33 45 78 70 72  t( i<sqlite3Expr
3300: 56 65 63 74 6f 72 53 69 7a 65 28 70 56 65 63 74  VectorSize(pVect
3310: 6f 72 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  or) );.  if( sql
3320: 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
3330: 28 70 56 65 63 74 6f 72 29 20 29 7b 0a 20 20 20  (pVector) ){.   
3340: 20 61 73 73 65 72 74 28 20 70 56 65 63 74 6f 72   assert( pVector
3350: 2d 3e 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63  ->op2==0 || pVec
3360: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  tor->op==TK_REGI
3370: 53 54 45 52 20 29 3b 0a 20 20 20 20 69 66 28 20  STER );.    if( 
3380: 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f  pVector->op==TK_
3390: 53 45 4c 45 43 54 20 7c 7c 20 70 56 65 63 74 6f  SELECT || pVecto
33a0: 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43  r->op2==TK_SELEC
33b0: 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T ){.      retur
33c0: 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65  n pVector->x.pSe
33d0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
33e0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65  i].pExpr;.    }e
33f0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
3400: 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69  n pVector->x.pLi
3410: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
3420: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3430: 72 6e 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f  rn pVector;.}../
3440: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
3450: 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20 45 78   return a new Ex
3460: 70 72 20 6f 62 6a 65 63 74 20 77 68 69 63 68 20  pr object which 
3470: 77 68 65 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a  when passed to.*
3480: 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  * sqlite3ExprCod
3490: 65 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  e() will generat
34a0: 65 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20  e all necessary 
34b0: 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a  code to compute.
34c0: 2a 2a 20 74 68 65 20 69 46 69 65 6c 64 2d 74 68  ** the iField-th
34d0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76   column of the v
34e0: 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
34f0: 20 70 56 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20   pVector..**.** 
3500: 49 74 20 69 73 20 6f 6b 20 66 6f 72 20 70 56 65  It is ok for pVe
3510: 63 74 6f 72 20 74 6f 20 62 65 20 61 20 73 63 61  ctor to be a sca
3520: 6c 61 72 20 28 61 73 20 6c 6f 6e 67 20 61 73 20  lar (as long as 
3530: 69 46 69 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a  iField==0).  .**
3540: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
3550: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
3560: 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78  s like sqlite3Ex
3570: 70 72 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  prDup()..**.** T
3580: 68 65 20 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74  he caller owns t
3590: 68 65 20 72 65 74 75 72 6e 65 64 20 45 78 70 72  he returned Expr
35a0: 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 73 20 72   object and is r
35b0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a  esponsible for.*
35c0: 2a 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  * ensuring that 
35d0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
35e0: 75 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  ue eventually ge
35f0: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
3600: 54 68 65 20 63 61 6c 6c 65 72 20 72 65 74 61 69  The caller retai
3610: 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  ns ownership of 
3620: 70 56 65 63 74 6f 72 2e 20 20 49 66 20 70 56 65  pVector.  If pVe
3630: 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c  ctor is a TK_SEL
3640: 45 43 54 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ECT,.** then the
3650: 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74   returned object
3660: 20 77 69 6c 6c 20 72 65 66 65 72 65 6e 63 65 20   will reference 
3670: 70 56 65 63 74 6f 72 20 61 6e 64 20 73 6f 20 70  pVector and so p
3680: 56 65 63 74 6f 72 20 6d 75 73 74 20 72 65 6d 61  Vector must rema
3690: 69 6e 0a 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20  in.** valid for 
36a0: 74 68 65 20 6c 69 66 65 20 6f 66 20 74 68 65 20  the life of the 
36b0: 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e  returned object.
36c0: 20 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20    If pVector is 
36d0: 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f  a TK_VECTOR.** o
36e0: 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  r a scalar expre
36f0: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63  ssion, then it c
3700: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 20 61 73  an be deleted as
3710: 20 73 6f 6f 6e 20 61 73 20 74 68 69 73 20 72 6f   soon as this ro
3720: 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
3730: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20  ..**.** A trick 
3740: 74 6f 20 63 61 75 73 65 20 61 20 54 4b 5f 53 45  to cause a TK_SE
3750: 4c 45 43 54 20 70 56 65 63 74 6f 72 20 74 6f 20  LECT pVector to 
3760: 62 65 20 64 65 6c 65 74 65 64 20 74 6f 67 65 74  be deleted toget
3770: 68 65 72 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  her with.** the 
3780: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
3790: 6a 65 63 74 20 69 73 20 74 6f 20 61 74 74 61 63  ject is to attac
37a0: 68 20 74 68 65 20 70 56 65 63 74 6f 72 20 74 6f  h the pVector to
37b0: 20 74 68 65 20 70 52 69 67 68 74 20 66 69 65 6c   the pRight fiel
37c0: 64 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75  d.** of the retu
37d0: 72 6e 65 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43  rned TK_SELECT_C
37e0: 4f 4c 55 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63  OLUMN Expr objec
37f0: 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  t..*/.Expr *sqli
3800: 74 65 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72  te3ExprForVector
3810: 46 69 65 6c 64 28 0a 20 20 50 61 72 73 65 20 2a  Field(.  Parse *
3820: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
3830: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
3840: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63   */.  Expr *pVec
3850: 74 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  tor,       /* Th
3860: 65 20 76 65 63 74 6f 72 2e 20 20 4c 69 73 74 20  e vector.  List 
3870: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  of expressions o
3880: 72 20 61 20 73 75 62 2d 53 45 4c 45 43 54 20 2a  r a sub-SELECT *
3890: 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 20 20  /.  int iField  
38a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
38b0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
38c0: 76 65 63 74 6f 72 20 74 6f 20 72 65 74 75 72 6e  vector to return
38d0: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
38e0: 52 65 74 3b 0a 20 20 69 66 28 20 70 56 65 63 74  Ret;.  if( pVect
38f0: 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  or->op==TK_SELEC
3900: 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  T ){.    assert(
3910: 20 70 56 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20   pVector->flags 
3920: 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
3930: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f  ;.    /* The TK_
3940: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78  SELECT_COLUMN Ex
3950: 70 72 20 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a  pr node:.    **.
3960: 20 20 20 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20      ** pLeft:   
3970: 20 20 20 20 20 20 20 20 70 56 65 63 74 6f 72 20          pVector 
3980: 63 6f 6e 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45  containing TK_SE
3990: 4c 45 43 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74  LECT.  Not delet
39a0: 65 64 2e 0a 20 20 20 20 2a 2a 20 70 52 69 67 68  ed..    ** pRigh
39b0: 74 3a 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20  t:          not 
39c0: 75 73 65 64 2e 20 20 42 75 74 20 72 65 63 75 72  used.  But recur
39d0: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a  sively deleted..
39e0: 20 20 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20      ** iColumn: 
39f0: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 6f 66          Index of
3a00: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65   a column in pVe
3a10: 63 74 6f 72 0a 20 20 20 20 2a 2a 20 69 54 61 62  ctor.    ** iTab
3a20: 6c 65 3a 20 20 20 20 20 20 20 20 20 20 30 20 6f  le:          0 o
3a30: 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
3a40: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c  columns on the L
3a50: 48 53 20 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d  HS of an assignm
3a60: 65 6e 74 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74  ent.    ** pLeft
3a70: 2d 3e 69 54 61 62 6c 65 3a 20 20 20 46 69 72 73  ->iTable:   Firs
3a80: 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  t in an array of
3a90: 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
3aa0: 67 20 72 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20  g result, or 0. 
3ab0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
3ac0: 20 20 20 20 20 20 20 69 66 20 74 68 65 20 72 65         if the re
3ad0: 73 75 6c 74 20 69 73 20 6e 6f 74 20 79 65 74 20  sult is not yet 
3ae0: 63 6f 6d 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a  computed..    **
3af0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45  .    ** sqlite3E
3b00: 78 70 72 44 65 6c 65 74 65 28 29 20 73 70 65 63  xprDelete() spec
3b10: 69 66 69 63 61 6c 6c 79 20 73 6b 69 70 73 20 74  ifically skips t
3b20: 68 65 20 72 65 63 75 72 73 69 76 65 20 64 65 6c  he recursive del
3b30: 65 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c  ete of.    ** pL
3b40: 65 66 74 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54  eft on TK_SELECT
3b50: 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20  _COLUMN nodes.  
3b60: 42 75 74 20 70 52 69 67 68 74 20 69 73 20 66 6f  But pRight is fo
3b70: 6c 6c 6f 77 65 64 2c 20 73 6f 20 70 56 65 63 74  llowed, so pVect
3b80: 6f 72 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  or.    ** can be
3b90: 20 61 74 74 61 63 68 65 64 20 74 6f 20 70 52 69   attached to pRi
3ba0: 67 68 74 20 74 6f 20 63 61 75 73 65 20 74 68 69  ght to cause thi
3bb0: 73 20 6e 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f  s node to take o
3bc0: 77 6e 65 72 73 68 69 70 20 6f 66 0a 20 20 20 20  wnership of.    
3bd0: 2a 2a 20 70 56 65 63 74 6f 72 2e 20 20 54 79 70  ** pVector.  Typ
3be0: 69 63 61 6c 6c 79 20 74 68 65 72 65 20 77 69 6c  ically there wil
3bf0: 6c 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b  l be multiple TK
3c00: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e  _SELECT_COLUMN n
3c10: 6f 64 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68  odes.    ** with
3c20: 20 74 68 65 20 73 61 6d 65 20 70 4c 65 66 74 20   the same pLeft 
3c30: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
3c40: 56 65 63 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79  Vector, but only
3c50: 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 20 20 20   one of them.   
3c60: 20 2a 2a 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65   ** will own the
3c70: 20 70 56 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f   pVector..    */
3c80: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
3c90: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
3ca0: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
3cb0: 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  N, 0, 0);.    if
3cc0: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
3cd0: 70 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pRet->iColumn = 
3ce0: 69 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52  iField;.      pR
3cf0: 65 74 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63  et->pLeft = pVec
3d00: 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
3d10: 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c  ssert( pRet==0 |
3d20: 7c 20 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d  | pRet->iTable==
3d30: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
3d40: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3d50: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70  p==TK_VECTOR ) p
3d60: 56 65 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72  Vector = pVector
3d70: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
3d80: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
3d90: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
3da0: 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
3db0: 2c 20 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20  , pVector, 0);. 
3dc0: 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
3dd0: 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73  TokenRemap(pPars
3de0: 65 2c 20 70 52 65 74 2c 20 70 56 65 63 74 6f 72  e, pRet, pVector
3df0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
3e00: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pRet;.}../*.** I
3e10: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
3e20: 70 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b  pr is of type TK
3e30: 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74  _SELECT, generat
3e40: 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
3e50: 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74 75 72 6e  te.** it. Return
3e60: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
3e70: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
3e80: 74 20 69 73 20 73 74 6f 72 65 64 20 28 6f 72 2c  t is stored (or,
3e90: 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d   if the .** sub-
3ea0: 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 6d  select returns m
3eb0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c  ore than one col
3ec0: 75 6d 6e 2c 20 74 68 65 20 66 69 72 73 74 20 69  umn, the first i
3ed0: 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20 6f 66  n an array.** of
3ee0: 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 77 68   registers in wh
3ef0: 69 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 69  ich the result i
3f00: 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a 2a 2a  s stored)..**.**
3f10: 20 49 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74   If pExpr is not
3f20: 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70   a TK_SELECT exp
3f30: 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20  ression, return 
3f40: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
3f50: 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65   exprCodeSubsele
3f60: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
3f70: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
3f80: 20 20 69 6e 74 20 72 65 67 20 3d 20 30 3b 0a 23    int reg = 0;.#
3f90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3fa0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
3fb0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
3fc0: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65  SELECT ){.    re
3fd0: 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  g = sqlite3CodeS
3fe0: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
3ff0: 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 23 65 6e   pExpr);.  }.#en
4000: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67  dif.  return reg
4010: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
4020: 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e  ent pVector poin
4030: 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65  ts to a vector e
4040: 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68  xpression - eith
4050: 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a  er a TK_VECTOR.*
4060: 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74  * or TK_SELECT t
4070: 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65  hat returns more
4080: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
4090: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
40a0: 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72  returns.** the r
40b0: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f  egister number o
40c0: 66 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  f a register tha
40d0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
40e0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65  alue of.** eleme
40f0: 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65  nt iField of the
4100: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   vector..**.** I
4110: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
4120: 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73  K_SELECT express
4130: 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66  ion, then code f
4140: 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20  or it must have 
4150: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
4160: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
4170: 20 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62   the exprCodeSub
4180: 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65  select() routine
4190: 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
41a0: 65 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53  e parameter regS
41b0: 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20  elect should be 
41c0: 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
41d0: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
41e0: 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  rs.** containing
41f0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
4200: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  the sub-select. 
4210: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f  .**.** If pVecto
4220: 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f  r is of type TK_
4230: 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64  VECTOR, then cod
4240: 65 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73  e for the reques
4250: 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20  ted field.** is 
4260: 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68  generated. In th
4270: 69 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72  is case (*pRegFr
4280: 65 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74  ee) may be set t
4290: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
42a0: 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  ** a temporary r
42b0: 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72  egister to be fr
42c0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
42d0: 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
42e0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ng..**.** Before
42f0: 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70   returning, outp
4300: 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  ut parameter (*p
4310: 70 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f  pExpr) is set to
4320: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
4330: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72   Expr object cor
4340: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c  responding to el
4350: 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74  ement iElem of t
4360: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74  he vector..*/.st
4370: 61 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63  atic int exprVec
4380: 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50  torRegister(.  P
4390: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43b0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
43c0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74  */.  Expr *pVect
43d0: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
43e0: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74       /* Vector t
43f0: 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e  o extract elemen
4400: 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
4410: 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20  iField,         
4420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4430: 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20  ield to extract 
4440: 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a  from pVector */.
4450: 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c    int regSelect,
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4470: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
4480: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
4490: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
44a0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
44b0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78        /* OUT: Ex
44c0: 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74  pression element
44d0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46   */.  int *pRegF
44e0: 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
44f0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65        /* OUT: Te
4500: 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
4510: 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f  ree */.){.  u8 o
4520: 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b  p = pVector->op;
4530: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
4540: 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d  K_VECTOR || op==
4550: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
4560: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
4570: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
4580: 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70  ISTER ){.    *pp
4590: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65  Expr = sqlite3Ve
45a0: 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
45b0: 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64  (pVector, iField
45c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56  );.    return pV
45d0: 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46  ector->iTable+iF
45e0: 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ield;.  }.  if( 
45f0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
4600: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70  .    *ppExpr = p
4610: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
4620: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69  t->pEList->a[iFi
4630: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
4640: 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63   return regSelec
4650: 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20  t+iField;.  }.  
4660: 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f  *ppExpr = pVecto
4670: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46  r->x.pList->a[iF
4680: 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72  ield].pExpr;.  r
4690: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
46a0: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
46b0: 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46  , *ppExpr, pRegF
46c0: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ree);.}../*.** E
46d0: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
46e0: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
46f0: 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74  between two vect
4700: 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75  or values. Compu
4710: 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  te.** the result
4720: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
4730: 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c  on (1, 0, or NUL
4740: 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  L) and write tha
4750: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f  t.** result into
4760: 20 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a   register dest..
4770: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4780: 20 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68   must satisfy th
4790: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63  e following prec
47a0: 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  onditions:.**.**
47b0: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
47c0: 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70  ==TK_IS:      op
47d0: 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d  ==TK_EQ and p5==
47e0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
47f0: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
4800: 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70  ==TK_ISNOT:   op
4810: 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d  ==TK_NE and p5==
4820: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
4830: 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20      otherwise:  
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
4850: 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  ==pExpr->op and 
4860: 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20  p5==0.*/.static 
4870: 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43  void codeVectorC
4880: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
4890: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
48a0: 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f  /* Code generato
48b0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
48c0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
48d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
48e0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
48f0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
4900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
4910: 72 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74  rite results int
4920: 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
4930: 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20  */.  u8 op,     
4940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
4950: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
4960: 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  r */.  u8 p5    
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4980: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72  SQLITE_NULLEQ or
4990: 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64   zero */.){.  Vd
49a0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
49b0: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
49c0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
49d0: 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69  eft;.  Expr *pRi
49e0: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
49f0: 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74  ght;.  int nLeft
4a00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
4a10: 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
4a20: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4a30: 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69  regLeft = 0;.  i
4a40: 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b  nt regRight = 0;
4a50: 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a  .  u8 opx = op;.
4a60: 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d    int addrDone =
4a70: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4a80: 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  Label(pParse);..
4a90: 20 20 69 66 28 20 6e 4c 65 66 74 21 3d 73 71 6c    if( nLeft!=sql
4aa0: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
4ab0: 7a 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  ze(pRight) ){.  
4ac0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4ad0: 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
4ae0: 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
4af0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
4b00: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
4b10: 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45  >op==TK_EQ || pE
4b20: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 0a  xpr->op==TK_NE .
4b30: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
4b40: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45  >op==TK_IS || pE
4b50: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4b60: 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78  T .       || pEx
4b70: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pr->op==TK_LT ||
4b80: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
4b90: 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78  T .       || pEx
4ba0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
4bb0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
4bc0: 45 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  E .  );.  assert
4bd0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20  ( pExpr->op==op 
4be0: 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  || (pExpr->op==T
4bf0: 4b 5f 49 53 20 26 26 20 6f 70 3d 3d 54 4b 5f 45  K_IS && op==TK_E
4c00: 51 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  Q).            |
4c10: 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  | (pExpr->op==TK
4c20: 5f 49 53 4e 4f 54 20 26 26 20 6f 70 3d 3d 54 4b  _ISNOT && op==TK
4c30: 5f 4e 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  _NE) );.  assert
4c40: 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78 70 72  ( p5==0 || pExpr
4c50: 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20 61 73  ->op!=op );.  as
4c60: 73 65 72 74 28 20 70 35 3d 3d 53 51 4c 49 54 45  sert( p5==SQLITE
4c70: 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78 70 72  _NULLEQ || pExpr
4c80: 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20 20 70  ->op==op );..  p
4c90: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 53 54 4f 52  5 |= SQLITE_STOR
4ca0: 45 50 32 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d  EP2;.  if( opx==
4cb0: 54 4b 5f 4c 45 20 29 20 6f 70 78 20 3d 20 54 4b  TK_LE ) opx = TK
4cc0: 5f 4c 54 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d  _LT;.  if( opx==
4cd0: 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20 54 4b  TK_GE ) opx = TK
4ce0: 5f 47 54 3b 0a 0a 20 20 72 65 67 4c 65 66 74 20  _GT;..  regLeft 
4cf0: 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c  = exprCodeSubsel
4d00: 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ect(pParse, pLef
4d10: 74 29 3b 0a 20 20 72 65 67 52 69 67 68 74 20 3d  t);.  regRight =
4d20: 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65   exprCodeSubsele
4d30: 63 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  ct(pParse, pRigh
4d40: 74 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t);..  for(i=0; 
4d50: 31 20 2f 2a 4c 6f 6f 70 20 65 78 69 74 73 20 62  1 /*Loop exits b
4d60: 79 20 22 62 72 65 61 6b 22 2a 2f 3b 20 69 2b 2b  y "break"*/; i++
4d70: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 46 72  ){.    int regFr
4d80: 65 65 31 20 3d 20 30 2c 20 72 65 67 46 72 65 65  ee1 = 0, regFree
4d90: 32 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 72 20  2 = 0;.    Expr 
4da0: 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20 20 69  *pL, *pR; .    i
4db0: 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 61  nt r1, r2;.    a
4dc0: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
4dd0: 3c 6e 4c 65 66 74 20 29 3b 0a 20 20 20 20 72 31  <nLeft );.    r1
4de0: 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67   = exprVectorReg
4df0: 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c  ister(pParse, pL
4e00: 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c  eft, i, regLeft,
4e10: 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29   &pL, &regFree1)
4e20: 3b 0a 20 20 20 20 72 32 20 3d 20 65 78 70 72 56  ;.    r2 = exprV
4e30: 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50  ectorRegister(pP
4e40: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69 2c  arse, pRight, i,
4e50: 20 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c 20   regRight, &pR, 
4e60: 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
4e70: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
4e80: 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f 70 78 2c  se, pL, pR, opx,
4e90: 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 70   r1, r2, dest, p
4ea0: 35 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  5);.    testcase
4eb0: 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
4ec0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4ed0: 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 74 65  ==OP_Lt);.    te
4ee0: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
4ef0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4f00: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
4f10: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4f20: 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
4f30: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f40: 5f 47 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Gt);.    testca
4f50: 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
4f60: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f70: 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
4f80: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f90: 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
4fa0: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
4fb0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4fc0: 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43  p==OP_Ne); VdbeC
4fd0: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4fe0: 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71 6c 69  OP_Ne);.    sqli
4ff0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5000: 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
5010: 65 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e1);.    sqlite3
5020: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5030: 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
5040: 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65  ;.    if( i==nLe
5050: 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62 72  ft-1 ){.      br
5060: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
5070: 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29 7b  f( opx==TK_EQ ){
5080: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5090: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
50a0: 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64 72  fNot, dest, addr
50b0: 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Done); VdbeCover
50c0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35  age(v);.      p5
50d0: 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e   |= SQLITE_KEEPN
50e0: 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ULL;.    }else i
50f0: 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b  f( opx==TK_NE ){
5100: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5110: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5120: 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e  f, dest, addrDon
5130: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
5140: 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d  (v);.      p5 |=
5150: 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c   SQLITE_KEEPNULL
5160: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5170: 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54     assert( op==T
5180: 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LT || op==TK_G
5190: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  T || op==TK_LE |
51a0: 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  | op==TK_GE );. 
51b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
51c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c 73  AddOp2(v, OP_Els
51d0: 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72 44  eNotEq, 0, addrD
51e0: 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  one);.      Vdbe
51f0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
5200: 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20  ==TK_LT);.      
5210: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
5220: 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20  , op==TK_GT);.  
5230: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
5240: 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29  If(v, op==TK_LE)
5250: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
5260: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
5270: 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  _GE);.      if( 
5280: 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70 78  i==nLeft-2 ) opx
5290: 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d   = op;.    }.  }
52a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
52b0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
52c0: 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66 20  drDone);.}..#if 
52d0: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
52e0: 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  DEPTH>0./*.** Ch
52f0: 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e  eck that argumen
5300: 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73  t nHeight is les
5310: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
5320: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a  to the maximum.*
5330: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  * expression dep
5340: 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69  th allowed. If i
5350: 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20  t is not, leave 
5360: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
5370: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a   in.** pParse..*
5380: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
5390: 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72  rCheckHeight(Par
53a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
53b0: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20  nHeight){.  int 
53c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
53d0: 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d    int mxHeight =
53e0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
53f0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
5400: 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20  _EXPR_DEPTH];.  
5410: 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65  if( nHeight>mxHe
5420: 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
5430: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5440: 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70  se, .       "Exp
5450: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20  ression tree is 
5460: 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d  too large (maxim
5470: 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d  um depth %d)", m
5480: 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20  xHeight.    );. 
5490: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
54a0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
54b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  rn rc;.}../* The
54c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65   following three
54d0: 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67   functions, heig
54e0: 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67  htOfExpr(), heig
54f0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a  htOfExprList().*
5500: 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65  * and heightOfSe
5510: 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64  lect(), are used
5520: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
5530: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
5540: 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65  .** of any expre
5550: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
5560: 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72  enced by the str
5570: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
5580: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72   the.** first ar
5590: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
55a0: 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65   this maximum he
55b0: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
55c0: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
55d0: 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a   value pointed.*
55e0: 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74  * to by pnHeight
55f0: 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  , the second par
5600: 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74  ameter, then set
5610: 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68   *pnHeight to th
5620: 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a  at.** value..*/.
5630: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5640: 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70  htOfExpr(Expr *p
5650: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5660: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
5670: 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e   if( p->nHeight>
5680: 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20  *pnHeight ){.   
5690: 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70     *pnHeight = p
56a0: 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d  ->nHeight;.    }
56b0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
56c0: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  id heightOfExprL
56d0: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  ist(ExprList *p,
56e0: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
56f0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5700: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
5710: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
5720: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67  i++){.      heig
5730: 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d  htOfExpr(p->a[i]
5740: 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74  .pExpr, pnHeight
5750: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  );.    }.  }.}.s
5760: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
5770: 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74  tOfSelect(Select
5780: 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20 2a   *pSelect, int *
5790: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53 65 6c  pnHeight){.  Sel
57a0: 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  ect *p;.  for(p=
57b0: 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d 70 2d  pSelect; p; p=p-
57c0: 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 68 65  >pPrior){.    he
57d0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57  ightOfExpr(p->pW
57e0: 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b  here, pnHeight);
57f0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5800: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e  r(p->pHaving, pn
5810: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5820: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69  ghtOfExpr(p->pLi
5830: 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  mit, pnHeight);.
5840: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5850: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
5860: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
5870: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
5880: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48  p->pGroupBy, pnH
5890: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
58a0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
58b0: 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67  pOrderBy, pnHeig
58c0: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
58d0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
58e0: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
58f0: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
5900: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a   passed as an .*
5910: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65  * argument. An e
5920: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e  xpression with n
5930: 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72  o children, Expr
5940: 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78  .pList or .** Ex
5950: 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65  pr.pSelect membe
5960: 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f  r has a height o
5970: 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65  f 1. Any other e
5980: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73  xpression.** has
5990: 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20   a height equal 
59a0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  to the maximum h
59b0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68  eight of any oth
59c0: 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  er .** reference
59d0: 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e  d Expr plus one.
59e0: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
59f0: 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61  agate EP_Propaga
5a00: 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d  te flags up from
5a10: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f   Expr.x.pList to
5a20: 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20   Expr.flags,.** 
5a30: 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  if appropriate..
5a40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5a50: 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70  xprSetHeight(Exp
5a60: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  r *p){.  int nHe
5a70: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
5a80: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66  htOfExpr(p->pLef
5a90: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5aa0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5ab0: 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74  pRight, &nHeight
5ac0: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
5ad0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
5ae0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
5af0: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5b00: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e  p->x.pSelect, &n
5b10: 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  Height);.  }else
5b20: 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20   if( p->x.pList 
5b30: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
5b40: 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69  xprList(p->x.pLi
5b50: 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  st, &nHeight);. 
5b60: 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45     p->flags |= E
5b70: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71  P_Propagate & sq
5b80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
5b90: 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  gs(p->x.pList);.
5ba0: 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74    }.  p->nHeight
5bb0: 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a   = nHeight + 1;.
5bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
5bd0: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
5be0: 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65  riable using the
5bf0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29   exprSetHeight()
5c00: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a   function. If.**
5c10: 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67   the height is g
5c20: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
5c30: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  maximum allowed 
5c40: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
5c50: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
5c60: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
5c70: 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67  *.** Also propag
5c80: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
5c90: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
5ca0: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
5cb0: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
5cc0: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
5cd0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
5ce0: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
5cf0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
5d00: 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p){.  if( pParse
5d10: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
5d20: 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74  .  exprSetHeight
5d30: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (p);.  sqlite3Ex
5d40: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
5d50: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
5d60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
5d70: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  rn the maximum h
5d80: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70  eight of any exp
5d90: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5da0: 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68  erenced.** by th
5db0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5dc0: 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
5dd0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
5de0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
5df0: 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20  prHeight(Select 
5e00: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
5e10: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
5e20: 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65  OfSelect(p, &nHe
5e30: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
5e40: 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65  nHeight;.}.#else
5e50: 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67   /* ABOVE:  Heig
5e60: 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65  ht enforcement e
5e70: 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20  nabled.  BELOW: 
5e80: 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65  Height enforceme
5e90: 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20  nt off */./*.** 
5ea0: 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  Propagate all EP
5eb0: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
5ec0: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5ed0: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5ee0: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5ef0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5f00: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5f10: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5f20: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5f30: 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  p && p->x.pList 
5f40: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
5f50: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
5f60: 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66  ect) ){.    p->f
5f70: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
5f80: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
5f90: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5fa0: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23  .pList);.  }.}.#
5fb0: 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65  define exprSetHe
5fc0: 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f  ight(y).#endif /
5fd0: 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  * SQLITE_MAX_EXP
5fe0: 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a  R_DEPTH>0 */../*
5ff0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6000: 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c   is the core all
6010: 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20  ocator for Expr 
6020: 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e  nodes..**.** Con
6030: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
6040: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64  ression node and
6050: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
6060: 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79  r to it.  Memory
6070: 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64  .** for this nod
6080: 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54  e and for the pT
6090: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  oken argument is
60a0: 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   a single alloca
60b0: 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  tion.** obtained
60c0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
60d0: 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61  alloc().  The ca
60e0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
60f0: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
6100: 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
6110: 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75   the node eventu
6120: 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e  ally gets freed.
6130: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74  .**.** If dequot
6140: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
6150: 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74  the token (if it
6160: 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75   exists) is dequ
6170: 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75  oted..** If dequ
6180: 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f  ote is false, no
6190: 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65   dequoting is pe
61a0: 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64 65  rformed.  The de
61b0: 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74  Quote.** paramet
61c0: 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
61d0: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20   pToken is NULL 
61e0: 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20  or if the token 
61f0: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65  does not.** appe
6200: 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ar to be quoted.
6210: 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20    If the quotes 
6220: 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  were of the form
6230: 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71   "..." (double-q
6240: 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74  uotes).** then t
6250: 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20  he EP_DblQuoted 
6260: 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
6270: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
6280: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61  de..**.** Specia
6290: 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d  l case:  If op==
62a0: 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70  TK_INTEGER and p
62b0: 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Token points to 
62c0: 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a  a string that.**
62d0: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74   can be translat
62e0: 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74  ed into a 32-bit
62f0: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
6300: 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a  he token is not.
6310: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a  ** stored in u.z
6320: 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c  Token.  Instead,
6330: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
6340: 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ues is written.*
6350: 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20  * into u.iValue 
6360: 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61  and the EP_IntVa
6370: 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e  lue flag is set.
6380: 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61    No extra stora
6390: 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74  ge.** is allocat
63a0: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69  ed to hold the i
63b0: 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20  nteger text and 
63c0: 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67  the dequote flag
63d0: 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
63e0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
63f0: 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65  rAlloc(.  sqlite
6400: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
6410: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
6420: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6430: 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  awNN() */.  int 
6440: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6450: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6460: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6470: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
6480: 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61  n,    /* Token a
6490: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
64a0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
64b0: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
64c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
64d0: 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20  dequote */.){.  
64e0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
64f0: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
6500: 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a  int iValue = 0;.
6510: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
6520: 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e   );.  if( pToken
6530: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
6540: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
6550: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
6560: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
6570: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
6580: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
6590: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
65a0: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
65b0: 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c      assert( iVal
65c0: 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ue>=0 );.    }. 
65d0: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
65e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
65f0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
6600: 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  )+nExtra);.  if(
6610: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   pNew ){.    mem
6620: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
6630: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
6640: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
6650: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
6660: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
6670: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
6680: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
6690: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
66a0: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
66b0: 6c 75 65 7c 45 50 5f 4c 65 61 66 7c 28 69 56 61  lue|EP_Leaf|(iVa
66c0: 6c 75 65 3f 45 50 5f 49 73 54 72 75 65 3a 45 50  lue?EP_IsTrue:EP
66d0: 5f 49 73 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  _IsFalse);.     
66e0: 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
66f0: 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20  e = iValue;.    
6700: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6710: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
6720: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
6730: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
6740: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
6750: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
6760: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
6770: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
6780: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
6790: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
67a0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
67b0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
67c0: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
67d0: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
67e0: 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33 49 73  ote && sqlite3Is
67f0: 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54  quote(pNew->u.zT
6800: 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20  oken[0]) ){.    
6810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
6820: 75 6f 74 65 45 78 70 72 28 70 4e 65 77 29 3b 0a  uoteExpr(pNew);.
6830: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6840: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  }.    }.#if SQLI
6850: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
6860: 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48  H>0.    pNew->nH
6870: 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69  eight = 1;.#endi
6880: 66 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f  .  }.  return
6890: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
68a0: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  Allocate a new e
68b0: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
68c0: 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69  rom a zero-termi
68d0: 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74  nated token that
68e0: 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   has.** already 
68f0: 62 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a  been dequoted..*
6900: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
6910: 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
6920: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
6930: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c  * Handle for sql
6940: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
6950: 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29  () (may be null)
6960: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6980: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
6990: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
69a0: 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20  ar *zToken      
69b0: 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  /* Token argumen
69c0: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
69d0: 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20  L */.){.  Token 
69e0: 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65  x;.  x.z = zToke
69f0: 6e 3b 0a 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74  n;.  x.n = sqlit
6a00: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65  e3Strlen30(zToke
6a10: 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  n);.  return sql
6a20: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
6a30: 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a  , op, &x, 0);.}.
6a40: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75  ./*.** Attach su
6a50: 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64  btrees pLeft and
6a60: 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20 45   pRight to the E
6a70: 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a  xpr node pRoot..
6a80: 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d  **.** If pRoot==
6a90: 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
6aa0: 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c  that a memory al
6ab0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
6ac0: 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  as occurred..** 
6ad0: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 65  In that case, de
6ae0: 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65 65  lete the subtree
6af0: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
6b00: 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ht..*/.void sqli
6b10: 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62  te3ExprAttachSub
6b20: 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33  trees(.  sqlite3
6b30: 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52   *db,.  Expr *pR
6b40: 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65  oot,.  Expr *pLe
6b50: 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft,.  Expr *pRig
6b60: 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f  ht.){.  if( pRoo
6b70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  t==0 ){.    asse
6b80: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
6b90: 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69  iled );.    sqli
6ba0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6bb0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  , pLeft);.    sq
6bc0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6bd0: 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  db, pRight);.  }
6be0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52  else{.    if( pR
6bf0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52  ight ){.      pR
6c00: 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 52  oot->pRight = pR
6c10: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  ight;.      pRoo
6c20: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  t->flags |= EP_P
6c30: 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67 68  ropagate & pRigh
6c40: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
6c50: 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b      if( pLeft ){
6c60: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c  .      pRoot->pL
6c70: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  eft = pLeft;.   
6c80: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
6c90: 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  |= EP_Propagate 
6ca0: 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a  & pLeft->flags;.
6cb0: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
6cc0: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
6cd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
6ce0: 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e 6f  ocate an Expr no
6cf0: 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61  de which joins a
6d00: 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75  s many as two su
6d10: 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  btrees..**.** On
6d20: 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
6d30: 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65   subtrees can be
6d40: 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61   NULL.  Return a
6d50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6d60: 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65  new.** Expr node
6d70: 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d  .  Or, if an OOM
6d80: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
6d90: 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  et pParse->db->m
6da0: 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20  allocFailed,.** 
6db0: 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65  free the subtree
6dc0: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
6dd0: 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  L..*/.Expr *sqli
6de0: 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73  te3PExpr(.  Pars
6df0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6e00: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
6e10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
6e20: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6e30: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6e40: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78  n opcode */.  Ex
6e50: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
6e60: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70        /* Left op
6e70: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
6e80: 2a 70 52 69 67 68 74 20 20 20 20 20 20 20 20 20  *pRight         
6e90: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
6ea0: 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  and */.){.  Expr
6eb0: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
6ec0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
6ed0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
6ee0: 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 69 66 28  of(Expr));.  if(
6ef0: 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74   p ){.    memset
6f00: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  (p, 0, sizeof(Ex
6f10: 70 72 29 29 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  pr));.    p->op 
6f20: 3d 20 6f 70 20 26 20 30 78 66 66 3b 0a 20 20 20  = op & 0xff;.   
6f30: 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20   p->iAgg = -1;. 
6f40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74     sqlite3ExprAt
6f50: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
6f60: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
6f70: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
6f80: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
6f90: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
6fa0: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65  ->nHeight);.  }e
6fb0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
6fc0: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
6fd0: 65 2d 3e 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20  e->db, pLeft);. 
6fe0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6ff0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7000: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20   pRight);.  }.  
7010: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
7020: 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74 20 74  ** Add pSelect t
7030: 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70 53 65  o the Expr.x.pSe
7040: 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c  lect field.  Or,
7050: 20 69 66 20 70 45 78 70 72 20 69 73 20 4e 55 4c   if pExpr is NUL
7060: 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d  L (due.** do a m
7070: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
7080: 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e 20 64   failure) then d
7090: 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c 65 63  elete the pSelec
70a0: 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69  t object..*/.voi
70b0: 64 20 73 71 6c 69 74 65 33 50 45 78 70 72 41 64  d sqlite3PExprAd
70c0: 64 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  dSelect(Parse *p
70d0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
70e0: 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  pr, Select *pSel
70f0: 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70  ect){.  if( pExp
7100: 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  r ){.    pExpr->
7110: 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  x.pSelect = pSel
7120: 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ect;.    ExprSet
7130: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
7140: 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50 5f  EP_xIsSelect|EP_
7150: 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 73  Subquery);.    s
7160: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
7170: 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72  ghtAndFlags(pPar
7180: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 65  se, pExpr);.  }e
7190: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
71a0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
71b0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
71c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
71d0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
71e0: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d   pSelect);.  }.}
71f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  .../*.** Join tw
7200: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
7210: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
7220: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
7230: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
7240: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
7250: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
7260: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
7270: 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20  .** If one side 
7280: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
7290: 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e  the AND is known
72a0: 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68   to be false, th
72b0: 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  en instead.** of
72c0: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e   returning an AN
72d0: 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75  D expression, ju
72e0: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73  st return a cons
72f0: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
7300: 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20  with.** a value 
7310: 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70  of false..*/.Exp
7320: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e  r *sqlite3ExprAn
7330: 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
7340: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
7350: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 73  pr *pRight){.  s
7360: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7370: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
7380: 4c 65 66 74 3d 3d 30 20 20 29 7b 0a 20 20 20 20  Left==0  ){.    
7390: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
73a0: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
73b0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
73c0: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
73d0: 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73  e if( ExprAlways
73e0: 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20  False(pLeft) || 
73f0: 45 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  ExprAlwaysFalse(
7400: 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73  pRight) ){.    s
7410: 71 6c 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41  qlite3ExprUnmapA
7420: 6e 64 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c  ndDelete(pParse,
7430: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c   pLeft);.    sql
7440: 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41 6e 64  ite3ExprUnmapAnd
7450: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70  Delete(pParse, p
7460: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
7470: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
7480: 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
7490: 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
74a0: 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20  okens[0], 0);.  
74b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
74c0: 6e 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  n sqlite3PExpr(p
74d0: 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 70  Parse, TK_AND, p
74e0: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
74f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
7500: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
7510: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
7520: 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  a function with 
7530: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75  multiple.** argu
7540: 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ments..*/.Expr *
7550: 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74  sqlite3ExprFunct
7560: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
7570: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
7580: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
7590: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
75a0: 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 41 72  List,      /* Ar
75b0: 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20  gument list */. 
75c0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20   Token *pToken, 
75d0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
75e0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  f the function *
75f0: 2f 0a 20 20 69 6e 74 20 65 44 69 73 74 69 6e 63  /.  int eDistinc
7600: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 46 5f  t         /* SF_
7610: 44 69 73 74 69 6e 63 74 20 6f 72 20 53 46 5f 41  Distinct or SF_A
7620: 4c 4c 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20 20  LL or 0 */.){.  
7630: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71  Expr *pNew;.  sq
7640: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7650: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
7660: 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e  ( pToken );.  pN
7670: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
7680: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e  Alloc(db, TK_FUN
7690: 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31  CTION, pToken, 1
76a0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
76b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
76c0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
76d0: 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f  , pList); /* Avo
76e0: 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77  id memory leak w
76f0: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
7700: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
7710: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
7720: 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 45 78 70  t && pList->nExp
7730: 72 20 3e 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  r > pParse->db->
7740: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7750: 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MIT_FUNCTION_ARG
7760: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
7770: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7780: 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75 6d   "too many argum
7790: 65 6e 74 73 20 6f 6e 20 66 75 6e 63 74 69 6f 6e  ents on function
77a0: 20 25 54 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20   %T", pToken);. 
77b0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
77c0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45 78  st = pList;.  Ex
77d0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e  prSetProperty(pN
77e0: 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29 3b  ew, EP_HasFunc);
77f0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
7800: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
7810: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
7820: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
7830: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
7840: 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b  s(pParse, pNew);
7850: 0a 20 20 69 66 28 20 65 44 69 73 74 69 6e 63 74  .  if( eDistinct
7860: 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  ==SF_Distinct ) 
7870: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
7880: 70 4e 65 77 2c 20 45 50 5f 44 69 73 74 69 6e 63  pNew, EP_Distinc
7890: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  t);.  return pNe
78a0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
78b0: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
78c0: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
78d0: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
78e0: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
78f0: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
7900: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
7910: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
7920: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
7930: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
7940: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
7950: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
7960: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
7970: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
7980: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
7990: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
79a0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
79b0: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
79c0: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
79d0: 74 20 74 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f  t too big to avo
79e0: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
79f0: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
7a00: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
7a10: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
7a20: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
7a30: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
7a40: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
7a50: 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61  rm ":aaa", "@aaa
7a60: 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65  ", or "$aaa" are
7a70: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61   assigned the sa
7a80: 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20  me number.** as 
7a90: 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73  the previous ins
7aa0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  tance of the sam
7ab0: 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20  e wildcard.  Or 
7ac0: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
7ad0: 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65  irst.** instance
7ae0: 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64   of the wildcard
7af0: 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  , the next seque
7b00: 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  ntial variable n
7b10: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
7b20: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
7b30: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
7b40: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
7b50: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
7b60: 78 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73  xpr, u32 n){.  s
7b70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7b80: 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74  rse->db;.  const
7b90: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61   char *z;.  ynVa
7ba0: 72 20 78 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  r x;..  if( pExp
7bb0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
7bc0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
7bd0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
7be0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f   EP_IntValue|EP_
7bf0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
7c00: 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70  Only) );.  z = p
7c10: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
7c20: 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
7c30: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d  ;.  assert( z[0]
7c40: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7c50: 20 6e 3d 3d 28 75 33 32 29 73 71 6c 69 74 65 33   n==(u32)sqlite3
7c60: 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20  Strlen30(z) );. 
7c70: 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a   if( z[1]==0 ){.
7c80: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
7c90: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e  of the form "?".
7ca0: 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78    Assign the nex
7cb0: 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  t variable numbe
7cc0: 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  r */.    assert(
7cd0: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20   z[0]=='?' );.  
7ce0: 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b    x = (ynVar)(++
7cf0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20  pParse->nVar);. 
7d00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
7d10: 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20 20 69  doAdd = 0;.    i
7d20: 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[0]=='?' ){.
7d30: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
7d40: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
7d50: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
7d60: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
7d70: 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  er and.      ** 
7d80: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
7d90: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
7da0: 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20  .      i64 i;.  
7db0: 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20      int bOk;.   
7dc0: 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f     if( n==2 ){ /
7dd0: 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46  *OPTIMIZATION-IF
7de0: 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 20 20  -TRUE*/.        
7df0: 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f  i = z[1]-'0';  /
7e00: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
7e10: 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73 69  e of ?N for a si
7e20: 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a  ngle digit N */.
7e30: 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b          bOk = 1;
7e40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7e50: 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73        bOk = 0==s
7e60: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b  qlite3Atoi64(&z[
7e70: 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c  1], &i, n-1, SQL
7e80: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
7e90: 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
7ea0: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( i==0 );.     
7eb0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20   testcase( i==1 
7ec0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7ed0: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
7ee0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7ef0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31  RIABLE_NUMBER]-1
7f00: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7f10: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
7f20: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7f30: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
7f40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b  );.      if( bOk
7f50: 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e  ==0 || i<1 || i>
7f60: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7f70: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
7f80: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
7f90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7fa0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
7fb0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
7fc0: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
7fd0: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
7fe0: 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74        db->aLimit
7ff0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
8000: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b  RIABLE_NUMBER]);
8010: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
8020: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 78  .      }.      x
8030: 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20   = (ynVar)i;.   
8040: 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d     if( x>pParse-
8050: 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20  >nVar ){.       
8060: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
8070: 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20 20 20  (int)x;.        
8080: 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20  doAdd = 1;.     
8090: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
80a0: 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65  e3VListNumToName
80b0: 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c  (pParse->pVList,
80c0: 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   x)==0 ){.      
80d0: 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20    doAdd = 1;.   
80e0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
80f0: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
8100: 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20  ds like ":aaa", 
8110: 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61 22  "$aaa" or "@aaa"
8120: 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d  .  Reuse the sam
8130: 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20  e variable.     
8140: 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68   ** number as th
8150: 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e  e prior appearan
8160: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ce of the same n
8170: 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e  ame, or if the n
8180: 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ame.      ** has
8190: 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20   never appeared 
81a0: 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68  before, reuse th
81b0: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20  e same variable 
81c0: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a  number.      */.
81d0: 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72        x = (ynVar
81e0: 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d  )sqlite3VListNam
81f0: 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70  eToNum(pParse->p
8200: 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20  VList, z, n);.  
8210: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a      if( x==0 ){.
8220: 20 20 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56          x = (ynV
8230: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
8240: 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64 6f 41  ar);.        doA
8250: 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  dd = 1;.      }.
8260: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f      }.    if( do
8270: 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Add ){.      pPa
8280: 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71  rse->pVList = sq
8290: 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28 64 62  lite3VListAdd(db
82a0: 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  , pParse->pVList
82b0: 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20  , z, n, x);.    
82c0: 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69  }.  }.  pExpr->i
82d0: 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66  Column = x;.  if
82e0: 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  ( x>db->aLimit[S
82f0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8300: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
8310: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8320: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
8330: 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62   many SQL variab
8340: 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  les");.  }.}../*
8350: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
8360: 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73  delete an expres
8370: 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74  sion tree..*/.st
8380: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
8390: 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65  LINE void sqlite
83a0: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71  3ExprDeleteNN(sq
83b0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
83c0: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
83d0: 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69  !=0 );.  /* Sani
83e0: 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74  ty check: Assert
83f0: 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c   that the IntVal
8400: 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  ue is non-negati
8410: 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  ve if it exists 
8420: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  */.  assert( !Ex
8430: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8440: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
8450: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20   p->u.iValue>=0 
8460: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45  );..  assert( !E
8470: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8480: 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 7c 7c  , EP_WinFunc) ||
8490: 20 70 2d 3e 79 2e 70 57 69 6e 21 3d 30 20 7c 7c   p->y.pWin!=0 ||
84a0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
84b0: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  d );.  assert( p
84c0: 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op!=TK_FUNCTIO
84d0: 4e 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  N || ExprHasProp
84e0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
84f0: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
8500: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d  .          || p-
8510: 3e 79 2e 70 57 69 6e 3d 3d 30 20 7c 7c 20 45 78  >y.pWin==0 || Ex
8520: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8530: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a   EP_WinFunc) );.
8540: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8550: 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48 61  BUG.  if( ExprHa
8560: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8570: 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48 61  Leaf) && !ExprHa
8580: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8590: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
85a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 65    assert( p->pLe
85b0: 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ft==0 );.    ass
85c0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
85d0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
85e0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30   p->x.pSelect==0
85f0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
8600: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
8610: 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f 6b  perty(p, (EP_Tok
8620: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29  enOnly|EP_Leaf))
8630: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45   ){.    /* The E
8640: 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e  xpr.x union is n
8650: 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65  ever used at the
8660: 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78   same time as Ex
8670: 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20  pr.pRight */.   
8680: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c   assert( p->x.pL
8690: 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ist==0 || p->pRi
86a0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
86b0: 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70 2d  ( p->pLeft && p-
86c0: 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op!=TK_SELECT_C
86d0: 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33 45  OLUMN ) sqlite3E
86e0: 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20  xprDeleteNN(db, 
86f0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  p->pLeft);.    i
8700: 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a  f( p->pRight ){.
8710: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
8720: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8730: 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b  , EP_WinFunc) );
8740: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
8750: 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70  prDeleteNN(db, p
8760: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  ->pRight);.    }
8770: 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73  else if( ExprHas
8780: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
8790: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
87a0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
87b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
87c0: 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a 20 20  P_WinFunc) );.  
87d0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
87e0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
87f0: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d  .pSelect);.    }
8800: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
8810: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
8820: 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  e(db, p->x.pList
8830: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
8840: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
8850: 43 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  C.      if( Expr
8860: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8870: 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20  P_WinFunc) ){.  
8880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e        sqlite3Win
8890: 64 6f 77 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  dowDelete(db, p-
88a0: 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20 20 20 20  >y.pWin);.      
88b0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
88c0: 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73   }.  if( ExprHas
88d0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
88e0: 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74  emToken) ) sqlit
88f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
8900: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  u.zToken);.  if(
8910: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
8920: 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20  y(p, EP_Static) 
8930: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
8940: 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20  FreeNN(db, p);. 
8950: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
8960: 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69  3ExprDelete(sqli
8970: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
8980: 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71 6c  ){.  if( p ) sql
8990: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e  ite3ExprDeleteNN
89a0: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 20 49  (db, p);.}../* I
89b0: 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 52 65 6e  nvoke sqlite3Ren
89c0: 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 29 20 61  ameExprUnmap() a
89d0: 6e 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  nd sqlite3ExprDe
89e0: 6c 65 74 65 28 29 20 6f 6e 20 74 68 65 0a 2a 2a  lete() on the.**
89f0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
8a00: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8a10: 55 6e 6d 61 70 41 6e 64 44 65 6c 65 74 65 28 50  UnmapAndDelete(P
8a20: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
8a30: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  pr *p){.  if( p 
8a40: 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45  ){.    if( IN_RE
8a50: 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
8a60: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61       sqlite3Rena
8a70: 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50 61 72  meExprUnmap(pPar
8a80: 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  se, p);.    }.  
8a90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8aa0: 65 74 65 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62  eteNN(pParse->db
8ab0: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
8ac0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
8ad0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
8ae0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
8af0: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
8b00: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
8b10: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
8b20: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
8b30: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
8b40: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
8b50: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
8b60: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
8b70: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
8b80: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
8b90: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
8ba0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
8bb0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
8bc0: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
8bd0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8be0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
8bf0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
8c00: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
8c10: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8c20: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
8c30: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
8c40: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
8c50: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
8c60: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
8c70: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
8c80: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
8c90: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
8ca0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
8cb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8cc0: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
8cd0: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
8ce0: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
8cf0: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
8d00: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8d10: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
8d20: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
8d30: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
8d40: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
8d50: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
8d60: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
8d70: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
8d80: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
8d90: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
8da0: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
8db0: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
8dc0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
8dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
8e10: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
8e20: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
8e30: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
8e40: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
8e50: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
8e60: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
8e70: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
8e80: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
8e90: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
8ea0: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
8eb0: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
8ec0: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
8ed0: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
8ee0: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
8ef0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
8f00: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
8f10: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
8f20: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
8f30: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
8f40: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
8f50: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
8f60: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
8f70: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
8f80: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8f90: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
8fa0: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
8fb0: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
8fc0: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
8fd0: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
8fe0: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
8ff0: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
9000: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
9010: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
9020: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
9030: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
9040: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
9050: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
9060: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
9070: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
9080: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
9090: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
90a0: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
90b0: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
90c0: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
90d0: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
90e0: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
90f0: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
9100: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
9110: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
9120: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
9130: 20 74 68 65 20 45 78 70 72 20 6f 62 6a 65 63 74   the Expr object
9140: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
9150: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
9160: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
9170: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
9180: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
9190: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
91a0: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
91b0: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
91c0: 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  n EXPRDUP_REDUCE
91d0: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
91e0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
91f0: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
9200: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
9210: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
9220: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
9230: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
9240: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
9250: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
9260: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
9270: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
9280: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
9290: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
92a0: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
92b0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
92c0: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
92d0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
92e0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
92f0: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
9300: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
9310: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
9320: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
9330: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
9340: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
9350: 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46    assert( EXPR_F
9360: 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29  ULLSIZE<=0xfff )
9370: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66  ;.  assert( (0xf
9380: 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ff & (EP_Reduced
9390: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d  |EP_TokenOnly))=
93a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66  =0 );.  if( 0==f
93b0: 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  lags || p->op==T
93c0: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
93d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
93e0: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
93f0: 20 20 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f     || ExprHasPro
9400: 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46  perty(p, EP_WinF
9410: 75 6e 63 29 0a 23 65 6e 64 69 66 0a 20 20 29 7b  unc).#endif.  ){
9420: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50  .    nSize = EXP
9430: 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65  R_FULLSIZE;.  }e
9440: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
9450: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
9460: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
9470: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
9480: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
9490: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
94a0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b   EP_FromJoin) );
94b0: 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45   .    assert( !E
94c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
94d0: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
94e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
94f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9500: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29  , EP_NoReduce) )
9510: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65  ;.    if( p->pLe
9520: 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74  ft || p->x.pList
9530: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
9540: 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  = EXPR_REDUCEDSI
9550: 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b  ZE | EP_Reduced;
9560: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9570: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
9580: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
9590: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b  nSize = EXPR_TOK
95a0: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
95b0: 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d  TokenOnly;.    }
95c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53  .  }.  return nS
95d0: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
95e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
95f0: 72 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e  rns the space in
9600: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
9610: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
9620: 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70  y .** of the Exp
9630: 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
9640: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
9650: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  pr.u.zToken stri
9660: 6e 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73  ng (if that.** s
9670: 74 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64  tring is defined
9680: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
9690: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
96a0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
96b0: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
96c0: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53  yte = dupedExprS
96d0: 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61  tructSize(p, fla
96e0: 67 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69  gs) & 0xfff;.  i
96f0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
9700: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
9710: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
9720: 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  en ){.    nByte 
9730: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
9740: 33 30 4e 4e 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  30NN(p->u.zToken
9750: 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  )+1;.  }.  retur
9760: 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  n ROUND8(nByte);
9770: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9780: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
9790: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
97a0: 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69 63   create a duplic
97b0: 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65  ate of the .** e
97c0: 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64  xpression passed
97d0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
97e0: 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f  gument. The seco
97f0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
9800: 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  .** mask contain
9810: 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58 20  ing EXPRDUP_XXX 
9820: 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
9830: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
9840: 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20 74  includes space t
9850: 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  o create a copy 
9860: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
9870: 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64  ct.** itself and
9880: 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66 65   the buffer refe
9890: 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e  rred to by Expr.
98a0: 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79  u.zToken, if any
98b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
98c0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c  XPRDUP_REDUCE fl
98d0: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
98e0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
98f0: 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70   includes .** sp
9900: 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65  ace to duplicate
9910: 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20   all Expr nodes 
9920: 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d  in the tree form
9930: 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74  ed by Expr.pLeft
9940: 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52   .** and Expr.pR
9950: 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20 28  ight variables (
9960: 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20  but not for any 
9970: 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74  structures point
9980: 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73  ed to or .** des
9990: 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cended from the 
99a0: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20  Expr.x.pList or 
99b0: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76  Expr.x.pSelect v
99c0: 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74  ariables)..*/.st
99d0: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
99e0: 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  prSize(Expr *p, 
99f0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
9a00: 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69  t nByte = 0;.  i
9a10: 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74  f( p ){.    nByt
9a20: 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64  e = dupedExprNod
9a30: 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  eSize(p, flags);
9a40: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 45  .    if( flags&E
9a50: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b  XPRDUP_REDUCE ){
9a60: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
9a70: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d  dupedExprSize(p-
9a80: 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b  >pLeft, flags) +
9a90: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
9aa0: 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29  ->pRight, flags)
9ab0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9ac0: 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f  turn nByte;.}../
9ad0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9ae0: 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
9af0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9b00: 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
9b10: 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69  f pzBuffer .** i
9b20: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
9b30: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73 73  *pzBuffer is ass
9b40: 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  umed to point to
9b50: 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20   a buffer large 
9b60: 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74  enough .** to st
9b70: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20  ore the copy of 
9b80: 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68  expression p, th
9b90: 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75  e copies of p->u
9ba0: 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61  .zToken.** (if a
9bb0: 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20  pplicable), and 
9bc0: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  the copies of th
9bd0: 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  e p->pLeft and p
9be0: 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73 73  ->pRight express
9bf0: 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  ions,.** if any.
9c00: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
9c10: 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  g, *pzBuffer is 
9c20: 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  set to the first
9c30: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a   byte past the.*
9c40: 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  * portion of the
9c50: 20 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69   buffer copied i
9c60: 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63  nto by this func
9c70: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
9c80: 45 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71  Expr *exprDup(sq
9c90: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
9ca0: 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67 73  *p, int dupFlags
9cb0: 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29  , u8 **pzBuffer)
9cc0: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20  {.  Expr *pNew; 
9cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
9ce0: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
9cf0: 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20    u8 *zAlloc;   
9d00: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
9d10: 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68 69  y space from whi
9d20: 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70 72  ch to build Expr
9d30: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32   object */.  u32
9d40: 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20 20   staticFlag;    
9d50: 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63 20     /* EP_Static 
9d60: 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62 74  if space not obt
9d70: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
9d80: 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  c */..  assert( 
9d90: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
9da0: 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74  t( p );.  assert
9db0: 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c  ( dupFlags==0 ||
9dc0: 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44   dupFlags==EXPRD
9dd0: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 61  UP_REDUCE );.  a
9de0: 73 73 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d  ssert( pzBuffer=
9df0: 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d  =0 || dupFlags==
9e00: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
9e10: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
9e20: 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74  ut where to writ
9e30: 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73  e the new Expr s
9e40: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69  tructure. */.  i
9e50: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
9e60: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42     zAlloc = *pzB
9e70: 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74 69  uffer;.    stati
9e80: 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69  cFlag = EP_Stati
9e90: 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
9ea0: 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  zAlloc = sqlite3
9eb0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
9ec0: 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  , dupedExprSize(
9ed0: 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a 20  p, dupFlags));. 
9ee0: 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20     staticFlag = 
9ef0: 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20  0;.  }.  pNew = 
9f00: 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a  (Expr *)zAlloc;.
9f10: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
9f20: 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69     /* Set nNewSi
9f30: 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61  ze to the size a
9f40: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
9f50: 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
9f60: 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20  ed to.    ** by 
9f70: 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69  pNew. This is ei
9f80: 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49  ther EXPR_FULLSI
9f90: 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44  ZE, EXPR_REDUCED
9fa0: 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45  SIZE or.    ** E
9fb0: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
9fc0: 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74  E. nToken is set
9fd0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
9fe0: 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64  f bytes consumed
9ff0: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63  .    ** by the c
a000: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
a010: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
a020: 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20  f any)..    */. 
a030: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
a040: 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20  d nStructSize = 
a050: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
a060: 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29  ize(p, dupFlags)
a070: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
a080: 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75  nNewSize = nStru
a090: 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a  ctSize & 0xfff;.
a0a0: 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a      int nToken;.
a0b0: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a0c0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
a0d0: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
a0e0: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20  .zToken ){.     
a0f0: 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65   nToken = sqlite
a100: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
a110: 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20  Token) + 1;.    
a120: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f  }else{.      nTo
a130: 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ken = 0;.    }. 
a140: 20 20 20 69 66 28 20 64 75 70 46 6c 61 67 73 20     if( dupFlags 
a150: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
a160: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a170: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d  (p, EP_Reduced)=
a180: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  =0 );.      memc
a190: 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e  py(zAlloc, p, nN
a1a0: 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  ewSize);.    }el
a1b0: 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 53  se{.      u32 nS
a1c0: 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72 53  ize = (u32)exprS
a1d0: 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20 20  tructSize(p);.  
a1e0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f      memcpy(zAllo
a1f0: 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  c, p, nSize);.  
a200: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45 58      if( nSize<EX
a210: 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a  PR_FULLSIZE ){ .
a220: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
a230: 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30  zAlloc[nSize], 0
a240: 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d  , EXPR_FULLSIZE-
a250: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nSize);.      }.
a260: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
a270: 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64  t the EP_Reduced
a280: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20  , EP_TokenOnly, 
a290: 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c  and EP_Static fl
a2a0: 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ags appropriatel
a2b0: 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  y. */.    pNew->
a2c0: 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65  flags &= ~(EP_Re
a2d0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
a2e0: 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f  ly|EP_Static|EP_
a2f0: 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70  MemToken);.    p
a300: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53  New->flags |= nS
a310: 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f  tructSize & (EP_
a320: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a330: 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d  Only);.    pNew-
a340: 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63  >flags |= static
a350: 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  Flag;..    /* Co
a360: 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  py the p->u.zTok
a370: 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e  en string, if an
a380: 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54  y. */.    if( nT
a390: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 68  oken ){.      ch
a3a0: 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65  ar *zToken = pNe
a3b0: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
a3c0: 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65  har*)&zAlloc[nNe
a3d0: 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65  wSize];.      me
a3e0: 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e  mcpy(zToken, p->
a3f0: 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  u.zToken, nToken
a400: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
a410: 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c  ( 0==((p->flags|
a420: 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 28  pNew->flags) & (
a430: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
a440: 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20 20  Leaf)) ){.      
a450: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
a460: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f  New->x.pSelect o
a470: 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20  r pNew->x.pList 
a480: 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20  member. */.     
a490: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
a4a0: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
a4b0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
a4c0: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
a4d0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
a4e0: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  Dup(db, p->x.pSe
a4f0: 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29 3b  lect, dupFlags);
a500: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a510: 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c        pNew->x.pL
a520: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
a530: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
a540: 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61 67  x.pList, dupFlag
a550: 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
a560: 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69  }..    /* Fill i
a570: 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e  n pNew->pLeft an
a580: 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20  d pNew->pRight. 
a590: 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  */.    if( ExprH
a5a0: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
a5b0: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
a5c0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 57 69 6e 46  okenOnly|EP_WinF
a5d0: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  unc) ){.      zA
a5e0: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a5f0: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a600: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a610: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a620: 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65  ty(pNew, EP_Toke
a630: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29  nOnly|EP_Leaf) )
a640: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a650: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a660: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a670: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a680: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
a690: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a6a0: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a6b0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
a6c0: 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a  t = p->pRight ?.
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6e0: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a6f0: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58  b, p->pRight, EX
a700: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a710: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a720: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
a730: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
a740: 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  NC.      if( Exp
a750: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
a760: 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20  EP_WinFunc) ){. 
a770: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70         pNew->y.p
a780: 57 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e  Win = sqlite3Win
a790: 64 6f 77 44 75 70 28 64 62 2c 20 70 4e 65 77 2c  dowDup(db, pNew,
a7a0: 20 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20   p->y.pWin);.   
a7b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
a7c0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
a7d0: 77 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  w, EP_WinFunc) )
a7e0: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
a7f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
a800: 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20  WINDOWFUNC */.  
a810: 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72      if( pzBuffer
a820: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 42   ){.        *pzB
a830: 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a  uffer = zAlloc;.
a840: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
a850: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  e{.      if( !Ex
a860: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
a870: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
a880: 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20  _Leaf) ){.      
a890: 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d    if( pNew->op==
a8a0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
a8b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
a8c0: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70  ew->pLeft = p->p
a8d0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
a8e0: 61 73 73 65 72 74 28 20 70 2d 3e 69 43 6f 6c 75  assert( p->iColu
a8f0: 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  mn==0 || p->pRig
a900: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
a910: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
a920: 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d 3e 70  ight==0  || p->p
a930: 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66 74 20  Right==p->pLeft 
a940: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
a950: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
a960: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
a970: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
a980: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
a990: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65     }.        pNe
a9a0: 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  w->pRight = sqli
a9b0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
a9c0: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
a9d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a9e0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
a9f0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
aa00: 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 65 70  nd return a deep
aa10: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62 6a   copy of the obj
aa20: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
aa30: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67  e second .** arg
aa40: 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d  ument. If an OOM
aa50: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e   condition is en
aa60: 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20  countered, NULL 
aa70: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
aa80: 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  nd the db->mallo
aa90: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  cFailed flag set
aaa0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
aab0: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61  ITE_OMIT_CTE.sta
aac0: 74 69 63 20 57 69 74 68 20 2a 77 69 74 68 44 75  tic With *withDu
aad0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  p(sqlite3 *db, W
aae0: 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68 20  ith *p){.  With 
aaf0: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
ab00: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
ab10: 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20  3_int64 nByte = 
ab20: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a  sizeof(*p) + siz
ab30: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
ab40: 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20  p->nCte-1);.    
ab50: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  pRet = sqlite3Db
ab60: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
ab70: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
ab80: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Ret ){.      int
ab90: 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   i;.      pRet->
aba0: 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a  nCte = p->nCte;.
abb0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
abc0: 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
abd0: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
abe0: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
abf0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
ac00: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  , p->a[i].pSelec
ac10: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 0);.        p
ac20: 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20  Ret->a[i].pCols 
ac30: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
ac40: 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  tDup(db, p->a[i]
ac50: 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20  .pCols, 0);.    
ac60: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a      pRet->a[i].z
ac70: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
ac80: 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  StrDup(db, p->a[
ac90: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
aca0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
acb0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
acc0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74  lse.# define wit
acd0: 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64  hDup(x,y) 0.#end
ace0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
acf0: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
ad00: 4e 43 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 61 74  NC./*.** The gat
ad10: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
ad20: 28 29 20 70 72 6f 63 65 64 75 72 65 20 61 6e 64  () procedure and
ad30: 20 69 74 73 20 68 65 6c 70 65 72 20 72 6f 75 74   its helper rout
ad40: 69 6e 65 0a 2a 2a 20 67 61 74 68 65 72 53 65 6c  ine.** gatherSel
ad50: 65 63 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62 61  ectWindowsCallba
ad60: 63 6b 28 29 20 61 72 65 20 75 73 65 64 20 74 6f  ck() are used to
ad70: 20 73 63 61 6e 20 61 6c 6c 20 74 68 65 20 65 78   scan all the ex
ad80: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 6e 20  pressions.** an 
ad90: 61 20 6e 65 77 6c 79 20 64 75 70 6c 69 63 61 74  a newly duplicat
ada0: 65 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ed SELECT statem
adb0: 65 6e 74 20 61 6e 64 20 67 61 74 68 65 72 20 61  ent and gather a
adc0: 6c 6c 20 6f 66 20 74 68 65 20 57 69 6e 64 6f 77  ll of the Window
add0: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 66 6f 75 6e  .** objects foun
ade0: 64 20 74 68 65 72 65 2c 20 61 73 73 65 6d 62 6c  d there, assembl
adf0: 69 6e 67 20 74 68 65 6d 20 6f 6e 74 6f 20 74 68  ing them onto th
ae00: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 61 74  e linked list at
ae10: 20 53 65 6c 65 63 74 2d 3e 70 57 69 6e 2e 0a 2a   Select->pWin..*
ae20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 61 74  /.static int gat
ae30: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
ae40: 43 61 6c 6c 62 61 63 6b 28 57 61 6c 6b 65 72 20  Callback(Walker 
ae50: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
ae60: 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
ae70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
ae80: 54 49 4f 4e 20 26 26 20 45 78 70 72 48 61 73 50  TION && ExprHasP
ae90: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
aea0: 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20  P_WinFunc) ){.  
aeb0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
aec0: 74 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  t = pWalker->u.p
aed0: 53 65 6c 65 63 74 3b 0a 20 20 20 20 57 69 6e 64  Select;.    Wind
aee0: 6f 77 20 2a 70 57 69 6e 20 3d 20 70 45 78 70 72  ow *pWin = pExpr
aef0: 2d 3e 79 2e 70 57 69 6e 3b 0a 20 20 20 20 61 73  ->y.pWin;.    as
af00: 73 65 72 74 28 20 70 57 69 6e 20 29 3b 0a 20 20  sert( pWin );.  
af10: 20 20 61 73 73 65 72 74 28 20 49 73 57 69 6e 64    assert( IsWind
af20: 6f 77 46 75 6e 63 28 70 45 78 70 72 29 20 29 3b  owFunc(pExpr) );
af30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69  .    assert( pWi
af40: 6e 2d 3e 70 70 54 68 69 73 3d 3d 30 20 29 3b 0a  n->ppThis==0 );.
af50: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d      if( pSelect-
af60: 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 70  >pWin ){.      p
af70: 53 65 6c 65 63 74 2d 3e 70 57 69 6e 2d 3e 70 70  Select->pWin->pp
af80: 54 68 69 73 20 3d 20 26 70 57 69 6e 2d 3e 70 4e  This = &pWin->pN
af90: 65 78 74 57 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  extWin;.    }.  
afa0: 20 20 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e    pWin->pNextWin
afb0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 57 69 6e   = pSelect->pWin
afc0: 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 70 54 68  ;.    pWin->ppTh
afd0: 69 73 20 3d 20 26 70 53 65 6c 65 63 74 2d 3e 70  is = &pSelect->p
afe0: 57 69 6e 3b 0a 20 20 20 20 70 53 65 6c 65 63 74  Win;.    pSelect
aff0: 2d 3e 70 57 69 6e 20 3d 20 70 57 69 6e 3b 0a 20  ->pWin = pWin;. 
b000: 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
b010: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
b020: 69 63 20 69 6e 74 20 67 61 74 68 65 72 53 65 6c  ic int gatherSel
b030: 65 63 74 57 69 6e 64 6f 77 73 53 65 6c 65 63 74  ectWindowsSelect
b040: 43 61 6c 6c 62 61 63 6b 28 57 61 6c 6b 65 72 20  Callback(Walker 
b050: 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
b060: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
b070: 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65  ==pWalker->u.pSe
b080: 6c 65 63 74 20 3f 20 57 52 43 5f 43 6f 6e 74 69  lect ? WRC_Conti
b090: 6e 75 65 20 3a 20 57 52 43 5f 50 72 75 6e 65 3b  nue : WRC_Prune;
b0a0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  .}.static void g
b0b0: 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f  atherSelectWindo
b0c0: 77 73 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ws(Select *p){. 
b0d0: 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
b0e0: 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 67  ExprCallback = g
b0f0: 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f  atherSelectWindo
b100: 77 73 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 77 2e  wsCallback;.  w.
b110: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
b120: 3d 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69  = gatherSelectWi
b130: 6e 64 6f 77 73 53 65 6c 65 63 74 43 61 6c 6c 62  ndowsSelectCallb
b140: 61 63 6b 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ack;.  w.xSelect
b150: 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20  Callback2 = 0;. 
b160: 20 77 2e 70 50 61 72 73 65 20 3d 20 30 3b 0a 20   w.pParse = 0;. 
b170: 20 77 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20 70   w.u.pSelect = p
b180: 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
b190: 65 6c 65 63 74 28 26 77 2c 20 70 29 3b 0a 7d 0a  elect(&w, p);.}.
b1a0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
b1b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f  he following gro
b1c0: 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d  up of routines m
b1d0: 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20  ake deep copies 
b1e0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  of expressions,.
b1f0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
b200: 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61  sts, ID lists, a
b210: 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd select statem
b220: 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65  ents.  The copie
b230: 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65  s can.** be dele
b240: 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61  ted (by being pa
b250: 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65  ssed to their re
b260: 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65  spective ...Dele
b270: 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a  te() routines).*
b280: 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74  * without effect
b290: 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ing the original
b2a0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70  s..**.** The exp
b2b0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44  ression list, ID
b2c0: 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73  , and source lis
b2d0: 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c  ts return by sql
b2e0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
b2f0: 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c  ),.** sqlite3IdL
b300: 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71  istDup(), and sq
b310: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
b320: 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72  ) can not be fur
b330: 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a  ther expanded .*
b340: 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  * by subsequent 
b350: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a  calls to sqlite*
b360: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75  ListAppend() rou
b370: 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  tines..**.** Any
b380: 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65   tables that the
b390: 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70   SrcList might p
b3a0: 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20  oint to are not 
b3b0: 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a  duplicated..**.*
b3c0: 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 72 61  * The flags para
b3d0: 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61  meter contains a
b3e0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
b3f0: 74 68 65 20 45 58 50 52 44 55 50 5f 58 58 58 20  the EXPRDUP_XXX 
b400: 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65  flags..** If the
b410: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
b420: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
b430: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
b440: 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a  returned is a.**
b450: 20 74 72 75 6e 63 61 74 65 64 20 76 65 72 73 69   truncated versi
b460: 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20  on of the usual 
b470: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 74  Expr structure t
b480: 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  hat will be stor
b490: 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66  ed as.** part of
b4a0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
b4b0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
b4c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
b4d0: 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  hema..*/.Expr *s
b4e0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 73 71  qlite3ExprDup(sq
b4f0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
b500: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
b510: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
b520: 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50  =0 || flags==EXP
b530: 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20  RDUP_REDUCE );. 
b540: 20 72 65 74 75 72 6e 20 70 20 3f 20 65 78 70 72   return p ? expr
b550: 44 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73  Dup(db, p, flags
b560: 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a 45 78 70 72  , 0) : 0;.}.Expr
b570: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70  List *sqlite3Exp
b580: 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  rListDup(sqlite3
b590: 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a   *db, ExprList *
b5a0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
b5b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b   ExprList *pNew;
b5c0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
b5d0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20  st_item *pItem, 
b5e0: 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74  *pOldItem;.  int
b5f0: 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 50 72 69   i;.  Expr *pPri
b600: 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20 30 3b  orSelectCol = 0;
b610: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
b620: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
b630: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
b640: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
b650: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 71 6c  locRawNN(db, sql
b660: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
b670: 28 64 62 2c 20 70 29 29 3b 0a 20 20 69 66 28 20  (db, p));.  if( 
b680: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
b690: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70   0;.  pNew->nExp
b6a0: 72 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20  r = p->nExpr;.  
b6b0: 70 49 74 65 6d 20 3d 20 70 4e 65 77 2d 3e 61 3b  pItem = pNew->a;
b6c0: 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d  .  pOldItem = p-
b6d0: 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  >a;.  for(i=0; i
b6e0: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  <p->nExpr; i++, 
b6f0: 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65  pItem++, pOldIte
b700: 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
b710: 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49  pOldExpr = pOldI
b720: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
b730: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
b740: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
b750: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b760: 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20  p(db, pOldExpr, 
b770: 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
b780: 70 4f 6c 64 45 78 70 72 20 0a 20 20 20 20 20 26  pOldExpr .     &
b790: 26 20 70 4f 6c 64 45 78 70 72 2d 3e 6f 70 3d 3d  & pOldExpr->op==
b7a0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
b7b0: 0a 20 20 20 20 20 26 26 20 28 70 4e 65 77 45 78  .     && (pNewEx
b7c0: 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  pr = pItem->pExp
b7d0: 72 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  r)!=0 .    ){.  
b7e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
b7f0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30  Expr->iColumn==0
b800: 20 7c 7c 20 69 3e 30 20 29 3b 0a 20 20 20 20 20   || i>0 );.     
b810: 20 69 66 28 20 70 4e 65 77 45 78 70 72 2d 3e 69   if( pNewExpr->i
b820: 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20  Column==0 ){.   
b830: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
b840: 64 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 70 4f  dExpr->pLeft==pO
b850: 6c 64 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29  ldExpr->pRight )
b860: 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72  ;.        pPrior
b870: 53 65 6c 65 63 74 43 6f 6c 20 3d 20 70 4e 65 77  SelectCol = pNew
b880: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4e  Expr->pLeft = pN
b890: 65 77 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  ewExpr->pRight;.
b8a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b8b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30       assert( i>0
b8c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
b8d0: 72 74 28 20 70 49 74 65 6d 5b 2d 31 5d 2e 70 45  rt( pItem[-1].pE
b8e0: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
b8f0: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78    assert( pNewEx
b900: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 74  pr->iColumn==pIt
b910: 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 69 43  em[-1].pExpr->iC
b920: 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20 20 20 20 20  olumn+1 );.     
b930: 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
b940: 72 53 65 6c 65 63 74 43 6f 6c 3d 3d 70 49 74 65  rSelectCol==pIte
b950: 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 70 4c 65  m[-1].pExpr->pLe
b960: 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ft );.        pN
b970: 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ewExpr->pLeft = 
b980: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3b  pPriorSelectCol;
b990: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b9a0: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
b9b0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b9c0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b9d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65  zName);.    pIte
b9e0: 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  m->zSpan = sqlit
b9f0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
ba00: 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  OldItem->zSpan);
ba10: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74  .    pItem->sort
ba20: 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d  Order = pOldItem
ba30: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
ba40: 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30   pItem->done = 0
ba50: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70  ;.    pItem->bSp
ba60: 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74  anIsTab = pOldIt
ba70: 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a  em->bSpanIsTab;.
ba80: 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74      pItem->bSort
ba90: 65 72 52 65 66 20 3d 20 70 4f 6c 64 49 74 65 6d  erRef = pOldItem
baa0: 2d 3e 62 53 6f 72 74 65 72 52 65 66 3b 0a 20 20  ->bSorterRef;.  
bab0: 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c    pItem->u = pOl
bac0: 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20  dItem->u;.  }.  
bad0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
bae0: 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73  /*.** If cursors
baf0: 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77  , triggers, view
bb00: 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
bb10: 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64   are all omitted
bb20: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69   from.** the bui
bb30: 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66  ld, then none of
bb40: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
bb50: 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20  outines, except 
bb60: 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53  for .** sqlite3S
bb70: 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20  electDup(), can 
bb80: 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74  be called. sqlit
bb90: 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73  e3SelectDup() is
bba0: 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61   sometimes.** ca
bbb0: 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c  lled with a NULL
bbc0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69   argument..*/.#i
bbd0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
bbe0: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
bbf0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bc00: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a  OMIT_TRIGGER) \.
bc10: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
bc20: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
bc30: 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  Y).SrcList *sqli
bc40: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71  te3SrcListDup(sq
bc50: 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69  lite3 *db, SrcLi
bc60: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
bc70: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  ){.  SrcList *pN
bc80: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
bc90: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65  nt nByte;.  asse
bca0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
bcb0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
bcc0: 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   0;.  nByte = si
bcd0: 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e  zeof(*p) + (p->n
bce0: 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70  Src>0 ? sizeof(p
bcf0: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53  ->a[0]) * (p->nS
bd00: 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e  rc-1) : 0);.  pN
bd10: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
bd20: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42  llocRawNN(db, nB
bd30: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  yte );.  if( pNe
bd40: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
bd50: 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20  .  pNew->nSrc = 
bd60: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
bd70: 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->nSrc;.  for(i=
bd80: 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b  0; i<p->nSrc; i+
bd90: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
bda0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  rcList_item *pNe
bdb0: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
bdc0: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
bdd0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  SrcList_item *pO
bde0: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
bdf0: 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
be00: 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ab;.    pNewItem
be10: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64  ->pSchema = pOld
be20: 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20  Item->pSchema;. 
be30: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61     pNewItem->zDa
be40: 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
be50: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
be60: 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  dItem->zDatabase
be70: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
be80: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
be90: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
bea0: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
beb0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c     pNewItem->zAl
bec0: 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ias = sqlite3DbS
bed0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
bee0: 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
bef0: 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20 3d 20   pNewItem->fg = 
bf00: 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a 20 20  pOldItem->fg;.  
bf10: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72    pNewItem->iCur
bf20: 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sor = pOldItem->
bf30: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65  iCursor;.    pNe
bf40: 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  wItem->addrFillS
bf50: 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61  ub = pOldItem->a
bf60: 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20  ddrFillSub;.    
bf70: 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65 74  pNewItem->regRet
bf80: 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  urn = pOldItem->
bf90: 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 69  regReturn;.    i
bfa0: 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e  f( pNewItem->fg.
bfb0: 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20  isIndexedBy ){. 
bfc0: 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75       pNewItem->u
bfd0: 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73  1.zIndexedBy = s
bfe0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
bff0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e  b, pOldItem->u1.
c000: 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20  zIndexedBy);.   
c010: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
c020: 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 4f 6c 64  >pIBIndex = pOld
c030: 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 3b 0a  Item->pIBIndex;.
c040: 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d      if( pNewItem
c050: 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
c060: 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d  {.      pNewItem
c070: 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20  ->u1.pFuncArg = 
c080: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c090: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
c0a0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 70  , pOldItem->u1.p
c0b0: 46 75 6e 63 41 72 67 2c 20 66 6c 61 67 73 29 3b  FuncArg, flags);
c0c0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20  .    }.    pTab 
c0d0: 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62  = pNewItem->pTab
c0e0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61   = pOldItem->pTa
c0f0: 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  b;.    if( pTab 
c100: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  ){.      pTab->n
c110: 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  TabRef++;.    }.
c120: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
c130: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
c140: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c  electDup(db, pOl
c150: 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  dItem->pSelect, 
c160: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c170: 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69  Item->pOn = sqli
c180: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
c190: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c  OldItem->pOn, fl
c1a0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
c1b0: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
c1c0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
c1d0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
c1e0: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
c1f0: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
c200: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
c210: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
c220: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
c230: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
c240: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
c250: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
c260: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
c270: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
c280: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
c290: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
c2a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
c2b0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
c2c0: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
c2d0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
c2e0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
c2f0: 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70  Id = p->nId;.  p
c300: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  New->a = sqlite3
c310: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
c320: 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28  , p->nId*sizeof(
c330: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
c340: 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a  ( pNew->a==0 ){.
c350: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
c360: 65 4e 4e 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  eNN(db, pNew);. 
c370: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c380: 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  /* Note that 
c390: 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65  because the size
c3a0: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   of the allocati
c3b0: 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73  on for p->a[] is
c3c0: 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73   not.  ** necess
c3d0: 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66  arily a power of
c3e0: 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c   two, sqlite3IdL
c3f0: 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20  istAppend() may 
c400: 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20  not be called.  
c410: 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63  ** on the duplic
c420: 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74  ate created by t
c430: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  his function. */
c440: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
c450: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
c460: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
c470: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
c480: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
c490: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
c4a0: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
c4b0: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65  p->a[i];.    pNe
c4c0: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
c4d0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c4e0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
c4f0: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
c500: 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65  m->idx = pOldIte
c510: 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65  m->idx;.  }.  re
c520: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c  turn pNew;.}.Sel
c530: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
c540: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
c550: 62 2c 20 53 65 6c 65 63 74 20 2a 70 44 75 70 2c  b, Select *pDup,
c560: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
c570: 65 6c 65 63 74 20 2a 70 52 65 74 20 3d 20 30 3b  elect *pRet = 0;
c580: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 78 74  .  Select *pNext
c590: 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a   = 0;.  Select *
c5a0: 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a 20 20 53  *pp = &pRet;.  S
c5b0: 65 6c 65 63 74 20 2a 70 3b 0a 0a 20 20 61 73 73  elect *p;..  ass
c5c0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
c5d0: 66 6f 72 28 70 3d 70 44 75 70 3b 20 70 3b 20 70  for(p=pDup; p; p
c5e0: 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  =p->pPrior){.   
c5f0: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 20 3d 20   Select *pNew = 
c600: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
c610: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
c620: 2a 70 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  *p) );.    if( p
c630: 4e 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  New==0 ) break;.
c640: 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74      pNew->pEList
c650: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
c660: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
c670: 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ist, flags);.   
c680: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71   pNew->pSrc = sq
c690: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
c6a0: 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61  db, p->pSrc, fla
c6b0: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
c6c0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
c6d0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  xprDup(db, p->pW
c6e0: 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  here, flags);.  
c6f0: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
c700: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
c710: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72  stDup(db, p->pGr
c720: 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20  oupBy, flags);. 
c730: 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67     pNew->pHaving
c740: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
c750: 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  p(db, p->pHaving
c760: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c770: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  ew->pOrderBy = s
c780: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
c790: 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  p(db, p->pOrderB
c7a0: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  y, flags);.    p
c7b0: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
c7c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  .    pNew->pNext
c7d0: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 70 4e   = pNext;.    pN
c7e0: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ew->pPrior = 0;.
c7f0: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74      pNew->pLimit
c800: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
c810: 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  p(db, p->pLimit,
c820: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c830: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
c840: 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74     pNew->iOffset
c850: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
c860: 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65  selFlags = p->se
c870: 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65  lFlags & ~SF_Use
c880: 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
c890: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
c8a0: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[0] = -1;.    
c8b0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
c8c0: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[1] = -1;.    
c8d0: 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pNew->nSelectRow
c8e0: 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   = p->nSelectRow
c8f0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 74  ;.    pNew->pWit
c900: 68 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c 20  h = withDup(db, 
c910: 70 2d 3e 70 57 69 74 68 29 3b 0a 23 69 66 6e 64  p->pWith);.#ifnd
c920: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
c930: 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 70 4e  INDOWFUNC.    pN
c940: 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a 20 20  ew->pWin = 0;.  
c950: 20 20 70 4e 65 77 2d 3e 70 57 69 6e 44 65 66 6e    pNew->pWinDefn
c960: 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77   = sqlite3Window
c970: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
c980: 57 69 6e 44 65 66 6e 29 3b 0a 20 20 20 20 69 66  WinDefn);.    if
c990: 28 20 70 2d 3e 70 57 69 6e 20 29 20 67 61 74 68  ( p->pWin ) gath
c9a0: 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 28  erSelectWindows(
c9b0: 70 4e 65 77 29 3b 0a 23 65 6e 64 69 66 0a 20 20  pNew);.#endif.  
c9c0: 20 20 70 4e 65 77 2d 3e 73 65 6c 49 64 20 3d 20    pNew->selId = 
c9d0: 70 2d 3e 73 65 6c 49 64 3b 0a 20 20 20 20 2a 70  p->selId;.    *p
c9e0: 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 70  p = pNew;.    pp
c9f0: 20 3d 20 26 70 4e 65 77 2d 3e 70 50 72 69 6f 72   = &pNew->pPrior
ca00: 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 4e  ;.    pNext = pN
ca10: 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ew;.  }..  retur
ca20: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a  n pRet;.}.#else.
ca30: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
ca40: 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33  electDup(sqlite3
ca50: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c   *db, Select *p,
ca60: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
ca70: 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
ca80: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
ca90: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
caa0: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
cab0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65   the end of an e
cac0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
cad0: 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20   If pList is.** 
cae0: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
caf0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
cb00: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  w expression lis
cb10: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 4c 69  t..**.** The pLi
cb20: 73 74 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  st argument must
cb30: 20 62 65 20 65 69 74 68 65 72 20 4e 55 4c 4c 20   be either NULL 
cb40: 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  or a pointer to 
cb50: 61 6e 20 45 78 70 72 4c 69 73 74 0a 2a 2a 20 6f  an ExprList.** o
cb60: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 70  btained from a p
cb70: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
cb80: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
cb90: 6e 64 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74  nd().  This rout
cba0: 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e 6f 74 20 62  ine.** may not b
cbb0: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 45  e used with an E
cbc0: 78 70 72 4c 69 73 74 20 6f 62 74 61 69 6e 65 64  xprList obtained
cbd0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 70   from sqlite3Exp
cbe0: 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a 20 52  rListDup()..** R
cbf0: 65 61 73 6f 6e 3a 20 20 54 68 69 73 20 72 6f 75  eason:  This rou
cc00: 74 69 6e 65 20 61 73 73 75 6d 65 73 20 74 68 61  tine assumes tha
cc10: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
cc20: 73 6c 6f 74 73 20 69 6e 20 70 4c 69 73 74 2d 3e  slots in pList->
cc30: 61 5b 5d 0a 2a 2a 20 69 73 20 61 20 70 6f 77 65  a[].** is a powe
cc40: 72 20 6f 66 20 74 77 6f 2e 20 20 54 68 61 74 20  r of two.  That 
cc50: 69 73 20 74 72 75 65 20 66 6f 72 20 73 71 6c 69  is true for sqli
cc60: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
cc70: 64 28 29 20 72 65 74 75 72 6e 73 0a 2a 2a 20 62  d() returns.** b
cc80: 75 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ut is not necess
cc90: 61 72 69 6c 79 20 74 72 75 65 20 66 72 6f 6d 20  arily true from 
cca0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
ccb0: 20 6f 66 20 73 71 6c 69 74 65 33 45 78 70 72 4c   of sqlite3ExprL
ccc0: 69 73 74 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20  istDup()..**.** 
ccd0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
cce0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
ccf0: 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20  urs, the entire 
cd00: 6c 69 73 74 20 69 73 20 66 72 65 65 64 20 61 6e  list is freed an
cd10: 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74  d.** NULL is ret
cd20: 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e  urned.  If non-N
cd30: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ULL is returned,
cd40: 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
cd50: 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74  anteed.** that t
cd60: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73  he new entry was
cd70: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70   successfully ap
cd80: 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c  pended..*/.ExprL
cd90: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
cda0: 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61  ListAppend(.  Pa
cdb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
cdc0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
cdd0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
cde0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
cdf0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
ce00: 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64   which to append
ce10: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
ce20: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce40: 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  Expression to be
ce50: 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74   appended. Might
ce60: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
ce70: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
ce80: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
ce90: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
cea0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
ceb0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
cec0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
ced0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
cee0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
cef0: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c  db, sizeof(ExprL
cf00: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
cf10: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
cf20: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
cf30: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
cf40: 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20 7d 65 6c  nExpr = 0;.  }el
cf50: 73 65 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e  se if( (pList->n
cf60: 45 78 70 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e  Expr & (pList->n
cf70: 45 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20  Expr-1))==0 ){. 
cf80: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
cf90: 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  w;.    pNew = sq
cfa0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
cfb0: 62 2c 20 70 4c 69 73 74 2c 20 0a 20 20 20 20 20  b, pList, .     
cfc0: 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73      sizeof(*pLis
cfd0: 74 29 2b 28 32 2a 28 73 71 6c 69 74 65 33 5f 69  t)+(2*(sqlite3_i
cfe0: 6e 74 36 34 29 70 4c 69 73 74 2d 3e 6e 45 78 70  nt64)pList->nExp
cff0: 72 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73  r-1)*sizeof(pLis
d000: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
d010: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
d020: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
d030: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
d040: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
d050: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
d060: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
d070: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
d080: 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70 72  etof(struct Expr
d090: 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29  List_item,zName)
d0a0: 3d 3d 73 69 7a 65 6f 66 28 70 49 74 65 6d 2d 3e  ==sizeof(pItem->
d0b0: 70 45 78 70 72 29 20 29 3b 0a 20 20 61 73 73 65  pExpr) );.  asse
d0c0: 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73 74 72  rt( offsetof(str
d0d0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
d0e0: 6d 2c 70 45 78 70 72 29 3d 3d 30 20 29 3b 0a 20  m,pExpr)==0 );. 
d0f0: 20 6d 65 6d 73 65 74 28 26 70 49 74 65 6d 2d 3e   memset(&pItem->
d100: 7a 4e 61 6d 65 2c 30 2c 73 69 7a 65 6f 66 28 2a  zName,0,sizeof(*
d110: 70 49 74 65 6d 29 2d 6f 66 66 73 65 74 6f 66 28  pItem)-offsetof(
d120: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
d130: 69 74 65 6d 2c 7a 4e 61 6d 65 29 29 3b 0a 20 20  item,zName));.  
d140: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
d150: 45 78 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 70  Expr;.  return p
d160: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
d170: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
d180: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
d190: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
d1a0: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
d1b0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
d1c0: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
d1d0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
d1e0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
d1f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
d200: 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78  pColumns and pEx
d210: 70 72 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72  pr form a vector
d220: 20 61 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63   assignment whic
d230: 68 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  h is part of the
d240: 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f   SET.** clause o
d250: 66 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  f an UPDATE stat
d260: 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69  ement.  Like thi
d270: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
d280: 28 61 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31  (a,b,c) = (expr1
d290: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
d2a0: 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20   Or:    (a,b,c) 
d2b0: 3d 20 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20  = (SELECT x,y,z 
d2c0: 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  FROM ....).**.**
d2d0: 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f   For each term o
d2e0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 61 73 73  f the vector ass
d2f0: 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20  ignment, append 
d300: 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74  new entries to t
d310: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
d320: 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e   list pList.  In
d330: 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 73   the case of a s
d340: 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 52  ubquery on the R
d350: 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b  HS, append.** TK
d360: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65  _SELECT_COLUMN e
d370: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45  xpressions..*/.E
d380: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
d390: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65  ExprListAppendVe
d3a0: 63 74 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  ctor(.  Parse *p
d3b0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
d3c0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
d3d0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
d3e0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  *pList,       /*
d3f0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
d400: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
d410: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c  be NULL */.  IdL
d420: 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20  ist *pColumns,  
d430: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e      /* List of n
d440: 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74  ames of LHS of t
d450: 68 65 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f  he assignment */
d460: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
d470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63            /* Vec
d480: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74  tor expression t
d490: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
d4a0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
d4b0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
d4c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
d4d0: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b   int n;.  int i;
d4e0: 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
d4f0: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
d500: 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70  Expr : 0;.  /* p
d510: 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79  Columns can only
d520: 20 62 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20   be NULL due to 
d530: 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f  an OOM but an OO
d540: 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a  M will cause an.
d550: 20 20 2a 2a 20 65 78 69 74 20 70 72 69 6f 72 20    ** exit prior 
d560: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
d570: 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f  being invoked */
d580: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 6f  .  if( NEVER(pCo
d590: 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f  lumns==0) ) goto
d5a0: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
d5b0: 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70  rror;.  if( pExp
d5c0: 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74  r==0 ) goto vect
d5d0: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
d5e0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48  ..  /* If the RH
d5f0: 53 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20 74  S is a vector, t
d600: 68 65 6e 20 77 65 20 63 61 6e 20 69 6d 6d 65 64  hen we can immed
d610: 69 61 74 65 6c 79 20 63 68 65 63 6b 20 74 6f 20  iately check to 
d620: 73 65 65 20 74 68 61 74 20 0a 20 20 2a 2a 20 74  see that .  ** t
d630: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 52  he size of the R
d640: 48 53 20 61 6e 64 20 4c 48 53 20 6d 61 74 63 68  HS and LHS match
d650: 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 52 48  .  But if the RH
d660: 53 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 0a  S is a SELECT, .
d670: 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 73 20 28    ** wildcards (
d680: 22 2a 22 29 20 69 6e 20 74 68 65 20 72 65 73 75  "*") in the resu
d690: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
d6a0: 4c 45 43 54 20 6d 75 73 74 20 62 65 20 65 78 70  LECT must be exp
d6b0: 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 20 20 2a  anded before.  *
d6c0: 2a 20 77 65 20 63 61 6e 20 64 6f 20 74 68 65 20  * we can do the 
d6d0: 73 69 7a 65 20 63 68 65 63 6b 2c 20 73 6f 20 64  size check, so d
d6e0: 65 66 65 72 20 74 68 65 20 73 69 7a 65 20 63 68  efer the size ch
d6f0: 65 63 6b 20 75 6e 74 69 6c 20 63 6f 64 65 20 67  eck until code g
d700: 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  eneration..  */.
d710: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
d720: 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 43  =TK_SELECT && pC
d730: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d 28 6e 3d  olumns->nId!=(n=
d740: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
d750: 72 53 69 7a 65 28 70 45 78 70 72 29 29 20 29 7b  rSize(pExpr)) ){
d760: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
d770: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64  rMsg(pParse, "%d
d780: 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65   columns assigne
d790: 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20  d %d values",.  
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c    pColumns->nId,
d7c0: 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65   n);.    goto ve
d7d0: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
d7e0: 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  r;.  }..  for(i=
d7f0: 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73 2d 3e 6e  0; i<pColumns->n
d800: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  Id; i++){.    Ex
d810: 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20 73  pr *pSubExpr = s
d820: 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63  qlite3ExprForVec
d830: 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65 2c  torField(pParse,
d840: 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20 20   pExpr, i);.    
d850: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
d860: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
d870: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53 75  arse, pList, pSu
d880: 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  bExpr);.    if( 
d890: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61  pList ){.      a
d8a0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
d8b0: 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31 20  xpr==iFirst+i+1 
d8c0: 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  );.      pList->
d8d0: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
d8e0: 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75 6d  ].zName = pColum
d8f0: 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  ns->a[i].zName;.
d900: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e        pColumns->
d910: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[i].zName = 0;.
d920: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
d930: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
d940: 65 64 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d  ed && pExpr->op=
d950: 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 41 4c  =TK_SELECT && AL
d960: 57 41 59 53 28 70 4c 69 73 74 21 3d 30 29 20 29  WAYS(pList!=0) )
d970: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 46 69 72  {.    Expr *pFir
d980: 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 46  st = pList->a[iF
d990: 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a 20 20 20  irst].pExpr;.   
d9a0: 20 61 73 73 65 72 74 28 20 70 46 69 72 73 74 21   assert( pFirst!
d9b0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d9c0: 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d 3d 54 4b  ( pFirst->op==TK
d9d0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
d9e0: 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53  ;.     .    /* S
d9f0: 74 6f 72 65 20 74 68 65 20 53 45 4c 45 43 54 20  tore the SELECT 
da00: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 70 52 69  statement in pRi
da10: 67 68 74 20 73 6f 20 69 74 20 77 69 6c 6c 20 62  ght so it will b
da20: 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 0a 20  e deleted when. 
da30: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70     ** sqlite3Exp
da40: 72 4c 69 73 74 44 65 6c 65 74 65 28 29 20 69 73  rListDelete() is
da50: 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 70   called */.    p
da60: 46 69 72 73 74 2d 3e 70 52 69 67 68 74 20 3d 20  First->pRight = 
da70: 70 45 78 70 72 3b 0a 20 20 20 20 70 45 78 70 72  pExpr;.    pExpr
da80: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65   = 0;..    /* Re
da90: 6d 65 6d 62 65 72 20 74 68 65 20 73 69 7a 65 20  member the size 
daa0: 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 69 54  of the LHS in iT
dab0: 61 62 6c 65 20 73 6f 20 74 68 61 74 20 77 65 20  able so that we 
dac0: 63 61 6e 20 63 68 65 63 6b 20 74 68 61 74 0a 20  can check that. 
dad0: 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20 61 6e     ** the RHS an
dae0: 64 20 4c 48 53 20 73 69 7a 65 73 20 6d 61 74 63  d LHS sizes matc
daf0: 68 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65  h during code ge
db00: 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  neration. */.   
db10: 20 70 46 69 72 73 74 2d 3e 69 54 61 62 6c 65 20   pFirst->iTable 
db20: 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b  = pColumns->nId;
db30: 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f 61 70 70  .  }..vector_app
db40: 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c  end_error:.  sql
db50: 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41 6e 64  ite3ExprUnmapAnd
db60: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70  Delete(pParse, p
db70: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
db80: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
db90: 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65   pColumns);.  re
dba0: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
dbb0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72  *.** Set the sor
dbc0: 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  t order for the 
dbd0: 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20  last element on 
dbe0: 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69  the given ExprLi
dbf0: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
dc00: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f  te3ExprListSetSo
dc10: 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74  rtOrder(ExprList
dc20: 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72   *p, int iSortOr
dc30: 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  der){.  if( p==0
dc40: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
dc50: 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55  ert( SQLITE_SO_U
dc60: 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51  NDEFINED<0 && SQ
dc70: 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26  LITE_SO_ASC>=0 &
dc80: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  & SQLITE_SO_DESC
dc90: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
dca0: 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  p->nExpr>0 );.  
dcb0: 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30  if( iSortOrder<0
dcc0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
dcd0: 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
dce0: 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49  .sortOrder==SQLI
dcf0: 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20  TE_SO_ASC );.   
dd00: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
dd10: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
dd20: 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29  sortOrder = (u8)
dd30: 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f  iSortOrder;.}../
dd40: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
dd50: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  rList.a[].zName 
dd60: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
dd70: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
dd80: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
dd90: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
dda0: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
ddb0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
ddc0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
ddd0: 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20  ror.  But pName 
dde0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
ddf0: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
de00: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
de10: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
de20: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
de30: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
de40: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
de50: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
de60: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
de70: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
de80: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
de90: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
dea0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
deb0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
dec0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
ded0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
dee0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
def0: 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65   Name to be adde
df00: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  d */.  int dequo
df10: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
df20: 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20  * True to cause 
df30: 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64  the name to be d
df40: 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  equoted */.){.  
df50: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
df60: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
df70: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
df80: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
df90: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
dfa0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
dfb0: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
dfc0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
dfd0: 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c  .    pItem = &pL
dfe0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
dff0: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
e000: 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  rt( pItem->zName
e010: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  ==0 );.    pItem
e020: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
e030: 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73  3DbStrNDup(pPars
e040: 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c  e->db, pName->z,
e050: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
e060: 69 66 28 20 64 65 71 75 6f 74 65 20 29 20 73 71  if( dequote ) sq
e070: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74  lite3Dequote(pIt
e080: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
e090: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
e0a0: 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71  JECT ){.      sq
e0b0: 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
e0c0: 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69  Map(pParse, (voi
e0d0: 64 2a 29 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  d*)pItem->zName,
e0e0: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   pName);.    }. 
e0f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
e100: 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  the ExprList.a[]
e110: 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f  .zSpan element o
e120: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
e130: 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a  tly added item.*
e140: 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  * on the express
e150: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
e160: 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e  pList might be N
e170: 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ULL following an
e180: 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74   OOM error.  But
e190: 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65   pSpan should ne
e1a0: 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20  ver be.** NULL. 
e1b0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
e1c0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
e1d0: 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  he pParse->db->m
e1e0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
e1f0: 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76  .** is set..*/.v
e200: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
e210: 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61  istSetSpan(.  Pa
e220: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e230: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
e240: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
e250: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
e260: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
e270: 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68   which to add th
e280: 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e  e span. */.  con
e290: 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c  st char *zStart,
e2a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
e2b0: 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 20 20 63   the span */.  c
e2c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20  onst char *zEnd 
e2d0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
e2e0: 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a   the span */.){.
e2f0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e300: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
e310: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c  sert( pList!=0 |
e320: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
e330: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
e340: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
e350: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
e360: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74   *pItem = &pList
e370: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
e380: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
e390: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
e3a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
e3b0: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
e3c0: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
e3d0: 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  m->zSpan = sqlit
e3e0: 65 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20  e3DbSpanDup(db, 
e3f0: 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20  zStart, zEnd);. 
e400: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
e410: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
e420: 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69  st pEList contai
e430: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69  ns more than iLi
e440: 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a  mit elements,.**
e450: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
e460: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
e470: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
e480: 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c  e3ExprListCheckL
e490: 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a  ength(.  Parse *
e4a0: 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69  pParse,.  ExprLi
e4b0: 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f  st *pEList,.  co
e4c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63  nst char *zObjec
e4d0: 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20  t.){.  int mx = 
e4e0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
e4f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
e500: 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63  COLUMN];.  testc
e510: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
e520: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
e530: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
e540: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
e550: 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b  ->nExpr==mx+1 );
e560: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26  .  if( pEList &&
e570: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d   pEList->nExpr>m
e580: 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
e590: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e5a0: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
e5b0: 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65  ns in %s", zObje
e5c0: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ct);.  }.}../*.*
e5d0: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
e5e0: 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  re expression li
e5f0: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  st..*/.static SQ
e600: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
e610: 69 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74  id exprListDelet
e620: 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eNN(sqlite3 *db,
e630: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e640: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4c 69  ){.  int i = pLi
e650: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 74 72  st->nExpr;.  str
e660: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e670: 6d 20 2a 70 49 74 65 6d 20 3d 20 20 70 4c 69 73  m *pItem =  pLis
e680: 74 2d 3e 61 3b 0a 20 20 61 73 73 65 72 74 28 20  t->a;.  assert( 
e690: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
e6a0: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69  ;.  do{.    sqli
e6b0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
e6c0: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
e6d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
e6e0: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
e6f0: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
e700: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
e710: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
e720: 49 74 65 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  Item++;.  }while
e730: 28 20 2d 2d 69 3e 30 20 29 3b 0a 20 20 73 71 6c  ( --i>0 );.  sql
e740: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
e750: 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20   pList);.}.void 
e760: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
e770: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
e780: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
e790: 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  st){.  if( pList
e7a0: 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74   ) exprListDelet
e7b0: 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  eNN(db, pList);.
e7c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
e7d0: 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f  the bitwise-OR o
e7e0: 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73  f all Expr.flags
e7f0: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67   fields in the g
e800: 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74  iven.** ExprList
e810: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
e820: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f  ExprListFlags(co
e830: 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  nst ExprList *pL
e840: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
e850: 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 61 73   u32 m = 0;.  as
e860: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
e870: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
e880: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
e890: 29 7b 0a 20 20 20 20 20 45 78 70 72 20 2a 70 45  ){.     Expr *pE
e8a0: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
e8b0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 61 73  ].pExpr;.     as
e8c0: 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29  sert( pExpr!=0 )
e8d0: 3b 0a 20 20 20 20 20 6d 20 7c 3d 20 70 45 78 70  ;.     m |= pExp
e8e0: 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20  r->flags;.  }.  
e8f0: 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a  return m;.}../*.
e900: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 53 45 4c  ** This is a SEL
e910: 45 43 54 2d 6e 6f 64 65 20 63 61 6c 6c 62 61 63  ECT-node callbac
e920: 6b 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  k for the expres
e930: 73 69 6f 6e 20 77 61 6c 6b 65 72 20 74 68 61 74  sion walker that
e940: 0a 2a 2a 20 61 6c 77 61 79 73 20 22 66 61 69 6c  .** always "fail
e950: 73 22 2e 20 20 42 79 20 22 66 61 69 6c 22 20 69  s".  By "fail" i
e960: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 77 65 20  n this case, we 
e970: 6d 65 61 6e 20 73 65 74 0a 2a 2a 20 70 57 61 6c  mean set.** pWal
e980: 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 7a 65  ker->eCode to ze
e990: 72 6f 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a  ro and abort..**
e9a0: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63  .** This callbac
e9b0: 6b 20 69 73 20 75 73 65 64 20 62 79 20 6d 75 6c  k is used by mul
e9c0: 74 69 70 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  tiple expression
e9d0: 20 77 61 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74   walkers..*/.int
e9e0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
e9f0: 6c 6b 46 61 69 6c 28 57 61 6c 6b 65 72 20 2a 70  lkFail(Walker *p
ea00: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
ea10: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
ea20: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
ea30: 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72  Used);.  pWalker
ea40: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72  ->eCode = 0;.  r
ea50: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
ea60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
ea70: 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f   input expressio
ea80: 6e 20 69 73 20 61 6e 20 49 44 20 77 69 74 68 20  n is an ID with 
ea90: 74 68 65 20 6e 61 6d 65 20 22 74 72 75 65 22 20  the name "true" 
eaa0: 6f 72 20 22 66 61 6c 73 65 22 0a 2a 2a 20 74 68  or "false".** th
eab0: 65 6e 20 63 6f 6e 76 65 72 74 20 69 74 20 69 6e  en convert it in
eac0: 74 6f 20 61 6e 20 54 4b 5f 54 52 55 45 46 41 4c  to an TK_TRUEFAL
ead0: 53 45 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e  SE term.  Return
eae0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20   non-zero if.** 
eaf0: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 68  the conversion h
eb00: 61 70 70 65 6e 65 64 2c 20 61 6e 64 20 7a 65 72  appened, and zer
eb10: 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
eb20: 69 6f 6e 20 69 73 20 75 6e 61 6c 74 65 72 65 64  ion is unaltered
eb30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
eb40: 45 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73  ExprIdToTrueFals
eb50: 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  e(Expr *pExpr){.
eb60: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
eb70: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45  >op==TK_ID || pE
eb80: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  xpr->op==TK_STRI
eb90: 4e 47 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70  NG );.  if( !Exp
eba0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
ebb0: 70 72 2c 20 45 50 5f 51 75 6f 74 65 64 29 0a 20  pr, EP_Quoted). 
ebc0: 20 20 26 26 20 28 73 71 6c 69 74 65 33 53 74 72    && (sqlite3Str
ebd0: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
ebe0: 6f 6b 65 6e 2c 20 22 74 72 75 65 22 29 3d 3d 30  oken, "true")==0
ebf0: 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
ec00: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
ec10: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c 73  >u.zToken, "fals
ec20: 65 22 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20  e")==0).  ){.   
ec30: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
ec40: 54 52 55 45 46 41 4c 53 45 3b 0a 20 20 20 20 45  TRUEFALSE;.    E
ec50: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
ec60: 45 78 70 72 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  Expr, pExpr->u.z
ec70: 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 20 3f 20 45 50  Token[4]==0 ? EP
ec80: 5f 49 73 54 72 75 65 20 3a 20 45 50 5f 49 73 46  _IsTrue : EP_IsF
ec90: 61 6c 73 65 29 3b 0a 20 20 20 20 72 65 74 75 72  alse);.    retur
eca0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
ecb0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
ecc0: 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  e argument must 
ecd0: 62 65 20 61 20 54 4b 5f 54 52 55 45 46 41 4c 53  be a TK_TRUEFALS
ece0: 45 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 52 65  E Expr node.  Re
ecf0: 74 75 72 6e 20 31 20 69 66 20 69 74 20 69 73 20  turn 1 if it is 
ed00: 54 52 55 45 0a 2a 2a 20 61 6e 64 20 30 20 69 66  TRUE.** and 0 if
ed10: 20 69 74 20 69 73 20 46 41 4c 53 45 2e 0a 2a 2f   it is FALSE..*/
ed20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
ed30: 54 72 75 74 68 56 61 6c 75 65 28 63 6f 6e 73 74  TruthValue(const
ed40: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
ed50: 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
ed60: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
ed70: 28 45 78 70 72 2a 29 70 45 78 70 72 29 3b 0a 20  (Expr*)pExpr);. 
ed80: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
ed90: 6f 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45  op==TK_TRUEFALSE
eda0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
edb0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78  lite3StrICmp(pEx
edc0: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 74 72  pr->u.zToken,"tr
edd0: 75 65 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c  ue")==0.       |
ede0: 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
edf0: 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
ee00: 2c 22 66 61 6c 73 65 22 29 3d 3d 30 20 29 3b 0a  ,"false")==0 );.
ee10: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
ee20: 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b 0a  u.zToken[4]==0;.
ee30: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70  }../*.** If pExp
ee40: 72 20 69 73 20 61 6e 20 41 4e 44 20 6f 72 20 4f  r is an AND or O
ee50: 52 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 72  R expression, tr
ee60: 79 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 69 74  y to simplify it
ee70: 20 62 79 20 65 6c 69 6d 69 6e 61 74 69 6e 67 0a   by eliminating.
ee80: 2a 2a 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  ** terms that ar
ee90: 65 20 61 6c 77 61 79 73 20 74 72 75 65 20 6f 72  e always true or
eea0: 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 20   false.  Return 
eeb0: 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 65  the simplified e
eec0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 4f 72  xpression..** Or
eed0: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 72 69 67   return the orig
eee0: 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20  inal expression 
eef0: 69 66 20 6e 6f 20 73 69 6d 70 6c 69 66 69 63 61  if no simplifica
ef00: 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65  tion is possible
ef10: 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  ..**.** Examples
ef20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 78 3c 31  :.**.**     (x<1
ef30: 30 29 20 41 4e 44 20 74 72 75 65 20 20 20 20 20  0) AND true     
ef40: 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20             =>   
ef50: 28 78 3c 31 30 29 0a 2a 2a 20 20 20 20 20 28 78  (x<10).**     (x
ef60: 3c 31 30 29 20 41 4e 44 20 66 61 6c 73 65 20 20  <10) AND false  
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20               => 
ef80: 20 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 28    false.**     (
ef90: 78 3c 31 30 29 20 41 4e 44 20 28 79 3d 32 32 20  x<10) AND (y=22 
efa0: 4f 52 20 66 61 6c 73 65 29 20 20 20 20 20 3d 3e  OR false)     =>
efb0: 20 20 20 28 78 3c 31 30 29 20 41 4e 44 20 28 79     (x<10) AND (y
efc0: 3d 32 32 29 0a 2a 2a 20 20 20 20 20 28 78 3c 31  =22).**     (x<1
efd0: 30 29 20 41 4e 44 20 28 79 3d 32 32 20 4f 52 20  0) AND (y=22 OR 
efe0: 74 72 75 65 29 20 20 20 20 20 20 3d 3e 20 20 20  true)      =>   
eff0: 28 78 3c 31 30 29 0a 2a 2a 20 20 20 20 20 28 79  (x<10).**     (y
f000: 3d 32 32 29 20 4f 52 20 74 72 75 65 20 20 20 20  =22) OR true    
f010: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20               => 
f020: 20 20 74 72 75 65 0a 2a 2f 0a 45 78 70 72 20 2a    true.*/.Expr *
f030: 73 71 6c 69 74 65 33 45 78 70 72 53 69 6d 70 6c  sqlite3ExprSimpl
f040: 69 66 69 65 64 41 6e 64 4f 72 28 45 78 70 72 20  ifiedAndOr(Expr 
f050: 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65 72  *pExpr){.  asser
f060: 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
f070: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
f080: 54 4b 5f 41 4e 44 20 7c 7c 20 70 45 78 70 72 2d  TK_AND || pExpr-
f090: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20  >op==TK_OR ){.  
f0a0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
f0b0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 69 6d 70   sqlite3ExprSimp
f0c0: 6c 69 66 69 65 64 41 6e 64 4f 72 28 70 45 78 70  lifiedAndOr(pExp
f0d0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
f0e0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
f0f0: 6c 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66  lite3ExprSimplif
f100: 69 65 64 41 6e 64 4f 72 28 70 45 78 70 72 2d 3e  iedAndOr(pExpr->
f110: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
f120: 45 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  ExprAlwaysTrue(p
f130: 4c 65 66 74 29 20 7c 7c 20 45 78 70 72 41 6c 77  Left) || ExprAlw
f140: 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29  aysFalse(pRight)
f150: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20   ){.      pExpr 
f160: 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  = pExpr->op==TK_
f170: 41 4e 44 20 3f 20 70 52 69 67 68 74 20 3a 20 70  AND ? pRight : p
f180: 4c 65 66 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Left;.    }else 
f190: 69 66 28 20 45 78 70 72 41 6c 77 61 79 73 54 72  if( ExprAlwaysTr
f1a0: 75 65 28 70 52 69 67 68 74 29 20 7c 7c 20 45 78  ue(pRight) || Ex
f1b0: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c  prAlwaysFalse(pL
f1c0: 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 70 45  eft) ){.      pE
f1d0: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d  xpr = pExpr->op=
f1e0: 3d 54 4b 5f 41 4e 44 20 3f 20 70 4c 65 66 74 20  =TK_AND ? pLeft 
f1f0: 3a 20 70 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a  : pRight;.    }.
f200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
f210: 70 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  pr;.}.../*.** Th
f220: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
f230: 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
f240: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
f250: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a  expressions to.*
f260: 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72  * see if they ar
f270: 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72  e "constant" for
f280: 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e   some definition
f290: 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54   of constant.  T
f2a0: 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f  he.** Walker.eCo
f2b0: 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69  de value determi
f2c0: 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  nes the type of 
f2d0: 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72  "constant" we ar
f2e0: 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72  e looking.** for
f2f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
f300: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
f310: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
f320: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
f330: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
f340: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
f350: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
f360: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
f370: 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20  >eCode==1.**    
f380: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
f390: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20  nstantNotJoin() 
f3a0: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
f3b0: 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20  r->eCode==2.**  
f3c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
f3d0: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20  TableConstant() 
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c              pWal
f3f0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a  ker->eCode==3.**
f400: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f410: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
f420: 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57  tion()        pW
f430: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
f440: 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c  or 5.**.** In al
f450: 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  l cases, the cal
f460: 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65  lbacks set Walke
f470: 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62  r.eCode=0 and ab
f480: 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ort if the expre
f490: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e  ssion.** is foun
f4a0: 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f  d to not be a co
f4b0: 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstant..**.** Th
f4c0: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  e sqlite3ExprIsC
f4d0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
f4e0: 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20  n() is used for 
f4f0: 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65  evaluating expre
f500: 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43  ssions.** in a C
f510: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
f520: 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b  ement.  The Walk
f530: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69  er.eCode value i
f540: 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67  s 5 when parsing
f550: 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20  .** an existing 
f560: 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65  schema and 4 whe
f570: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e  n processing a n
f580: 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  ew statement.  A
f590: 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
f5a0: 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72  ter raises an er
f5b0: 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74  ror for new stat
f5c0: 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73  ements, but is s
f5d0: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65  ilently converte
f5e0: 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72  d.** to NULL for
f5f0: 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
f600: 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  s.  This allows 
f610: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
f620: 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f  bles that .** co
f630: 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61  ntain a bound pa
f640: 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20  rameter because 
f650: 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61  they were genera
f660: 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ted by older ver
f670: 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
f680: 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20  te to be parsed 
f690: 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
f6a0: 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68  s of SQLite with
f6b0: 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a  out raising a.**
f6c0: 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d   malformed schem
f6d0: 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  a error..*/.stat
f6e0: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
f6f0: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
f700: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
f710: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
f720: 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  f pWalker->eCode
f730: 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74   is 2 then any t
f740: 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65  erm of the expre
f750: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73  ssion that comes
f760: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f   from.  ** the O
f770: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
f780: 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  es of a left joi
f790: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74  n disqualifies t
f7a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
f7b0: 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f  ** from being co
f7c0: 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e  nsidered constan
f7d0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c  t. */.  if( pWal
f7e0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26  ker->eCode==2 &&
f7f0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
f800: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
f810: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  oin) ){.    pWal
f820: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
f830: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
f840: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
f850: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
f860: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
f870: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
f880: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
f890: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
f8a0: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
f8b0: 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72     ** and either
f8c0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f8d0: 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66  =4 or 5 or the f
f8e0: 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a  unction has the.
f8f0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55      ** SQLITE_FU
f900: 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a  NC_CONST flag. *
f910: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
f920: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
f930: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
f940: 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72  >=4 || ExprHasPr
f950: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
f960: 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20  ConstFunc) ){.  
f970: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
f980: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
f990: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f9a0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
f9b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
f9c0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
f9d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
f9e0: 4b 5f 49 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43  K_ID:.      /* C
f9f0: 6f 6e 76 65 72 74 20 22 74 72 75 65 22 20 6f 72  onvert "true" or
fa00: 20 22 66 61 6c 73 65 22 20 69 6e 20 61 20 44 45   "false" in a DE
fa10: 46 41 55 4c 54 20 63 6c 61 75 73 65 20 69 6e 74  FAULT clause int
fa20: 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 61  o the.      ** a
fa30: 70 70 72 6f 70 72 69 61 74 65 20 54 4b 5f 54 52  ppropriate TK_TR
fa40: 55 45 46 41 4c 53 45 20 6f 70 65 72 61 74 6f 72  UEFALSE operator
fa50: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
fa60: 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54 72 75  lite3ExprIdToTru
fa70: 65 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  eFalse(pExpr) ){
fa80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fa90: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
faa0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
fab0: 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73   thru */.    cas
fac0: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
fad0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
fae0: 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
faf0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
fb00: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
fb10: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
fb20: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
fb30: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
fb40: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
fb50: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
fb60: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
fb70: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74  CTION );.      t
fb80: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
fb90: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
fba0: 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  N );.      if( E
fbb0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
fbc0: 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f  Expr, EP_FixedCo
fbd0: 6c 29 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 65  l) && pWalker->e
fbe0: 43 6f 64 65 21 3d 32 20 29 7b 0a 20 20 20 20 20  Code!=2 ){.     
fbf0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
fc00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
fc10: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
fc20: 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70  r->eCode==3 && p
fc30: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
fc40: 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b  alker->u.iCur ){
fc50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fc60: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
fc70: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
fc80: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
fc90: 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55     case TK_IF_NU
fca0: 4c 4c 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65  LL_ROW:.    case
fcb0: 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 0a 20 20   TK_REGISTER:.  
fcc0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
fcd0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
fce0: 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65  STER );.      te
fcf0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
fd00: 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
fd10: 57 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b  W );.      pWalk
fd20: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
fd30: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
fd40: 41 62 6f 72 74 3b 0a 20 20 20 20 63 61 73 65 20  Abort;.    case 
fd50: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20  TK_VARIABLE:.   
fd60: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
fd70: 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20  eCode==5 ){.    
fd80: 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20      /* Silently 
fd90: 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61  convert bound pa
fda0: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70  rameters that ap
fdb0: 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43  pear inside of C
fdc0: 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a  REATE.        **
fdd0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f   statements into
fde0: 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72   a NULL when par
fdf0: 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20  sing the CREATE 
fe00: 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f  statement text o
fe10: 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ut.        ** of
fe20: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
fe30: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
fe40: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
fe50: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TK_NULL;.      }
fe60: 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72  else if( pWalker
fe70: 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20  ->eCode==4 ){.  
fe80: 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64        /* A bound
fe90: 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20   parameter in a 
fea0: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
feb0: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
fec0: 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a   from.        **
fed0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
fee0: 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72  () causes an err
fef0: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57  or */.        pW
ff00: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
ff10: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
ff20: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
ff30: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
ff40: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
ff50: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
ff60: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
ff70: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
ff80: 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  ; /* sqlite3Sele
ff90: 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73  ctWalkFail() dis
ffa0: 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  allows */.      
ffb0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
ffc0: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
ffd0: 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  ; /* sqlite3Sele
ffe0: 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73  ctWalkFail() dis
fff0: 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  allows */.      
10000 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
10010 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  nue;.  }.}.stati
10020 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73  c int exprIsCons
10030 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
10040 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75  nitFlag, int iCu
10050 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
10060 20 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74    w.eCode = init
10070 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43  Flag;.  w.xExprC
10080 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f  allback = exprNo
10090 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20  deIsConstant;.  
100a0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
100b0 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  k = sqlite3Selec
100c0 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65  tWalkFail;.#ifde
100d0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
100e0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
100f0 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ck2 = sqlite3Sel
10100 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a  ectWalkAssert2;.
10110 23 65 6e 64 69 66 0a 20 20 77 2e 75 2e 69 43 75  #endif.  w.u.iCu
10120 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69  r = iCur;.  sqli
10130 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
10140 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
10150 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Code;.}../*.** W
10160 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
10170 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
10180 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
10190 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
101a0 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
101b0 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
101c0 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
101d0 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
101e0 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
101f0 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
10200 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
10210 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
10220 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
10230 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
10240 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
10250 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
10260 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
10270 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
10280 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
10290 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
102a0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
102b0 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30  rIsConst(p, 1, 0
102c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
102d0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
102e0 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
102f0 2d 7a 65 72 6f 20 69 66 0a 2a 2a 0a 2a 2a 20 20  -zero if.**.**  
10300 20 28 31 29 20 74 68 65 20 65 78 70 72 65 73 73   (1) the express
10310 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
10320 20 61 6e 64 0a 2a 2a 20 20 20 28 32 29 20 74 68   and.**   (2) th
10330 65 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  e expression doe
10340 73 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  s originate in t
10350 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
10360 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f  lause.**       o
10370 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61  f a LEFT JOIN, a
10380 6e 64 0a 2a 2a 20 20 20 28 33 29 20 74 68 65 20  nd.**   (3) the 
10390 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
103a0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20  not contain any 
103b0 45 50 5f 46 69 78 65 64 43 6f 6c 20 54 4b 5f 43  EP_FixedCol TK_C
103c0 4f 4c 55 4d 4e 0a 2a 2a 20 20 20 20 20 20 20 6f  OLUMN.**       o
103d0 70 65 72 61 6e 64 73 20 63 72 65 61 74 65 64 20  perands created 
103e0 62 79 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  by the constant 
103f0 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74 69  propagation opti
10400 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  mization..**.** 
10410 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
10420 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2c 20  e returns true, 
10430 69 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  it indicates tha
10440 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
10450 0a 2a 2a 20 63 61 6e 20 62 65 20 61 64 64 65 64  .** can be added
10460 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
10470 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 20  pConstExpr list 
10480 61 6e 64 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  and evaluated on
10490 63 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ce when.** the p
104a0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
104b0 74 20 73 74 61 72 74 73 20 75 70 2e 20 20 53 65  t starts up.  Se
104c0 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  e sqlite3ExprCod
104d0 65 41 74 49 6e 69 74 28 29 2e 0a 2a 2f 0a 69 6e  eAtInit()..*/.in
104e0 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
104f0 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
10500 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
10510 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
10520 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   2, 0);.}../*.**
10530 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
10540 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
10550 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
10560 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10570 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
10580 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  any single row o
10590 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  f the table with
105a0 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49   cursor iCur.  I
105b0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
105c0 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
105d0 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20   must not refer 
105e0 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72  to any non-deter
105f0 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
10600 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62  n nor any.** tab
10610 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43  le other than iC
10620 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ur..*/.int sqlit
10630 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
10640 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69  stant(Expr *p, i
10650 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75  nt iCur){.  retu
10660 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
10670 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a  , 3, iCur);.}...
10680 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c  /*.** sqlite3Wal
10690 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b  kExpr() callback
106a0 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   used by sqlite3
106b0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
106c0 47 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74  GroupBy()..*/.st
106d0 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
106e0 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  eIsConstantOrGro
106f0 75 70 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  upBy(Walker *pWa
10700 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
10710 72 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  r){.  ExprList *
10720 70 47 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b  pGroupBy = pWalk
10730 65 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a  er->u.pGroupBy;.
10740 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43    int i;..  /* C
10750 68 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73  heck if pExpr is
10760 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e   identical to an
10770 79 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e  y GROUP BY term.
10780 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72   If so, consider
10790 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e  .  ** it constan
107a0 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  t.  */.  for(i=0
107b0 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
107c0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
107d0 78 70 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42  xpr *p = pGroupB
107e0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
107f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
10800 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78  prCompare(0, pEx
10810 70 72 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a  pr, p, -1)<2 ){.
10820 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
10830 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
10840 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c  prNNCollSeq(pWal
10850 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b  ker->pParse, p);
10860 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
10870 65 33 49 73 42 69 6e 61 72 79 28 70 43 6f 6c 6c  e3IsBinary(pColl
10880 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
10890 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
108a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
108b0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
108c0 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73  pExpr is a sub-s
108d0 65 6c 65 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f  elect. If so, co
108e0 6e 73 69 64 65 72 20 69 74 20 76 61 72 69 61 62  nsider it variab
108f0 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 45 78 70  le. */.  if( Exp
10900 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
10910 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
10920 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
10930 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
10940 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
10950 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
10960 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
10970 61 6e 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78  ant(pWalker, pEx
10980 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  pr);.}../*.** Wa
10990 6c 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  lk the expressio
109a0 6e 20 74 72 65 65 20 70 61 73 73 65 64 20 61 73  n tree passed as
109b0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
109c0 65 6e 74 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ent. Return non-
109d0 7a 65 72 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65  zero.** if the e
109e0 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73  xpression consis
109f0 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63  ts entirely of c
10a00 6f 6e 73 74 61 6e 74 73 20 6f 72 20 63 6f 70 69  onstants or copi
10a10 65 73 20 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20  es of terms .** 
10a20 69 6e 20 70 47 72 6f 75 70 42 79 20 74 68 61 74  in pGroupBy that
10a30 20 73 6f 72 74 20 77 69 74 68 20 74 68 65 20 42   sort with the B
10a40 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20  INARY collation 
10a50 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
10a60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10a70 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
10a80 65 20 69 66 20 61 20 74 65 72 6d 20 6f 66 20 74  e if a term of t
10a90 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
10aa0 20 63 61 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f   can.** be promo
10ab0 74 65 64 20 69 6e 74 6f 20 74 68 65 20 57 48 45  ted into the WHE
10ac0 52 45 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f  RE clause.  In o
10ad0 72 64 65 72 20 66 6f 72 20 73 75 63 68 20 61 20  rder for such a 
10ae0 70 72 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72  promotion to wor
10af0 6b 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  k,.** the value 
10b00 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  of the HAVING cl
10b10 61 75 73 65 20 74 65 72 6d 20 6d 75 73 74 20 62  ause term must b
10b20 65 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 61  e the same for a
10b30 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a  ll members of.**
10b40 20 61 20 22 67 72 6f 75 70 22 2e 20 20 54 68 65   a "group".  The
10b50 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61   requirement tha
10b60 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
10b70 65 72 6d 20 6d 75 73 74 20 62 65 20 42 49 4e 41  erm must be BINA
10b80 52 59 0a 2a 2a 20 61 73 73 75 6d 65 73 20 74 68  RY.** assumes th
10b90 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c  at no other coll
10ba0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77  ating sequence w
10bb0 69 6c 6c 20 68 61 76 65 20 61 20 66 69 6e 65 72  ill have a finer
10bc0 2d 67 72 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75  -grained.** grou
10bd0 70 69 6e 67 20 74 68 61 6e 20 62 69 6e 61 72 79  ping than binary
10be0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
10bf0 73 20 28 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62  s (A=B COLLATE b
10c00 69 6e 61 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a  inary) implies.*
10c10 2a 20 41 3d 42 20 69 6e 20 65 76 65 72 79 20 6f  * A=B in every o
10c20 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ther collating s
10c30 65 71 75 65 6e 63 65 2e 20 20 54 68 65 20 72 65  equence.  The re
10c40 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74  quirement that t
10c50 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 62  he.** GROUP BY b
10c60 65 20 42 49 4e 41 52 59 20 69 73 20 73 74 72 69  e BINARY is stri
10c70 63 74 65 72 20 74 68 61 6e 20 6e 65 63 65 73 73  cter than necess
10c80 61 72 79 2e 20 20 49 74 20 77 6f 75 6c 64 20 61  ary.  It would a
10c90 6c 73 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70  lso work.** to p
10ca0 72 6f 6d 6f 74 65 20 48 41 56 49 4e 47 20 63 6c  romote HAVING cl
10cb0 61 75 73 65 73 20 74 68 61 74 20 75 73 65 20 74  auses that use t
10cc0 68 65 20 73 61 6d 65 20 61 6c 74 65 72 6e 61 74  he same alternat
10cd0 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  ive collating.**
10ce0 20 73 65 71 75 65 6e 63 65 20 61 73 20 74 68 65   sequence as the
10cf0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2c 20   GROUP BY term, 
10d00 62 75 74 20 74 68 61 74 20 69 73 20 6d 75 63 68  but that is much
10d10 20 68 61 72 64 65 72 20 74 6f 20 63 68 65 63 6b   harder to check
10d20 2c 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65  ,.** alternative
10d30 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
10d40 6e 63 65 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f  nces are uncommo
10d50 6e 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 6f  n, and this is o
10d60 6e 6c 79 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69  nly an.** optimi
10d70 7a 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61  zation, so we ta
10d80 6b 65 20 74 68 65 20 65 61 73 79 20 77 61 79 20  ke the easy way 
10d90 6f 75 74 20 61 6e 64 20 73 69 6d 70 6c 79 20 72  out and simply r
10da0 65 71 75 69 72 65 20 74 68 65 0a 2a 2a 20 47 52  equire the.** GR
10db0 4f 55 50 20 42 59 20 74 6f 20 75 73 65 20 74 68  OUP BY to use th
10dc0 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69  e BINARY collati
10dd0 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
10de0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
10df0 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
10e00 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  By(Parse *pParse
10e10 2c 20 45 78 70 72 20 2a 70 2c 20 45 78 70 72 4c  , Expr *p, ExprL
10e20 69 73 74 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a  ist *pGroupBy){.
10e30 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
10e40 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78  eCode = 1;.  w.x
10e50 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
10e60 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
10e70 74 4f 72 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e  tOrGroupBy;.  w.
10e80 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
10e90 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75  = 0;.  w.u.pGrou
10ea0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
10eb0 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
10ec0 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
10ed0 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20  lkExpr(&w, p);. 
10ee0 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b   return w.eCode;
10ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
10f00 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
10f10 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
10f20 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
10f30 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
10f40 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69  t.** or a functi
10f50 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e  on call with con
10f60 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
10f70 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69    Return and 0 i
10f80 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61  f there.** are a
10f90 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  ny variables..**
10fa0 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
10fb0 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
10fc0 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
10fd0 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
10fe0 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
10ff0 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
11000 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
11010 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
11020 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
11030 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
11040 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
11050 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
11060 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75  ction(Expr *p, u
11070 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73  8 isInit){.  ass
11080 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c  ert( isInit==0 |
11090 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20  | isInit==1 );. 
110a0 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
110b0 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c  nst(p, 4+isInit,
110c0 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   0);.}..#ifdef S
110d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
110e0 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20  SOR_HINTS./*.** 
110f0 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
11100 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
11110 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
11120 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a  sion contains a.
11130 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20 73  ** subquery of s
11140 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72  ome kind.  Retur
11150 6e 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65  n 0 if there are
11160 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a   no subqueries..
11170 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
11180 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65  prContainsSubque
11190 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57  ry(Expr *p){.  W
111a0 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f  alker w;.  w.eCo
111b0 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70  de = 1;.  w.xExp
111c0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
111d0 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
111e0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
111f0 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65  back = sqlite3Se
11200 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69  lectWalkFail;.#i
11210 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
11220 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  G.  w.xSelectCal
11230 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33  lback2 = sqlite3
11240 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74  SelectWalkAssert
11250 32 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  2;.#endif.  sqli
11260 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
11270 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
11280 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  Code==0;.}.#endi
11290 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
112a0 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64  expression p cod
112b0 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e  es a constant in
112c0 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d  teger that is sm
112d0 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f  all enough.** to
112e0 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74   fit in a 32-bit
112f0 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
11300 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76   1 and put the v
11310 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
11320 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75  ger.** in *pValu
11330 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  e.  If the expre
11340 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20  ssion is not an 
11350 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74  integer or if it
11360 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74   is too big.** t
11370 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65  o fit in a signe
11380 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
11390 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c  , return 0 and l
113a0 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63  eave *pValue unc
113b0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
113c0 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
113d0 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ger(Expr *p, int
113e0 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74   *pValue){.  int
113f0 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 4e   rc = 0;.  if( N
11400 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
11410 75 72 6e 20 30 3b 20 20 2f 2a 20 55 73 65 64 20  urn 0;  /* Used 
11420 74 6f 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66  to only happen f
11430 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20  ollowing on OOM 
11440 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  */..  /* If an e
11450 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
11460 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20  integer literal 
11470 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73  that fits in a s
11480 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a  igned 32-bit.  *
11490 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  * integer, then 
114a0 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  the EP_IntValue 
114b0 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61  flag will have a
114c0 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20  lready been set 
114d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
114e0 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
114f0 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  | (p->flags & EP
11500 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20  _IntValue)!=0.  
11510 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
11520 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75  te3GetInt32(p->u
11530 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30  .zToken, &rc)==0
11540 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c   );..  if( p->fl
11550 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
11560 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65  e ){.    *pValue
11570 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a   = p->u.iValue;.
11580 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
11590 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  }.  switch( p->o
115a0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
115b0 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
115c0 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rc = sqlite3Expr
115d0 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
115e0 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  ft, pValue);.   
115f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11600 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
11610 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  US: {.      int 
11620 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  v;.      if( sql
11630 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
11640 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20  r(p->pLeft, &v) 
11650 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
11660 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36  t( v!=(-21474836
11670 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  47-1) );.       
11680 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20   *pValue = -v;. 
11690 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
116a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
116b0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
116c0 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
116d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
116e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46  ../*.** Return F
116f0 41 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73  ALSE if there is
11700 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
11710 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
11720 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  an be NULL..**.*
11730 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
11740 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ion might be NUL
11750 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72  L or if the expr
11760 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f  ession is too co
11770 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c  mplex.** to tell
11780 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a   return TRUE.  .
11790 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
117a0 6e 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e  ne is used as an
117b0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
117c0 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c  o skip OP_IsNull
117d0 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e   opcodes.** when
117e0 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20   we know that a 
117f0 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
11800 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20  NULL.  Hence, a 
11810 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a  false positive.*
11820 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55  * (returning TRU
11830 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74  E when in fact t
11840 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
11850 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29  n never be NULL)
11860 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73   might.** be a s
11870 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65  mall performance
11880 20 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65   hit but is othe
11890 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20  rwise harmless. 
118a0 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a   On the other.**
118b0 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e   hand, a false n
118c0 65 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69  egative (returni
118d0 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68  ng FALSE when th
118e0 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62  e result could b
118f0 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20  e NULL).** will 
11900 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
11910 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e   an incorrect an
11920 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69  swer.  So when i
11930 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a  n doubt, return.
11940 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20  ** TRUE..*/.int 
11950 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
11960 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20  Null(const Expr 
11970 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20  *p){.  u8 op;.  
11980 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  while( p->op==TK
11990 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d  _UPLUS || p->op=
119a0 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 0a 20 20  =TK_UMINUS ){.  
119b0 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a    p = p->pLeft;.
119c0 20 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70    }.  op = p->op
119d0 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
119e0 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
119f0 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28  ->op2;.  switch(
11a00 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
11a10 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
11a20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a  case TK_STRING:.
11a30 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
11a40 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  T:.    case TK_B
11a50 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72  LOB:.      retur
11a60 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  n 0;.    case TK
11a70 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 72  _COLUMN:.      r
11a80 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f  eturn ExprHasPro
11a90 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42  perty(p, EP_CanB
11aa0 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20  eNull) ||.      
11ab0 20 20 20 20 20 20 20 70 2d 3e 79 2e 70 54 61 62         p->y.pTab
11ac0 3d 3d 30 20 7c 7c 20 20 2f 2a 20 52 65 66 65 72  ==0 ||  /* Refer
11ad0 65 6e 63 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 6f  ence to column o
11ae0 66 20 69 6e 64 65 78 20 6f 6e 20 65 78 70 72 65  f index on expre
11af0 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ssion */.       
11b00 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d        (p->iColum
11b10 6e 3e 3d 30 20 26 26 20 70 2d 3e 79 2e 70 54 61  n>=0 && p->y.pTa
11b20 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75  b->aCol[p->iColu
11b30 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b  mn].notNull==0);
11b40 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
11b50 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
11b60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
11b70 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
11b80 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
11b90 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69  s a constant whi
11ba0 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75  ch would be.** u
11bb0 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41  nchanged by OP_A
11bc0 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65  ffinity with the
11bd0 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20   affinity given 
11be0 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  in the second.**
11bf0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
11c00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
11c10 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
11c20 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66  ne if the OP_Aff
11c30 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a  inity operation.
11c40 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ** can be omitte
11c50 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  d.  When in doub
11c60 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20  t return FALSE. 
11c70 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   A false negativ
11c80 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73  e.** is harmless
11c90 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74  .  A false posit
11ca0 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61  ive, however, ca
11cb0 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  n result in the 
11cc0 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e  wrong.** answer.
11cd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
11ce0 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
11cf0 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45  tyChange(const E
11d00 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66  xpr *p, char aff
11d10 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66  ){.  u8 op;.  if
11d20 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  ( aff==SQLITE_AF
11d30 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20  F_BLOB ) return 
11d40 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  1;.  while( p->o
11d50 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
11d60 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
11d70 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
11d80 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
11d90 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
11da0 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
11db0 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
11dc0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
11dd0 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
11de0 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
11df0 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
11e00 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
11e10 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
11e20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
11e30 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72  FLOAT: {.      r
11e40 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
11e50 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66  E_AFF_REAL || af
11e60 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
11e70 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
11e80 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
11e90 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
11ea0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11eb0 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TEXT;.    }.    
11ec0 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
11ed0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
11ee0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11ef0 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
11f00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61    assert( p->iTa
11f10 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20  ble>=0 );  /* p 
11f20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f  cannot be part o
11f30 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  f a CHECK constr
11f40 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  aint */.      re
11f50 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c  turn p->iColumn<
11f60 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
11f70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11f80 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
11f90 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
11fa0 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  IC);.    }.    d
11fb0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
11fc0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
11fd0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
11fe0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
11ff0 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
12000 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
12010 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
12020 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
12030 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
12040 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
12050 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
12060 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
12070 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
12080 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
12090 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
120a0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
120b0 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
120c0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
120d0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
120e0 20 70 58 20 69 73 20 74 68 65 20 52 48 53 20 6f   pX is the RHS o
120f0 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  f an IN operator
12100 2e 20 20 49 66 20 70 58 20 69 73 20 61 20 53 45  .  If pX is a SE
12110 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a  LECT statement .
12120 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  ** that can be s
12130 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64  implified to a d
12140 69 72 65 63 74 20 74 61 62 6c 65 20 61 63 63 65  irect table acce
12150 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a  ss, then return.
12160 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
12170 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
12180 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20  ment.  If pX is 
12190 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74 61  not a SELECT sta
121a0 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66  tement,.** or if
121b0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
121c0 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62  ement needs to b
121d0 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74  e manifested int
121e0 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a  o a transient.**
121f0 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74   table, then ret
12200 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66  urn NULL..*/.#if
12210 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12220 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63  _SUBQUERY.static
12230 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69   Select *isCandi
12240 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70  dateForInOpt(Exp
12250 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74  r *pX){.  Select
12260 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *p;.  SrcList *
12270 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74  pSrc;.  ExprList
12280 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c   *pEList;.  Tabl
12290 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
122a0 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
122b0 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
122c0 78 49 73 53 65 6c 65 63 74 29 20 29 20 72 65 74  xIsSelect) ) ret
122d0 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61  urn 0;  /* Not a
122e0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
122f0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
12300 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c  ty(pX, EP_VarSel
12310 65 63 74 29 20 20 29 20 72 65 74 75 72 6e 20 30  ect)  ) return 0
12320 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64  ;  /* Correlated
12330 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70   subq */.  p = p
12340 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  X->x.pSelect;.  
12350 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20  if( p->pPrior ) 
12360 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
12370 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20         /* Not a 
12380 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
12390 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
123a0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
123b0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
123c0 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  ) ){.    testcas
123d0 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  e( (p->selFlags 
123e0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
123f0 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
12400 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
12410 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
12420 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
12430 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
12440 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
12450 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75  gate );.    retu
12460 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54  rn 0; /* No DIST
12470 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64  INCT keyword and
12480 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
12490 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20  nctions */.  }. 
124a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
124b0 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20  upBy==0 );      
124c0 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
124d0 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
124e0 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c  e */.  if( p->pL
124f0 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12510 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c   Has no LIMIT cl
12520 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
12530 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
12540 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12550 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45   /* Has no WHERE
12560 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72   clause */.  pSr
12570 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
12580 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
12590 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53  ;.  if( pSrc->nS
125a0 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
125b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ;          /* Si
125c0 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f  ngle term in FRO
125d0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66  M clause */.  if
125e0 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ( pSrc->a[0].pSe
125f0 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  lect ) return 0;
12600 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20       /* FROM is 
12610 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 6f  not a subquery o
12620 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62  r view */.  pTab
12630 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54   = pSrc->a[0].pT
12640 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ab;.  assert( pT
12650 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ab!=0 );.  asser
12660 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  t( pTab->pSelect
12670 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
12680 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
12690 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a   is not a view *
126a0 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
126b0 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
126c0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52   0;        /* FR
126d0 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20  OM clause not a 
126e0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
126f0 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
12700 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28  EList;.  assert(
12710 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
12720 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72 65  /* All SELECT re
12730 73 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63 6f  sults must be co
12740 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28  lumns. */.  for(
12750 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
12760 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
12770 45 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45 4c  Expr *pRes = pEL
12780 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
12790 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 6f  .    if( pRes->o
127a0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
127b0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73 73  eturn 0;.    ass
127c0 65 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62 6c  ert( pRes->iTabl
127d0 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43  e==pSrc->a[0].iC
127e0 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74  ursor );  /* Not
127f0 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
12800 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20  bquery */.  }.  
12810 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64  return p;.}.#end
12820 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
12830 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
12840 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12850 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
12860 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12870 74 68 61 74 20 63 68 65 63 6b 73 20 74 68 65 20  that checks the 
12880 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
12890 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20   of index table 
128a0 69 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a  iCur to see if.*
128b0 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  * it contains an
128c0 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20  y NULL entries. 
128d0 20 43 61 75 73 65 20 74 68 65 20 72 65 67 69 73   Cause the regis
128e0 74 65 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c  ter at regHasNul
128f0 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74  l to be set.** t
12900 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  o a non-NULL val
12910 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  ue if iCur conta
12920 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43  ins no NULLs.  C
12930 61 75 73 65 20 72 65 67 69 73 74 65 72 20 72 65  ause register re
12940 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62  gHasNull.** to b
12950 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  e set to NULL if
12960 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f   iCur contains o
12970 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
12980 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  values..*/.stati
12990 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
129a0 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62  tHasNullFlag(Vdb
129b0 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20  e *v, int iCur, 
129c0 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b  int regHasNull){
129d0 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20  .  int addr1;.  
129e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
129f0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
12a00 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b   0, regHasNull);
12a10 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
12a20 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12a30 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29  OP_Rewind, iCur)
12a40 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
12a50 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12a60 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
12a70 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65  umn, iCur, 0, re
12a80 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c  gHasNull);.  sql
12a90 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
12aa0 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f  (v, OPFLAG_TYPEO
12ab0 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d  FARG);.  VdbeCom
12ac0 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f  ment((v, "first_
12ad0 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69  entry_in(%d)", i
12ae0 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cur));.  sqlite3
12af0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12b00 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66  addr1);.}.#endif
12b10 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
12b20 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
12b30 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
12b40 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  nt is an IN oper
12b50 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74  ator with a list
12b60 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79   (not a subquery
12b70 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67  ) on the .** rig
12b80 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52  ht-hand side.  R
12b90 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
12ba0 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74  at list is const
12bb0 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ant..*/.static i
12bc0 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49  nt sqlite3InRhsI
12bd0 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
12be0 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c  pIn){.  Expr *pL
12bf0 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  HS;.  int res;. 
12c00 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
12c10 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45  sProperty(pIn, E
12c20 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
12c30 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c    pLHS = pIn->pL
12c40 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66  eft;.  pIn->pLef
12c50 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73  t = 0;.  res = s
12c60 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
12c70 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e  tant(pIn);.  pIn
12c80 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a  ->pLeft = pLHS;.
12c90 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
12ca0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
12cb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
12cc0 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
12cd0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
12ce0 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74   IN (...) operat
12cf0 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61  or..** The pX pa
12d00 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65  rameter is the e
12d10 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65  xpression on the
12d20 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
12d30 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a  perator, which.*
12d40 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65  * might be eithe
12d50 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  r a list of expr
12d60 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62  essions or a sub
12d70 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  query..**.** The
12d80 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
12d90 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20  tine is to find 
12da0 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72  or create a b-tr
12db0 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63  ee object that c
12dc0 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69  an.** be used ei
12dd0 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72  ther to test for
12de0 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74   membership in t
12df0 68 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f  he RHS set or to
12e00 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
12e10 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20  .** all members 
12e20 6f 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20  of the RHS set, 
12e30 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61  skipping duplica
12e40 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72  tes..**.** A cur
12e50 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  sor is opened on
12e60 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65   the b-tree obje
12e70 63 74 20 74 68 61 74 20 69 73 20 74 68 65 20 52  ct that is the R
12e80 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
12e90 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d  rator.** and pX-
12ea0 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  >iTable is set t
12eb0 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
12ec0 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  hat cursor..**.*
12ed0 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
12ee0 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
12ef0 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20  ction indicates 
12f00 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c  the b-tree type,
12f10 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
12f20 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  **   IN_INDEX_RO
12f30 57 49 44 20 20 20 20 20 20 2d 20 54 68 65 20 63  WID      - The c
12f40 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
12f50 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
12f60 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
12f70 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d  DEX_INDEX_ASC  -
12f80 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
12f90 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63  opened on an asc
12fa0 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a  ending index..**
12fb0 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45     IN_INDEX_INDE
12fc0 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75 72  X_DESC - The cur
12fd0 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
12fe0 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
12ff0 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  ndex..**   IN_IN
13000 44 45 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d  DEX_EPH        -
13010 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
13020 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63  opened on a spec
13030 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e  ially created an
13040 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70               pop
13060 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c  ulated epheremal
13070 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
13080 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20  INDEX_NOOP      
13090 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73   - No cursor was
130a0 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65   allocated.  The
130b0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73   IN operator mus
130c0 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  t be.**         
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130e0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
130f0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d   sequence of com
13100 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  parisons..**.** 
13110 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72  An existing b-tr
13120 65 65 20 6d 69 67 68 74 20 62 65 20 75 73 65 64  ee might be used
13130 20 69 66 20 74 68 65 20 52 48 53 20 65 78 70 72   if the RHS expr
13140 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73  ession pX is a s
13150 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72  imple.** subquer
13160 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a  y such as:.**.**
13170 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
13180 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e  umn1>, <column2>
13190 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e  ... FROM <table>
131a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48  .**.** If the RH
131b0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
131c0 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f  ator is a list o
131d0 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  r a more complex
131e0 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a   subquery, then.
131f0 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ** an ephemeral 
13200 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64  table might need
13210 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
13220 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e   from the RHS an
13230 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54  d then.** pX->iT
13240 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69  able made to poi
13250 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65  nt to the epheme
13260 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61  ral table instea
13270 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74  d of an.** exist
13280 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ing table..**.**
13290 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72   The inFlags par
132a0 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74  ameter must cont
132b0 61 69 6e 2c 20 61 74 20 61 20 6d 69 6e 69 6d 75  ain, at a minimu
132c0 6d 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69  m, one of the bi
132d0 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ts.** IN_INDEX_M
132e0 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f  EMBERSHIP or IN_
132f0 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 75 74 20 6e  INDEX_LOOP but n
13300 6f 74 20 62 6f 74 68 2e 20 20 49 66 20 69 6e 46  ot both.  If inF
13310 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  lags contains.**
13320 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
13330 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65 20 67  SHIP, then the g
13340 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20 77  enerated table w
13350 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
13360 61 20 66 61 73 74 0a 2a 2a 20 6d 65 6d 62 65 72  a fast.** member
13370 73 68 69 70 20 74 65 73 74 2e 20 20 57 68 65 6e  ship test.  When
13380 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f   the IN_INDEX_LO
13390 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c 20 74  OP bit is set, t
133a0 68 65 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c  he IN index will
133b0 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 6c  .** be used to l
133c0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  oop over all val
133d0 75 65 73 20 6f 66 20 74 68 65 20 52 48 53 20 6f  ues of the RHS o
133e0 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
133f0 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e  r..**.** When IN
13400 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75  _INDEX_LOOP is u
13410 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74  sed (and the b-t
13420 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ree will be used
13430 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74   to iterate.** t
13440 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d  hrough the set m
13450 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68 65  embers) then the
13460 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74   b-tree must not
13470 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61   contain duplica
13480 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72  tes..** An epher
13490 65 6d 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20  emal table will 
134a0 62 65 20 63 72 65 61 74 65 64 20 75 6e 6c 65 73  be created unles
134b0 73 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63  s the selected c
134c0 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61 72 61  olumns are guara
134d0 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75  nteed.** to be u
134e0 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62  nique - either b
134f0 65 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20  ecause it is an 
13500 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
13510 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a 2a  KEY or due to.**
13520 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72   a UNIQUE constr
13530 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a 2a  aint or index..*
13540 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44  *.** When IN_IND
13550 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73  EX_MEMBERSHIP is
13560 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62   used (and the b
13570 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
13580 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20  ed .** for fast 
13590 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
135a0 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70  ests) then an ep
135b0 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75  heremal table mu
135c0 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75  st .** be used u
135d0 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20  nless <columns> 
135e0 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e 54 45  is a single INTE
135f0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
13600 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a  column or an .**
13610 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 66 6f   index can be fo
13620 75 6e 64 20 77 69 74 68 20 74 68 65 20 73 70 65  und with the spe
13630 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e  cified <columns>
13640 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73   as its left-mos
13650 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
13660 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
13670 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45   and IN_INDEX_ME
13680 4d 42 45 52 53 48 49 50 20 61 72 65 20 62 6f 74  MBERSHIP are bot
13690 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20  h set and.** if 
136a0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
136b0 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
136c0 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71  list (not a subq
136d0 75 65 72 79 29 20 74 68 65 6e 20 74 68 69 73 0a  uery) then this.
136e0 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  ** routine might
136f0 20 64 65 63 69 64 65 20 74 68 61 74 20 63 72 65   decide that cre
13700 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72  ating an ephemer
13710 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20 6d 65  al b-tree for me
13720 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65 73 74  mbership.** test
13730 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70 65 6e  ing is too expen
13740 73 69 76 65 20 61 6e 64 20 72 65 74 75 72 6e 20  sive and return 
13750 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20  IN_INDEX_NOOP.  
13760 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
13770 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
13780 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c  tine should impl
13790 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70 65  ement the IN ope
137a0 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20 73 65  rator using a se
137b0 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20  quence.** of Eq 
137c0 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e  or Ne comparison
137d0 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a   operations..**.
137e0 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72  ** When the b-tr
137f0 65 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ee is being used
13800 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
13810 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69  tests, the calli
13820 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  ng function.** m
13830 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  ight need to kno
13840 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  w whether or not
13850 20 74 68 65 20 52 48 53 20 73 69 64 65 20 6f 66   the RHS side of
13860 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
13870 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e  .** contains a N
13880 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73 48 61  ULL.  If prRhsHa
13890 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e  sNull is not a N
138a0 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  ULL pointer and 
138b0 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
138c0 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20  any chance that 
138d0 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20  the (...) might 
138e0 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76  contain a NULL v
138f0 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69  alue at.** runti
13900 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73  me, then a regis
13910 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
13920 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65   and the registe
13930 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e  r number written
13940 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48 61 73  .** to *prRhsHas
13950 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65 20 69  Null. If there i
13960 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
13970 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61   the (...) conta
13980 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61  ins a.** NULL va
13990 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52 68 73  lue, then *prRhs
139a0 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20  HasNull is left 
139b0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
139c0 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
139d0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
139e0 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f  its location sto
139f0 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48 61 73  red in *prRhsHas
13a00 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  Null, then.** th
13a10 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61 74 20  e value in that 
13a20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62 65  register will be
13a30 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62 2d 74   NULL if the b-t
13a40 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ree contains one
13a50 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c   or more.** NULL
13a60 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69 74 20   values, and it 
13a70 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e  will be some non
13a80 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 74  -NULL value if t
13a90 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69  he b-tree contai
13aa0 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61  ns no.** NULL va
13ab0 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lues..**.** If t
13ac0 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d 65 74  he aiMap paramet
13ad0 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  er is not NULL, 
13ae0 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  it must point to
13af0 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74 61 69   an array contai
13b00 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d  ning.** one elem
13b10 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ent for each col
13b20 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20  umn returned by 
13b30 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
13b40 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48 53 0a  ment on the RHS.
13b50 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e  ** of the IN(...
13b60 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20  ) operator. The 
13b70 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  i'th entry of th
13b80 65 20 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c  e array is popul
13b90 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a  ated with the.**
13ba0 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 69   offset of the i
13bb0 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ndex column that
13bc0 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 27 74   matches the i't
13bd0 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65  h column returne
13be0 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c 45  d by the.** SELE
13bf0 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  CT. For example,
13c00 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
13c10 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65 64 20  on and selected 
13c20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a  index are:.**.**
13c30 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53     (?,?,?) IN (S
13c40 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52  ELECT a, b, c FR
13c50 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52 45 41  OM t1).**   CREA
13c60 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
13c70 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a  1(b, c, a);.**.*
13c80 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20 69  * then aiMap[] i
13c90 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
13ca0 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23   {2, 0, 1}..*/.#
13cb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13cc0 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
13cd0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
13ce0 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
13cf0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
13d00 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
13d10 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
13d20 58 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X,              
13d30 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
13d40 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29  -hand side (RHS)
13d50 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
13d60 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69 6e 46  tor */.  u32 inF
13d70 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
13d80 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f      /* IN_INDEX_
13d90 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53 48 49  LOOP, _MEMBERSHI
13da0 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f  P, and/or _NOOP_
13db0 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 72 52  OK */.  int *prR
13dc0 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20 20 20  hsHasNull,      
13dd0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
13de0 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74 61 74  olding NULL stat
13df0 75 73 2e 20 20 53 65 65 20 6e 6f 74 65 73 20 2a  us.  See notes *
13e00 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 2c 20  /.  int *aiMap, 
13e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13e20 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 49  * Mapping from I
13e30 6e 64 65 78 20 66 69 65 6c 64 73 20 74 6f 20 52  ndex fields to R
13e40 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a 20 20 69  HS fields */.  i
13e50 6e 74 20 2a 70 69 54 61 62 20 20 20 20 20 20 20  nt *piTab       
13e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
13e70 3a 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a  : index to use *
13e80 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
13e90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13eb0 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69  SELECT to the ri
13ec0 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  ght of IN operat
13ed0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  or */.  int eTyp
13ee0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13f00 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62   Type of RHS tab
13f10 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a  le. IN_INDEX_* *
13f20 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
13f30 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
13f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
13f50 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74  sor of the RHS t
13f60 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
13f70 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20  stBeUnique;     
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f90 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d  /* True if RHS m
13fa0 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f  ust be unique */
13fb0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
13fc0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13fd0 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74  se);     /* Virt
13fe0 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
13ff0 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73  g coded */..  as
14000 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
14010 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55  _IN );.  mustBeU
14020 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73  nique = (inFlags
14030 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50   & IN_INDEX_LOOP
14040 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  )!=0;..  /* If t
14050 68 65 20 52 48 53 20 6f 66 20 74 68 69 73 20 49  he RHS of this I
14060 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20  N(...) operator 
14070 69 73 20 61 20 53 45 4c 45 43 54 2c 20 61 6e 64  is a SELECT, and
14080 20 69 66 20 69 74 20 6d 61 74 74 65 72 73 20 0a   if it matters .
14090 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
140a0 6e 6f 74 20 74 68 65 20 53 45 4c 45 43 54 20 72  not the SELECT r
140b0 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e  esult contains N
140c0 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68 65 63  ULL values, chec
140d0 6b 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f  k whether.  ** o
140e0 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63  r not NULL is ac
140f0 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  tually possible 
14100 28 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20  (it may not be, 
14110 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64 75 65  for example, due
14120 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55   .  ** to NOT NU
14130 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  LL constraints i
14140 6e 20 74 68 65 20 73 63 68 65 6d 61 29 2e 20 49  n the schema). I
14150 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73  f no NULL values
14160 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20   are possible,. 
14170 20 2a 2a 20 73 65 74 20 70 72 52 68 73 48 61 73   ** set prRhsHas
14180 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72 65  Null to 0 before
14190 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f   continuing.  */
141a0 0a 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e  .  if( prRhsHasN
141b0 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61 67  ull && (pX->flag
141c0 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
141d0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
141e0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
141f0 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65  List = pX->x.pSe
14200 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
14210 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
14220 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
14230 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
14240 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
14250 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
14260 78 70 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  xpr) ) break;.  
14270 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70    }.    if( i==p
14280 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
14290 20 20 20 20 20 20 70 72 52 68 73 48 61 73 4e 75        prRhsHasNu
142a0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ll = 0;.    }.  
142b0 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
142c0 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74   see if an exist
142d0 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
142e0 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ex can be used t
142f0 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74  o.  ** satisfy t
14300 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20  he query.  This 
14310 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f  is preferable to
14320 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65   generating a ne
14330 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61  w .  ** ephemera
14340 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69  l table.  */.  i
14350 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
14360 3d 30 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e  =0 && (p = isCan
14370 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
14380 58 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  X))!=0 ){.    sq
14390 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
143a0 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
143b0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
143c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
143d0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
143e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
14400 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  le <table>. */. 
14410 20 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20     i16 iDb;     
14420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
14440 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54  abase idx for pT
14450 61 62 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69  ab */.    ExprLi
14460 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e  st *pEList = p->
14470 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  pEList;.    int 
14480 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
14490 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65  nExpr;..    asse
144a0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
144b0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
144c0 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
144d0 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
144e0 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
144f0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  rt( p->pEList->a
14500 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20  [0].pExpr!=0 ); 
14510 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
14520 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
14530 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
14540 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29  rt( p->pSrc!=0 )
14550 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14560 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
14570 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
14580 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62  t(p) */.    pTab
14590 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
145a0 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43  .pTab;..    /* C
145b0 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61  ode an OP_Transa
145c0 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62  ction and OP_Tab
145d0 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c  leLock for <tabl
145e0 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  e>. */.    iDb =
145f0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
14600 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
14610 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71  pSchema);.    sq
14620 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
14630 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
14640 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  b);.    sqlite3T
14650 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
14660 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
14670 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
14680 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 76  );..    assert(v
14690 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 47 65  );  /* sqlite3Ge
146a0 74 56 64 62 65 28 29 20 68 61 73 20 61 6c 77 61  tVdbe() has alwa
146b0 79 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  ys been previous
146c0 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20  ly called */.   
146d0 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26 26   if( nExpr==1 &&
146e0 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
146f0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
14700 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  {.      /* The "
14710 78 20 49 4e 20 28 53 45 4c 45 43 54 20 72 6f 77  x IN (SELECT row
14720 69 64 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 20  id FROM table)" 
14730 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  case */.      in
14740 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
14750 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
14760 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 56  P_Once);.      V
14770 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
14780 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
14790 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
147a0 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
147b0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
147c0 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
147d0 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20  INDEX_ROWID;.   
147e0 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
147f0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 0a  lan((pParse, 0,.
14800 20 20 20 20 20 20 20 20 20 20 20 20 22 55 53 49              "USI
14810 4e 47 20 52 4f 57 49 44 20 53 45 41 52 43 48 20  NG ROWID SEARCH 
14820 4f 4e 20 54 41 42 4c 45 20 25 73 20 46 4f 52 20  ON TABLE %s FOR 
14830 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70 54 61  IN-OPERATOR",pTa
14840 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
14850 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
14860 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
14870 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14880 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
148b0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
148c0 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74       int affinit
148d0 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  y_ok = 1;.      
148e0 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a  int i;..      /*
148f0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
14900 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69  affinity that wi
14910 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65  ll be used to pe
14920 72 66 6f 72 6d 20 65 61 63 68 20 0a 20 20 20 20  rform each .    
14930 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20    ** comparison 
14940 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
14950 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 65  he affinity of e
14960 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  ach column in ta
14970 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ble.      ** on 
14980 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
14990 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  N operator.  If 
149a0 69 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f  it not, it is no
149b0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a 20 20  t possible to.  
149c0 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 79 20 69      ** use any i
149d0 6e 64 65 78 20 6f 66 20 74 68 65 20 52 48 53 20  ndex of the RHS 
149e0 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20  table.  */.     
149f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
14a00 72 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b  r && affinity_ok
14a10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14a20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c  Expr *pLhs = sql
14a30 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
14a40 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74  ubexpr(pX->pLeft
14a50 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  , i);.        in
14a60 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  t iCol = pEList-
14a70 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  >a[i].pExpr->iCo
14a80 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63 68  lumn;.        ch
14a90 61 72 20 69 64 78 61 66 66 20 3d 20 73 71 6c 69  ar idxaff = sqli
14aa0 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66  te3TableColumnAf
14ab0 66 69 6e 69 74 79 28 70 54 61 62 2c 69 43 6f 6c  finity(pTab,iCol
14ac0 29 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c 65 20  ); /* RHS table 
14ad0 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
14ae0 63 6d 70 61 66 66 20 3d 20 73 71 6c 69 74 65 33  cmpaff = sqlite3
14af0 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
14b00 70 4c 68 73 2c 20 69 64 78 61 66 66 29 3b 0a 20  pLhs, idxaff);. 
14b10 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
14b20 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f   cmpaff==SQLITE_
14b30 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  AFF_BLOB );.    
14b40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d      testcase( cm
14b50 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  paff==SQLITE_AFF
14b60 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20  _TEXT );.       
14b70 20 73 77 69 74 63 68 28 20 63 6d 70 61 66 66 20   switch( cmpaff 
14b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  ){.          cas
14b90 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  e SQLITE_AFF_BLO
14ba0 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  B:.            b
14bb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14bc0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
14bd0 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20 20  TEXT:.          
14be0 20 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f 6d 70    /* sqlite3Comp
14bf0 61 72 65 41 66 66 69 6e 69 74 79 28 29 20 6f 6e  areAffinity() on
14c00 6c 79 20 72 65 74 75 72 6e 73 20 54 45 58 54 20  ly returns TEXT 
14c10 69 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74  if one side or t
14c20 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
14c30 2a 20 6f 74 68 65 72 20 68 61 73 20 6e 6f 20 61  * other has no a
14c40 66 66 69 6e 69 74 79 20 61 6e 64 20 74 68 65 20  ffinity and the 
14c50 6f 74 68 65 72 20 73 69 64 65 20 69 73 20 54 45  other side is TE
14c60 58 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20 20 20  XT.  Hence,.    
14c70 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f          ** the o
14c80 6e 6c 79 20 77 61 79 20 66 6f 72 20 63 6d 70 61  nly way for cmpa
14c90 66 66 20 74 6f 20 62 65 20 54 45 58 54 20 69 73  ff to be TEXT is
14ca0 20 66 6f 72 20 69 64 78 61 66 66 20 74 6f 20 62   for idxaff to b
14cb0 65 20 54 45 58 54 0a 20 20 20 20 20 20 20 20 20  e TEXT.         
14cc0 20 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20 74 68     ** and for th
14cd0 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 4c 48  e term on the LH
14ce0 53 20 6f 66 20 74 68 65 20 49 4e 20 74 6f 20 68  S of the IN to h
14cf0 61 76 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e  ave no affinity.
14d00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
14d10 61 73 73 65 72 74 28 20 69 64 78 61 66 66 3d 3d  assert( idxaff==
14d20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
14d30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
14d40 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14d50 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
14d60 20 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b       affinity_ok
14d70 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65   = sqlite3IsNume
14d80 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 61  ricAffinity(idxa
14d90 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ff);.        }. 
14da0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
14db0 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 7b  ( affinity_ok ){
14dc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72  .        /* Sear
14dd0 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ch for an existi
14de0 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 69  ng index that wi
14df0 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68 69 73  ll work for this
14e00 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
14e10 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
14e20 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
14e30 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 3b  Idx && eType==0;
14e40 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
14e50 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42 69  t){.          Bi
14e60 74 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b 20 20  tmask colUsed;  
14e70 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f      /* Columns o
14e80 66 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64  f the index used
14e90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 42 69   */.          Bi
14ea0 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20 20 20  tmask mCol;     
14eb0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20      /* Mask for 
14ec0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
14ed0 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  mn */.          
14ee0 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  if( pIdx->nColum
14ef0 6e 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74 69 6e  n<nExpr ) contin
14f00 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
14f10 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  ( pIdx->pPartIdx
14f20 57 68 65 72 65 21 3d 30 20 29 20 63 6f 6e 74 69  Where!=0 ) conti
14f30 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  nue;.          /
14f40 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d  * Maximum nColum
14f50 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74 20  n is BMS-2, not 
14f60 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74 20 77  BMS-1, so that w
14f70 65 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20 20  e can compute.  
14f80 20 20 20 20 20 20 20 20 2a 2a 20 42 49 54 4d 41          ** BITMA
14f90 53 4b 28 6e 45 78 70 72 29 20 77 69 74 68 6f 75  SK(nExpr) withou
14fa0 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a 2f  t overflowing */
14fb0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
14fc0 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ase( pIdx->nColu
14fd0 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20  mn==BMS-2 );.   
14fe0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
14ff0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d   pIdx->nColumn==
15000 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  BMS-1 );.       
15010 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f     if( pIdx->nCo
15020 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63 6f  lumn>=BMS-1 ) co
15030 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
15040 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71    if( mustBeUniq
15050 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ue ){.          
15060 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79    if( pIdx->nKey
15070 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  Col>nExpr.      
15080 20 20 20 20 20 20 20 7c 7c 28 70 49 64 78 2d 3e         ||(pIdx->
15090 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26 26  nColumn>nExpr &&
150a0 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28   !IsUniqueIndex(
150b0 70 49 64 78 29 29 0a 20 20 20 20 20 20 20 20 20  pIdx)).         
150c0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
150d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
150e0 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20  * This index is 
150f0 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76 65 72 20  not unique over 
15100 74 68 65 20 49 4e 20 52 48 53 20 63 6f 6c 75 6d  the IN RHS colum
15110 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ns */.          
15120 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
15130 20 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6c    .          col
15140 55 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20 43  Used = 0;   /* C
15150 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 20  olumns of index 
15160 75 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  used so far */. 
15170 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
15180 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
15190 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
151a0 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65  r *pLhs = sqlite
151b0 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
151c0 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69  xpr(pX->pLeft, i
151d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  );.            E
151e0 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69  xpr *pRhs = pELi
151f0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
15200 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c              Coll
15210 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69  Seq *pReq = sqli
15220 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
15230 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
15240 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20  pLhs, pRhs);.   
15250 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
15260 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 61    .            a
15270 73 73 65 72 74 28 20 70 52 65 71 21 3d 30 20 7c  ssert( pReq!=0 |
15280 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d  | pRhs->iColumn=
15290 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 61  =XN_ROWID || pPa
152a0 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 20  rse->nErr );.   
152b0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
152c0 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  ; j<nExpr; j++){
152d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
152e0 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
152f0 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f 6c  n[j]!=pRhs->iCol
15300 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
15310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
15320 73 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f  sert( pIdx->azCo
15330 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20 20  ll[j] );.       
15340 20 20 20 20 20 20 20 69 66 28 20 70 52 65 71 21         if( pReq!
15350 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
15360 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d 65  ICmp(pReq->zName
15370 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  , pIdx->azColl[j
15380 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])!=0 ){.       
15390 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
153a0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
153b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
153c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
153d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
153e0 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29    if( j==nExpr )
153f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15400 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42      mCol = MASKB
15410 49 54 28 6a 29 3b 0a 20 20 20 20 20 20 20 20 20  IT(j);.         
15420 20 20 20 69 66 28 20 6d 43 6f 6c 20 26 20 63 6f     if( mCol & co
15430 6c 55 73 65 64 20 29 20 62 72 65 61 6b 3b 20 2f  lUsed ) break; /
15440 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75 73  * Each column us
15450 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ed only once */.
15460 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55              colU
15470 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20  sed |= mCol;.   
15480 20 20 20 20 20 20 20 20 20 69 66 28 20 61 69 4d           if( aiM
15490 61 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20  ap ) aiMap[i] = 
154a0 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  j;.          }. 
154b0 20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65   .          asse
154c0 72 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c 20  rt( i==nExpr || 
154d0 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42 49  colUsed!=(MASKBI
154e0 54 28 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a 20  T(nExpr)-1) );. 
154f0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c           if( col
15500 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28 6e  Used==(MASKBIT(n
15510 45 78 70 72 29 2d 31 29 20 29 7b 0a 20 20 20 20  Expr)-1) ){.    
15520 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
15530 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
15540 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
15550 65 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20  e index pIdx is 
15560 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  usable */.      
15570 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20        int iAddr 
15580 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15590 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
155a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
155b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  ;.            Ex
155c0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
155d0 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
155e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155f0 20 20 20 20 20 20 20 20 20 22 55 53 49 4e 47 20           "USING 
15600 49 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d  INDEX %s FOR IN-
15610 4f 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e  OPERATOR",pIdx->
15620 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
15630 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15640 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
15650 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64  nRead, iTab, pId
15660 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
15670 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15680 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
15690 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
156a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64  ;.            Vd
156b0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
156c0 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
156d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
156e0 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f  ssert( IN_INDEX_
156f0 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e  INDEX_DESC == IN
15700 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
15710 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
15720 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
15730 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70  EX_INDEX_ASC + p
15740 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
15750 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  0];.  .         
15760 20 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e     if( prRhsHasN
15770 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ull ){.#ifdef SQ
15780 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
15790 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20  MN_USED_MASK.   
157a0 20 20 20 20 20 20 20 20 20 20 20 69 36 34 20 6d             i64 m
157b0 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29  ask = (1<<nExpr)
157c0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
157d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
157e0 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f  Op4Dup8(v, OP_Co
157f0 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20  lumnsUsed, .    
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54                iT
15810 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26  ab, 0, 0, (u8*)&
15820 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b  mask, P4_INT64);
15830 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
15840 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e        *prRhsHasN
15850 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
15860 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
15870 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31      if( nExpr==1
15880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15890 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61      sqlite3SetHa
158a0 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61  sNullFlag(v, iTa
158b0 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  b, *prRhsHasNull
158c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
158d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
158e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
158f0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
15900 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20  (v, iAddr);.    
15910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15920 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76  } /* End loop ov
15930 65 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  er indexes */.  
15940 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28      } /* End if(
15950 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a   affinity_ok ) *
15960 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69  /.    } /* End i
15970 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69  f not an rowid i
15980 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45  ndex */.  } /* E
15990 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70  nd attempt to op
159a0 74 69 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20  timize using an 
159b0 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49  index */..  /* I
159c0 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67  f no preexisting
159d0 20 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61   index is availa
159e0 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63  ble for the IN c
159f0 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49  lause.  ** and I
15a00 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
15a10 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79  an allowed reply
15a20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
15a30 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
15a40 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20  ator is a list, 
15a50 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a 20  not a subquery. 
15a60 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
15a70 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
15a80 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65  or has two or fe
15a90 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20  wer terms,.  ** 
15aa0 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77  then it is not w
15ab0 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e  orth creating an
15ac0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
15ad0 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a   to evaluate.  *
15ae0 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  * the IN operato
15af0 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49  r so return IN_I
15b00 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a  NDEX_NOOP..  */.
15b10 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20    if( eType==0. 
15b20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20    && (inFlags & 
15b30 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
15b40 29 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73  ).   && !ExprHas
15b50 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
15b60 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26  xIsSelect).   &&
15b70 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49   (!sqlite3InRhsI
15b80 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c  sConstant(pX) ||
15b90 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pX->x.pList->nE
15ba0 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20  xpr<=2).  ){.   
15bb0 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
15bc0 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69  X_NOOP;.  }..  i
15bd0 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20  f( eType==0 ){. 
15be0 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20     /* Could not 
15bf0 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67  find an existing
15c00 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
15c10 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48  to use as the RH
15c20 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a  S b-tree..    **
15c30 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f   We will have to
15c40 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68   generate an eph
15c50 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20  emeral table to 
15c60 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20  do the job..    
15c70 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65 64  */.    u32 saved
15c80 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
15c90 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
15ca0 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76  .    int rMayHav
15cb0 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65  eNull = 0;.    e
15cc0 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
15cd0 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46  EPH;.    if( inF
15ce0 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
15cf0 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50  LOOP ){.      pP
15d00 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
15d10 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
15d20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
15d30 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73   ){.      *prRhs
15d40 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61  HasNull = rMayHa
15d50 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  veNull = ++pPars
15d60 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20  e->nMem;.    }. 
15d70 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
15d80 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20  p==TK_IN );.    
15d90 73 71 6c 69 74 65 33 43 6f 64 65 52 68 73 4f 66  sqlite3CodeRhsOf
15da0 49 4e 28 70 50 61 72 73 65 2c 20 70 58 2c 20 69  IN(pParse, pX, i
15db0 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20 72 4d  Tab);.    if( rM
15dc0 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20  ayHaveNull ){.  
15dd0 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61      sqlite3SetHa
15de0 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61  sNullFlag(v, iTa
15df0 62 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29  b, rMayHaveNull)
15e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
15e10 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
15e20 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
15e30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d  ;.  }..  if( aiM
15e40 61 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f  ap && eType!=IN_
15e50 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
15e60 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44  && eType!=IN_IND
15e70 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b  EX_INDEX_DESC ){
15e80 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  .    int i, n;. 
15e90 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78     n = sqlite3Ex
15ea0 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d  prVectorSize(pX-
15eb0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72  >pLeft);.    for
15ec0 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20  (i=0; i<n; i++) 
15ed0 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20  aiMap[i] = i;.  
15ee0 7d 0a 20 20 2a 70 69 54 61 62 20 3d 20 69 54 61  }.  *piTab = iTa
15ef0 62 3b 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70  b;.  return eTyp
15f00 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  e;.}.#endif..#if
15f10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15f20 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
15f30 41 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69  Argument pExpr i
15f40 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49  s an (?, ?...) I
15f50 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  N(...) expressio
15f60 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  n. This .** func
15f70 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
15f80 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c  nd returns a nul
15f90 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
15fa0 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a  ng containing .*
15fb0 2a 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73  * the affinities
15fc0 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
15fd0 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  each column of t
15fe0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a  he comparison..*
15ff0 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72  *.** It is the r
16000 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
16010 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
16020 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72  nsure that the r
16030 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e  eturned.** strin
16040 67 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20  g is eventually 
16050 66 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69  freed using sqli
16060 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a  te3DbFree()..*/.
16070 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70  static char *exp
16080 72 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73  rINAffinity(Pars
16090 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
160a0 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20  *pExpr){.  Expr 
160b0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
160c0 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61  pLeft;.  int nVa
160d0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  l = sqlite3ExprV
160e0 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29  ectorSize(pLeft)
160f0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  ;.  Select *pSel
16100 65 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c  ect = (pExpr->fl
16110 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
16120 63 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70  ct) ? pExpr->x.p
16130 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68  Select : 0;.  ch
16140 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73  ar *zRet;..  ass
16150 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
16160 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20  TK_IN );.  zRet 
16170 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
16180 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c  cRaw(pParse->db,
16190 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20   nVal+1);.  if( 
161a0 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  zRet ){.    int 
161b0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
161c0 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nVal; i++){.  
161d0 20 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73      Expr *pA = s
161e0 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
161f0 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
16200 69 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61  i);.      char a
16210 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
16220 66 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20  finity(pA);.    
16230 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
16240 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d  .        zRet[i]
16250 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
16260 65 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63  eAffinity(pSelec
16270 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
16280 70 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20  pExpr, a);.     
16290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
162a0 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20  zRet[i] = a;.   
162b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
162c0 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27  Ret[nVal] = '\0'
162d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
162e0 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  Ret;.}.#endif..#
162f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16300 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
16310 2a 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65  * Load the Parse
16320 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
16330 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
16340 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72  ment with an err
16350 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f  or .** message o
16360 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
16370 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20  *   "sub-select 
16380 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e  returns N column
16390 73 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a  s - expected M".
163a0 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74  */   .void sqlit
163b0 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
163c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
163d0 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74  int nActual, int
163e0 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e   nExpect){.  con
163f0 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20  st char *zFmt = 
16400 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75  "sub-select retu
16410 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d  rns %d columns -
16420 20 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20   expected %d";. 
16430 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16440 28 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e  (pParse, zFmt, n
16450 41 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29  Actual, nExpect)
16460 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
16470 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * Expression pEx
16480 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 20 74  pr is a vector t
16490 68 61 74 20 68 61 73 20 62 65 65 6e 20 75 73 65  hat has been use
164a0 64 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20 77  d in a context w
164b0 68 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  here.** it is no
164c0 74 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66 20  t permitted. If 
164d0 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73  pExpr is a sub-s
164e0 65 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74 68  elect vector, th
164f0 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c  is routine .** l
16500 6f 61 64 73 20 74 68 65 20 50 61 72 73 65 20 6f  oads the Parse o
16510 62 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65 73  bject with a mes
16520 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  sage of the form
16530 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73  :.**.**   "sub-s
16540 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20  elect returns N 
16550 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74  columns - expect
16560 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ed 1".**.** Or, 
16570 69 66 20 69 74 20 69 73 20 61 20 72 65 67 75 6c  if it is a regul
16580 61 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f 72  ar scalar vector
16590 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76  :.**.**   "row v
165a0 61 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f  alue misused".*/
165b0 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33     .void sqlite3
165c0 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 50  VectorErrorMsg(P
165d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
165e0 70 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e  pr *pExpr){.#ifn
165f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16600 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 70  SUBQUERY.  if( p
16610 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
16620 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20  _xIsSelect ){.  
16630 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65    sqlite3Subsele
16640 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
16650 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
16660 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
16670 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e   1);.  }else.#en
16680 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
16690 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
166a0 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
166b0 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a  isused");.  }.}.
166c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
166d0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
166e0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
166f0 65 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 73  e that will cons
16700 74 72 75 63 74 20 61 6e 20 65 70 68 65 6d 65 72  truct an ephemer
16710 61 6c 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  al table contain
16720 69 6e 67 20 61 6c 6c 20 74 65 72 6d 73 0a 2a 2a  ing all terms.**
16730 20 69 6e 20 74 68 65 20 52 48 53 20 6f 66 20 61   in the RHS of a
16740 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20  n IN operator.  
16750 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  The IN operator 
16760 63 61 6e 20 62 65 20 69 6e 20 65 69 74 68 65 72  can be in either
16770 20 6f 66 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73   of two.** forms
16780 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 49 4e  :.**.**     x IN
16790 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20   (4,5,11)       
167a0 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65         -- IN ope
167b0 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20  rator with list 
167c0 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  on right-hand si
167d0 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  de.**     x IN (
167e0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
167f0 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
16800 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72  tor with subquer
16810 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a  y on the right.*
16820 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70  *.** The pExpr p
16830 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
16840 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68  IN operator.  Th
16850 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
16860 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 74  for the.** const
16870 72 75 63 74 65 64 20 65 70 68 65 72 6d 65 72 61  ructed ephermera
16880 6c 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  l table is retur
16890 6e 65 64 2e 20 20 54 68 65 20 66 69 72 73 74 20  ned.  The first 
168a0 74 69 6d 65 20 74 68 65 20 65 70 68 65 6d 65 72  time the ephemer
168b0 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 63  al.** table is c
168c0 6f 6d 70 75 74 65 64 2c 20 74 68 65 20 63 75 72  omputed, the cur
168d0 73 6f 72 20 6e 75 6d 62 65 72 20 69 73 20 61 6c  sor number is al
168e0 73 6f 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  so stored in pEx
168f0 70 72 2d 3e 69 54 61 62 6c 65 2c 0a 2a 2a 20 68  pr->iTable,.** h
16900 6f 77 65 76 65 72 20 74 68 65 20 63 75 72 73 6f  owever the curso
16910 72 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  r number returne
16920 64 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74  d might not be t
16930 68 65 20 73 61 6d 65 2c 20 61 73 20 69 74 20 6d  he same, as it m
16940 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 62 65 65  ight.** have bee
16950 6e 20 64 75 70 6c 69 63 61 74 65 64 20 75 73 69  n duplicated usi
16960 6e 67 20 4f 50 5f 4f 70 65 6e 44 75 70 2e 0a 2a  ng OP_OpenDup..*
16970 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 48 53 20  *.** If the LHS 
16980 65 78 70 72 65 73 73 69 6f 6e 20 28 22 78 22 20  expression ("x" 
16990 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 73 29  in the examples)
169a0 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
169b0 75 65 2c 20 6f 72 0a 2a 2a 20 74 68 65 20 53 45  ue, or.** the SE
169c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72  LECT statement r
169d0 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20  eturns a column 
169e0 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
169f0 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74  affinity of that
16a00 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73  .** column is us
16a10 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20  ed to build the 
16a20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62  index keys. If b
16a30 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a  oth 'x' and the.
16a40 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  ** SELECT... sta
16a50 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
16a60 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
16a70 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65   affinity is use
16a80 64 0a 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63  d.** if either c
16a90 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
16aa0 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
16ab0 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
16ac0 72 0a 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65  r.** 'x' nor the
16ad0 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
16ae0 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
16af0 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
16b00 66 66 69 6e 69 74 79 0a 2a 2a 20 69 73 20 75 73  ffinity.** is us
16b10 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
16b20 74 65 33 43 6f 64 65 52 68 73 4f 66 49 4e 28 0a  te3CodeRhsOfIN(.
16b30 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
16b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
16b50 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
16b60 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
16b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16b80 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
16b90 20 20 69 6e 74 20 69 54 61 62 20 20 20 20 20 20    int iTab      
16ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
16bb0 20 74 68 69 73 20 63 75 72 73 6f 72 20 6e 75 6d   this cursor num
16bc0 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ber */.){.  int 
16bd0 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 20 20 20  addrOnce = 0;   
16be0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
16bf0 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4f 6e 63  ss of the OP_Onc
16c00 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74  e instruction at
16c10 20 74 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64   top */.  int ad
16c20 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
16c30 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
16c40 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   of OP_OpenEphem
16c50 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
16c60 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
16c70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
16c80 20 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20    /* the LHS of 
16c90 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
16ca0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
16cb0 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
16cc0 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
16cd0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  ion */.  int nVa
16ce0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
16cf0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
16d00 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a  vector pLeft */.
16d10 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
16d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16d30 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
16d40 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
16d50 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20  nstruction */.. 
16d60 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
16d70 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
16d80 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  =0 );..  /* The 
16d90 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68  evaluation of th
16da0 65 20 49 4e 20 6d 75 73 74 20 62 65 20 72 65 70  e IN must be rep
16db0 65 61 74 65 64 20 65 76 65 72 79 20 74 69 6d 65  eated every time
16dc0 20 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f   it.  ** is enco
16dd0 75 6e 74 65 72 65 64 20 69 66 20 61 6e 79 20 6f  untered if any o
16de0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
16df0 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  is true:.  **.  
16e00 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
16e10 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
16e20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
16e30 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20  query.  **    * 
16e40 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
16e50 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65  side is an expre
16e60 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ssion list conta
16e70 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a  ining variables.
16e80 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72    **    *  We ar
16e90 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67  e inside a trigg
16ea0 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  er.  **.  ** If 
16eb0 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
16ec0 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e   are false, then
16ed0 20 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   we can compute 
16ee0 74 68 65 20 52 48 53 20 6a 75 73 74 20 6f 6e 63  the RHS just onc
16ef0 65 0a 20 20 2a 2a 20 61 6e 64 20 72 65 75 73 65  e.  ** and reuse
16f00 20 69 74 20 6d 61 6e 79 20 6e 61 6d 65 73 2e 0a   it many names..
16f10 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
16f20 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
16f30 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
16f40 20 26 26 20 70 50 61 72 73 65 2d 3e 69 53 65 6c   && pParse->iSel
16f50 66 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  fTab==0 ){.    /
16f60 2a 20 52 65 75 73 65 20 6f 66 20 74 68 65 20 52  * Reuse of the R
16f70 48 53 20 69 73 20 61 6c 6c 6f 77 65 64 20 2a 2f  HS is allowed */
16f80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
16f90 72 6f 75 74 69 6e 65 20 68 61 73 20 61 6c 72 65  routine has alre
16fa0 61 64 79 20 62 65 65 6e 20 63 6f 64 65 64 2c 20  ady been coded, 
16fb0 62 75 74 20 74 68 65 20 70 72 65 76 69 6f 75 73  but the previous
16fc0 20 63 6f 64 65 0a 20 20 20 20 2a 2a 20 6d 69 67   code.    ** mig
16fd0 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
16fe0 20 69 6e 76 6f 6b 65 64 20 79 65 74 2c 20 73 6f   invoked yet, so
16ff0 20 69 6e 76 6f 6b 65 20 69 74 20 6e 6f 77 20 61   invoke it now a
17000 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  s a subroutine. 
17010 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17020 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
17030 70 45 78 70 72 2c 20 45 50 5f 53 75 62 72 74 6e  pExpr, EP_Subrtn
17040 29 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f  ) ){.      addrO
17050 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nce = sqlite3Vdb
17060 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
17070 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ce); VdbeCoverag
17080 65 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e(v);.      if( 
17090 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
170a0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
170b0 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
170c0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
170d0 28 28 70 50 61 72 73 65 2c 20 30 2c 20 22 52 45  ((pParse, 0, "RE
170e0 55 53 45 20 4c 49 53 54 20 53 55 42 51 55 45 52  USE LIST SUBQUER
170f0 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  Y %d",.         
17100 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53       pExpr->x.pS
17110 65 6c 65 63 74 2d 3e 73 65 6c 49 64 29 29 3b 0a  elect->selId));.
17120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
17130 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17140 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 45 78  v, OP_Gosub, pEx
17150 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74  pr->y.sub.regRet
17160 75 72 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  urn,.           
17170 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
17180 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 29  pr->y.sub.iAddr)
17190 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
171a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
171b0 4f 70 65 6e 44 75 70 2c 20 69 54 61 62 2c 20 70  OpenDup, iTab, p
171c0 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
171d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
171e0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
171f0 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Once);.      ret
17200 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  urn;.    }..    
17210 2f 2a 20 42 65 67 69 6e 20 63 6f 64 69 6e 67 20  /* Begin coding 
17220 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  the subroutine *
17230 2f 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  /.    ExprSetPro
17240 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
17250 53 75 62 72 74 6e 29 3b 0a 20 20 20 20 70 45 78  Subrtn);.    pEx
17260 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74  pr->y.sub.regRet
17270 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
17280 6e 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d  nMem;.    pExpr-
17290 3e 79 2e 73 75 62 2e 69 41 64 64 72 20 3d 0a 20  >y.sub.iAddr =. 
172a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
172b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
172c0 65 67 65 72 2c 20 30 2c 20 70 45 78 70 72 2d 3e  eger, 0, pExpr->
172d0 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29  y.sub.regReturn)
172e0 20 2b 20 31 3b 0a 20 20 20 20 56 64 62 65 43 6f   + 1;.    VdbeCo
172f0 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 74 75 72  mment((v, "retur
17300 6e 20 61 64 64 72 65 73 73 22 29 29 3b 0a 0a 20  n address"));.. 
17310 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
17320 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
17330 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
17340 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17350 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
17360 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20   see if this is 
17370 61 20 76 65 63 74 6f 72 20 49 4e 20 6f 70 65 72  a vector IN oper
17380 61 74 6f 72 20 2a 2f 0a 20 20 70 4c 65 66 74 20  ator */.  pLeft 
17390 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
173a0 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    nVal = sqlite3
173b0 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
173c0 4c 65 66 74 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  Left);..  /* Con
173d0 73 74 72 75 63 74 20 74 68 65 20 65 70 68 65 6d  struct the ephem
173e0 65 72 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  eral table that 
173f0 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65  will contain the
17400 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 2a 2a   content of.  **
17410 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
17420 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
17430 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
17440 69 54 61 62 3b 0a 20 20 61 64 64 72 20 3d 20 73  iTab;.  addr = s
17450 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17460 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
17470 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61  eral, pExpr->iTa
17480 62 6c 65 2c 20 6e 56 61 6c 29 3b 0a 23 69 66 64  ble, nVal);.#ifd
17490 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
174a0 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
174b0 53 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  S.  if( ExprHasP
174c0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
174d0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
174e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
174f0 28 76 2c 20 22 52 65 73 75 6c 74 20 6f 66 20 53  (v, "Result of S
17500 45 4c 45 43 54 20 25 75 22 2c 20 70 45 78 70 72  ELECT %u", pExpr
17510 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 73 65 6c  ->x.pSelect->sel
17520 49 64 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Id));.  }else{. 
17530 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
17540 76 2c 20 22 52 48 53 20 6f 66 20 49 4e 20 6f 70  v, "RHS of IN op
17550 65 72 61 74 6f 72 22 29 29 3b 0a 20 20 7d 0a 23  erator"));.  }.#
17560 65 6e 64 69 66 0a 20 20 70 4b 65 79 49 6e 66 6f  endif.  pKeyInfo
17570 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
17580 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
17590 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20  b, nVal, 1);..  
175a0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
175b0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
175c0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
175d0 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65  /* Case 1:     e
175e0 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
175f0 2e 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ..).    **.    *
17600 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
17610 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73  to write the res
17620 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
17630 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ct into the temp
17640 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62  orary.    ** tab
17650 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  le allocated and
17660 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20   opened above.. 
17670 20 20 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74     */.    Select
17680 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70   *pSelect = pExp
17690 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
176a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
176b0 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
176c0 4c 69 73 74 3b 0a 0a 20 20 20 20 45 78 70 6c 61  List;..    Expla
176d0 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
176e0 72 73 65 2c 20 31 2c 20 22 25 73 4c 49 53 54 20  rse, 1, "%sLIST 
176f0 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20  SUBQUERY %d",.  
17700 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65 3f 22        addrOnce?"
17710 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c  ":"CORRELATED ",
17720 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64 0a   pSelect->selId.
17730 20 20 20 20 29 29 3b 0a 20 20 20 20 2f 2a 20 49      ));.    /* I
17740 66 20 74 68 65 20 4c 48 53 20 61 6e 64 20 52 48  f the LHS and RH
17750 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
17760 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74 63  ator do not matc
17770 68 2c 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 65  h, that.    ** e
17780 72 72 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62  rror will have b
17790 65 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20  een caught long 
177a0 62 65 66 6f 72 65 20 77 65 20 72 65 61 63 68 20  before we reach 
177b0 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20  this point. */. 
177c0 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 45     if( ALWAYS(pE
177d0 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61  List->nExpr==nVa
177e0 6c 29 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  l) ){.      Sele
177f0 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
17800 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
17810 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
17820 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
17830 5f 53 65 74 2c 20 69 54 61 62 29 3b 0a 20 20 20  _Set, iTab);.   
17840 20 20 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74     dest.zAffSdst
17850 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74   = exprINAffinit
17860 79 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  y(pParse, pExpr)
17870 3b 0a 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d  ;.      pSelect-
17880 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
17890 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 65     testcase( pSe
178a0 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
178b0 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a   SF_Distinct );.
178c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
178d0 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f  pKeyInfo==0 ); /
178e0 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20  * Caused by OOM 
178f0 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  in sqlite3KeyInf
17900 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20  oAlloc() */.    
17910 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
17920 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
17930 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  ect, &dest) ){. 
17940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
17950 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
17960 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b   dest.zAffSdst);
17970 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17980 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
17990 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  yInfo);.        
179a0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
179b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
179c0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
179d0 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a  dest.zAffSdst);.
179e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
179f0 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20  eyInfo!=0 ); /* 
17a00 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65  OOM will cause e
17a10 78 69 74 20 61 66 74 65 72 20 73 71 6c 69 74 65  xit after sqlite
17a20 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20  3Select() */.   
17a30 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
17a40 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  t!=0 );.      as
17a50 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45  sert( pEList->nE
17a60 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  xpr>0 );.      a
17a70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
17a80 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
17a90 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20  (pKeyInfo) );.  
17aa0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
17ab0 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Val; i++){.     
17ac0 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
17ad0 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
17ae0 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29  ubexpr(pLeft, i)
17af0 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e  ;.        pKeyIn
17b00 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  fo->aColl[i] = s
17b10 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
17b20 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20  areCollSeq(.    
17b30 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
17b40 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  p, pEList->a[i].
17b50 70 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b  pExpr.        );
17b60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17b70 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
17b80 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
17b90 21 3d 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43  !=0) ){.    /* C
17ba0 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20  ase 2:     expr 
17bb0 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20  IN (exprlist).  
17bc0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20    **.    ** For 
17bd0 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c  each expression,
17be0 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20   build an index 
17bf0 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61  key from the eva
17c00 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  luation and.    
17c10 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  ** store it in t
17c20 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
17c30 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  le. If <expr> is
17c40 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
17c50 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  use.    ** that 
17c60 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
17c70 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
17c80 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
17c90 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
17ca0 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65  ** a column, use
17cb0 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
17cc0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68  y..    */.    ch
17cd0 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20  ar affinity;    
17ce0 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
17cf0 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f  ity of the LHS o
17d00 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20  f the IN */.    
17d10 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c  int i;.    ExprL
17d20 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
17d30 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
17d40 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
17d50 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
17d60 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
17d70 3b 0a 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d  ;.    affinity =
17d80 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
17d90 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20  nity(pLeft);.   
17da0 20 69 66 28 20 61 66 66 69 6e 69 74 79 3c 3d 53   if( affinity<=S
17db0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
17dc0 7b 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79  {.      affinity
17dd0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
17de0 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OB;.    }.    if
17df0 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
17e00 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
17e10 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
17e20 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20  eable(pKeyInfo) 
17e30 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  );.      pKeyInf
17e40 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71  o->aColl[0] = sq
17e50 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
17e60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
17e70 70 4c 65 66 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  pLeft);.    }.. 
17e80 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
17e90 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
17ea0 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e  on in <exprlist>
17eb0 2e 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71  . */.    r1 = sq
17ec0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
17ed0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20  pParse);.    r2 
17ee0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
17ef0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
17f00 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45   for(i=pList->nE
17f10 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  xpr, pItem=pList
17f20 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
17f30 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45  Item++){.      E
17f40 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d  xpr *pE2 = pItem
17f50 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20  ->pExpr;..      
17f60 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  /* If the expres
17f70 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73  sion is not cons
17f80 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c  tant then we wil
17f90 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  l need to.      
17fa0 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ** disable the t
17fb0 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e  est that was gen
17fc0 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61  erated above tha
17fd0 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20  t makes sure.   
17fe0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
17ff0 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e  only executes on
18000 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72  ce.  Because for
18010 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a   a non-constant.
18020 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
18030 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72  ion we need to r
18040 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65  erun this code e
18050 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ach time..      
18060 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 61 64 64  */.      if( add
18070 72 4f 6e 63 65 20 26 26 20 21 73 71 6c 69 74 65  rOnce && !sqlite
18080 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
18090 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
180a0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
180b0 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 4f  eToNoop(v, addrO
180c0 6e 63 65 29 3b 0a 20 20 20 20 20 20 20 20 45 78  nce);.        Ex
180d0 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
180e0 70 45 78 70 72 2c 20 45 50 5f 53 75 62 72 74 6e  pExpr, EP_Subrtn
180f0 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f  );.        addrO
18100 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nce = 0;.      }
18110 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75  ..      /* Evalu
18120 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
18130 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
18140 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
18150 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 72 33  able */.      r3
18160 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
18170 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
18180 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
18190 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
181a0 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
181b0 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20  ord, r3, 1, r2, 
181c0 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  &affinity, 1);. 
181d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
181e0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
181f0 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c  IdxInsert, iTab,
18200 20 72 32 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20   r2, r3, 1);.   
18210 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65   }.    sqlite3Re
18220 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18230 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 73 71  rse, r1);.    sq
18240 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
18250 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
18260 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 49  .  }.  if( pKeyI
18270 6e 66 6f 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nfo ){.    sqlit
18280 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
18290 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29  , addr, (void *)
182a0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
182b0 49 4e 46 4f 29 3b 0a 20 20 7d 0a 20 20 69 66 28  INFO);.  }.  if(
182c0 20 61 64 64 72 4f 6e 63 65 20 29 7b 0a 20 20 20   addrOnce ){.   
182d0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
182e0 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65  Here(v, addrOnce
182f0 29 3b 0a 20 20 20 20 2f 2a 20 53 75 62 72 6f 75  );.    /* Subrou
18300 74 69 6e 65 20 72 65 74 75 72 6e 20 2a 2f 0a 20  tine return */. 
18310 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18320 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
18330 6e 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e  n, pExpr->y.sub.
18340 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
18350 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
18360 65 50 31 28 76 2c 20 70 45 78 70 72 2d 3e 79 2e  eP1(v, pExpr->y.
18370 73 75 62 2e 69 41 64 64 72 2d 31 2c 20 73 71 6c  sub.iAddr-1, sql
18380 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
18390 64 64 72 28 76 29 2d 31 29 3b 0a 20 20 7d 0a 7d  ddr(v)-1);.  }.}
183a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
183b0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
183c0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  */../*.** Genera
183d0 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c  te code for scal
183e0 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73  ar subqueries us
183f0 65 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79  ed as a subquery
18400 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6f   expression.** o
18410 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  r EXISTS operato
18420 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45  r:.**.**     (SE
18430 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
18440 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75          -- subqu
18450 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54  ery.**     EXIST
18460 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  S (SELECT a FROM
18470 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20   b)   -- EXISTS 
18480 73 75 62 71 75 65 72 79 0a 2a 2a 0a 2a 2a 20 54  subquery.**.** T
18490 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74  he pExpr paramet
184a0 65 72 20 69 73 20 74 68 65 20 53 45 4c 45 43 54  er is the SELECT
184b0 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
184c0 74 6f 72 20 74 6f 20 62 65 20 63 6f 64 65 64 2e  tor to be coded.
184d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69 73  .**.** The regis
184e0 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ter that holds t
184f0 68 65 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20  he result.  For 
18500 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 53  a multi-column S
18510 45 4c 45 43 54 2c 20 0a 2a 2a 20 74 68 65 20 72  ELECT, .** the r
18520 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20  esult is stored 
18530 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20  in a contiguous 
18540 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
18550 72 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65  rs and the.** re
18560 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
18570 65 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68  e register of th
18580 65 20 6c 65 66 74 2d 6d 6f 73 74 20 72 65 73 75  e left-most resu
18590 6c 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 52 65  lt column..** Re
185a0 74 75 72 6e 20 30 20 69 66 20 61 6e 20 65 72 72  turn 0 if an err
185b0 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23 69  or occurs..*/.#i
185c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
185d0 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
185e0 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
185f0 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
18600 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
18610 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20  .  int addrOnce 
18620 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
18630 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
18640 4f 6e 63 65 20 61 74 20 74 6f 70 20 6f 66 20 73  Once at top of s
18650 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18660 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20  nt rReg = 0;    
18670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18680 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72  gister storing r
18690 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 53 65  esulting */.  Se
186a0 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20  lect *pSel;     
186b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
186c0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
186d0 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 53 65 6c   encode */.  Sel
186e0 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20  ectDest dest;   
186f0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
18700 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c  to deal with SEL
18710 45 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  ECT result */.  
18720 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20  int nReg;       
18730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18740 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
18750 63 61 74 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  cate */.  Expr *
18760 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  pLimit;         
18770 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6c 69 6d        /* New lim
18780 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  it expression */
18790 0a 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ..  Vdbe *v = pP
187a0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
187b0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
187c0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
187d0 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
187e0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
187f0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
18800 45 43 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ECT );.  assert(
18810 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
18820 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e  XISTS || pExpr->
18830 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
18840 0a 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48  .  assert( ExprH
18850 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18860 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
18870 29 3b 0a 20 20 70 53 65 6c 20 3d 20 70 45 78 70  );.  pSel = pExp
18880 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 0a 20  r->x.pSelect;.. 
18890 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74 69   /* The evaluati
188a0 6f 6e 20 6f 66 20 74 68 65 20 45 58 49 53 54 53  on of the EXISTS
188b0 2f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20  /SELECT must be 
188c0 72 65 70 65 61 74 65 64 20 65 76 65 72 79 20 74  repeated every t
188d0 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 65  ime it.  ** is e
188e0 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61 6e  ncountered if an
188f0 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
18900 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a  ng is true:.  **
18910 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
18920 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
18930 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
18940 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20  subquery.  **   
18950 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
18960 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78  nd side is an ex
18970 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
18980 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c  ntaining variabl
18990 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65  es.  **    *  We
189a0 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72   are inside a tr
189b0 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  igger.  **.  ** 
189c0 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
189d0 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74  ove are false, t
189e0 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74  hen we can run t
189f0 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e  his code just on
18a00 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65  ce.  ** save the
18a10 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65   results, and re
18a20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73  use the same res
18a30 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ult on subsequen
18a40 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20  t invocations.. 
18a50 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
18a60 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18a70 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20  , EP_VarSelect) 
18a80 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
18a90 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 61 6c  s routine has al
18aa0 72 65 61 64 79 20 62 65 65 6e 20 63 6f 64 65 64  ready been coded
18ab0 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 69 74  , then invoke it
18ac0 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 73 75 62   as a.    ** sub
18ad0 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20  routine. */.    
18ae0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
18af0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 75  rty(pExpr, EP_Su
18b00 62 72 74 6e 29 20 29 7b 0a 20 20 20 20 20 20 45  brtn) ){.      E
18b10 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
18b20 28 70 50 61 72 73 65 2c 20 30 2c 20 22 52 45 55  (pParse, 0, "REU
18b30 53 45 20 53 55 42 51 55 45 52 59 20 25 64 22 2c  SE SUBQUERY %d",
18b40 20 70 53 65 6c 2d 3e 73 65 6c 49 64 29 29 3b 0a   pSel->selId));.
18b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18b60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
18b70 73 75 62 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75  sub, pExpr->y.su
18b80 62 2e 72 65 67 52 65 74 75 72 6e 2c 0a 20 20 20  b.regReturn,.   
18b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ba0 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75       pExpr->y.su
18bb0 62 2e 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  b.iAddr);.      
18bc0 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 54  return pExpr->iT
18bd0 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  able;.    }..   
18be0 20 2f 2a 20 42 65 67 69 6e 20 63 6f 64 69 6e 67   /* Begin coding
18bf0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
18c00 2a 2f 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  */.    ExprSetPr
18c10 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
18c20 5f 53 75 62 72 74 6e 29 3b 0a 20 20 20 20 70 45  _Subrtn);.    pE
18c30 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65  xpr->y.sub.regRe
18c40 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
18c50 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72  >nMem;.    pExpr
18c60 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 20 3d 0a  ->y.sub.iAddr =.
18c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18c80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
18c90 74 65 67 65 72 2c 20 30 2c 20 70 45 78 70 72 2d  teger, 0, pExpr-
18ca0 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e  >y.sub.regReturn
18cb0 29 20 2b 20 31 3b 0a 20 20 20 20 56 64 62 65 43  ) + 1;.    VdbeC
18cc0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 74 75  omment((v, "retu
18cd0 72 6e 20 61 64 64 72 65 73 73 22 29 29 3b 0a 0a  rn address"));..
18ce0 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73      addrOnce = s
18cf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
18d00 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
18d10 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18d20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 20 61   }.  .  /* For a
18d30 20 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74   SELECT, generat
18d40 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
18d50 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c  e values for all
18d60 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a   columns of.  **
18d70 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 69   the first row i
18d80 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20  nto an array of 
18d90 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 72 65  registers and re
18da0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
18db0 66 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  f.  ** the first
18dc0 20 72 65 67 69 73 74 65 72 2e 0a 20 20 2a 2a 0a   register..  **.
18dd0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
18de0 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65  an EXISTS, write
18df0 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e   an integer 0 (n
18e00 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20  ot exists) or 1 
18e10 28 65 78 69 73 74 73 29 0a 20 20 2a 2a 20 69 6e  (exists).  ** in
18e20 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e  to a register an
18e30 64 20 72 65 74 75 72 6e 20 74 68 61 74 20 72 65  d return that re
18e40 67 69 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20  gister number.. 
18e50 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 62 6f 74 68   **.  ** In both
18e60 20 63 61 73 65 73 2c 20 74 68 65 20 71 75 65 72   cases, the quer
18e70 79 20 69 73 20 61 75 67 6d 65 6e 74 65 64 20 77  y is augmented w
18e80 69 74 68 20 22 4c 49 4d 49 54 20 31 22 2e 20 20  ith "LIMIT 1".  
18e90 41 6e 79 20 0a 20 20 2a 2a 20 70 72 65 65 78 69  Any .  ** preexi
18ea0 73 74 69 6e 67 20 6c 69 6d 69 74 20 69 73 20 64  sting limit is d
18eb0 69 73 63 61 72 64 65 64 20 69 6e 20 70 6c 61 63  iscarded in plac
18ec0 65 20 6f 66 20 74 68 65 20 6e 65 77 20 4c 49 4d  e of the new LIM
18ed0 49 54 20 31 2e 0a 20 20 2a 2f 0a 20 20 45 78 70  IT 1..  */.  Exp
18ee0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
18ef0 50 61 72 73 65 2c 20 31 2c 20 22 25 73 53 43 41  Parse, 1, "%sSCA
18f00 4c 41 52 20 53 55 42 51 55 45 52 59 20 25 64 22  LAR SUBQUERY %d"
18f10 2c 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f 6e  ,.        addrOn
18f20 63 65 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45  ce?"":"CORRELATE
18f30 44 20 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64  D ", pSel->selId
18f40 29 29 3b 0a 20 20 6e 52 65 67 20 3d 20 70 45 78  ));.  nReg = pEx
18f50 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
18f60 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  T ? pSel->pEList
18f70 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20 20 73  ->nExpr : 1;.  s
18f80 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
18f90 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 70  Init(&dest, 0, p
18fa0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a  Parse->nMem+1);.
18fb0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
18fc0 3d 20 6e 52 65 67 3b 0a 20 20 69 66 28 20 70 45  = nReg;.  if( pE
18fd0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
18fe0 43 54 20 29 7b 0a 20 20 20 20 64 65 73 74 2e 65  CT ){.    dest.e
18ff0 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a  Dest = SRT_Mem;.
19000 20 20 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d      dest.iSdst =
19010 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
19020 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20 3d 20     dest.nSdst = 
19030 6e 52 65 67 3b 0a 20 20 20 20 73 71 6c 69 74 65  nReg;.    sqlite
19040 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19050 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e  P_Null, 0, dest.
19060 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53  iSDParm, dest.iS
19070 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20  DParm+nReg-1);. 
19080 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
19090 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72  v, "Init subquer
190a0 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 7d  y result"));.  }
190b0 65 6c 73 65 7b 0a 20 20 20 20 64 65 73 74 2e 65  else{.    dest.e
190c0 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74  Dest = SRT_Exist
190d0 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  s;.    sqlite3Vd
190e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
190f0 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e  nteger, 0, dest.
19100 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 56 64  iSDParm);.    Vd
19110 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
19120 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c  nit EXISTS resul
19130 74 22 29 29 3b 0a 20 20 7d 0a 20 20 70 4c 69 6d  t"));.  }.  pLim
19140 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
19150 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
19160 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 26 73 71  , TK_INTEGER,&sq
19170 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
19180 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65  ], 0);.  if( pSe
19190 6c 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  l->pLimit ){.   
191a0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
191b0 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
191c0 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65  Sel->pLimit->pLe
191d0 66 74 29 3b 0a 20 20 20 20 70 53 65 6c 2d 3e 70  ft);.    pSel->p
191e0 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 3d 20 70  Limit->pLeft = p
191f0 4c 69 6d 69 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Limit;.  }else{.
19200 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74      pSel->pLimit
19210 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
19220 70 50 61 72 73 65 2c 20 54 4b 5f 4c 49 4d 49 54  pParse, TK_LIMIT
19230 2c 20 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  , pLimit, 0);.  
19240 7d 0a 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74  }.  pSel->iLimit
19250 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69   = 0;.  if( sqli
19260 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
19270 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29  , pSel, &dest) )
19280 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
19290 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69 54 61    }.  pExpr->iTa
192a0 62 6c 65 20 3d 20 72 52 65 67 20 3d 20 64 65 73  ble = rReg = des
192b0 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 45 78 70  t.iSDParm;.  Exp
192c0 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
192d0 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
192e0 63 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 4f  ce);.  if( addrO
192f0 6e 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nce ){.    sqlit
19300 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
19310 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 0a 20 20  , addrOnce);..  
19320 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
19330 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 73 71  return */.    sq
19340 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
19350 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 45  v, OP_Return, pE
19360 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65  xpr->y.sub.regRe
19370 74 75 72 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  turn);.    sqlit
19380 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
19390 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69  , pExpr->y.sub.i
193a0 41 64 64 72 2d 31 2c 20 73 71 6c 69 74 65 33 56  Addr-1, sqlite3V
193b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
193c0 29 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  )-1);.  }..  ret
193d0 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64  urn rReg;.}.#end
193e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
193f0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
19400 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19410 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
19420 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e  * Expr pIn is an
19430 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73   IN(...) express
19440 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ion. This functi
19450 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  on checks that t
19460 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63  he .** sub-selec
19470 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
19480 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f  the IN() operato
19490 72 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  r has the same n
194a0 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c  umber of .** col
194b0 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63 74  umns as the vect
194c0 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f  or on the LHS. O
194d0 72 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f 66  r, if the RHS of
194e0 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74   the IN() is not
194f0 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79   .** a sub-query
19500 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 69  , that the LHS i
19510 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69  s a vector of si
19520 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ze 1..*/.int sql
19530 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28  ite3ExprCheckIN(
19540 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
19550 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74  xpr *pIn){.  int
19560 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74   nVector = sqlit
19570 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
19580 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  (pIn->pLeft);.  
19590 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20  if( (pIn->flags 
195a0 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
195b0 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74  ){.    if( nVect
195c0 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65  or!=pIn->x.pSele
195d0 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
195e0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
195f0 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
19600 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e  (pParse, pIn->x.
19610 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
19620 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29  >nExpr, nVector)
19630 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
19640 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
19650 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29  if( nVector!=1 )
19660 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65 63  {.    sqlite3Vec
19670 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61 72  torErrorMsg(pPar
19680 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b  se, pIn->pLeft);
19690 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
196a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
196b0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
196c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
196d0 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
196e0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
196f0 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   IN expression..
19700 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
19710 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20  (SELECT ...).** 
19720 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65       x IN (value
19730 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a  , value, ...).**
19740 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  .** The left-han
19750 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20  d side (LHS) is 
19760 61 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74  a scalar or vect
19770 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  or expression.  
19780 54 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61  The .** right-ha
19790 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 69 73  nd side (RHS) is
197a0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72   an array of zer
197b0 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72  o or more scalar
197c0 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a   values, or a.**
197d0 20 73 75 62 71 75 65 72 79 2e 20 20 49 66 20 74   subquery.  If t
197e0 68 65 20 52 48 53 20 69 73 20 61 20 73 75 62 71  he RHS is a subq
197f0 75 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72  uery, the number
19800 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
19810 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68  ns must.** match
19820 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
19830 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65  olumns in the ve
19840 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e  ctor on the LHS.
19850 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73 0a    If the RHS is.
19860 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c  ** a list of val
19870 75 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73  ues, the LHS mus
19880 74 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a  t be a scalar. .
19890 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65  **.** The IN ope
198a0 72 61 74 6f 72 20 69 73 20 74 72 75 65 20 69 66  rator is true if
198b0 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69   the LHS value i
198c0 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  s contained with
198d0 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54  in the RHS..** T
198e0 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c  he result is fal
198f0 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  se if the LHS is
19900 20 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20   definitely not 
19910 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65  in the RHS.  The
19920 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e   .** result is N
19930 55 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73 65  ULL if the prese
19940 6e 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69  nce of the LHS i
19950 6e 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74  n the RHS cannot
19960 20 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   be .** determin
19970 65 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e  ed due to NULLs.
19980 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19990 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
199a0 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f  de that jumps to
199b0 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20   destIfFalse if 
199c0 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a  the LHS is not .
199d0 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ** contained wit
199e0 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66  hin the RHS.  If
199f0 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65   due to NULLs we
19a00 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
19a10 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20  e if the LHS.** 
19a20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
19a30 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d  the RHS then jum
19a40 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e  p to destIfNull.
19a50 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20    If the LHS is 
19a60 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74  contained.** wit
19a70 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e  hin the RHS then
19a80 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a   fall through..*
19a90 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70  *.** See the sep
19aa0 61 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f  arate in-operato
19ab0 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69  r.md documentati
19ac0 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63  on file in the c
19ad0 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69  anonical.** SQLi
19ae0 74 65 20 73 6f 75 72 63 65 20 74 72 65 65 20 66  te source tree f
19af0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
19b00 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
19b10 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
19b20 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50  3ExprCodeIN(.  P
19b30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
19b40 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
19b50 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
19b60 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
19b70 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
19b80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
19b90 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
19ba0 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
19bb0 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ,      /* Jump h
19bc0 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f  ere if LHS is no
19bd0 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
19be0 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
19bf0 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20  destIfNull      
19c00 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
19c10 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  f the results ar
19c20 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f  e unknown due to
19c30 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69   NULLs */.){.  i
19c40 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d  nt rRhsHasNull =
19c50 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72   0;  /* Register
19c60 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66   that is true if
19c70 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55   RHS contains NU
19c80 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  LL values */.  i
19c90 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20  nt eType;       
19ca0 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
19cb0 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
19cc0 20 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20   rLhs;          
19cd0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73     /* Register(s
19ce0 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48  ) holding the LH
19cf0 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  S values */.  in
19d00 74 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20  t rLhsOrig;     
19d10 20 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65      /* LHS value
19d20 73 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64  s prior to reord
19d30 65 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d  ering by aiMap[]
19d40 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
19d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
19d60 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
19d70 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
19d80 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b   int *aiMap = 0;
19d90 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72         /* Map fr
19da0 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20  om vector field 
19db0 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  to index column 
19dc0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20  */.  char *zAff 
19dd0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66  = 0;       /* Af
19de0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f  finity string fo
19df0 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f  r comparisons */
19e00 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20  .  int nVector; 
19e10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
19e20 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20   of vectors for 
19e30 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72  this IN operator
19e40 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79   */.  int iDummy
19e50 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
19e60 75 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74  ummy parameter t
19e70 6f 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  o exprCodeVector
19e80 28 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  () */.  Expr *pL
19e90 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  eft;          /*
19ea0 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   The LHS of the 
19eb0 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
19ec0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
19ed0 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63         /* loop c
19ee0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
19ef0 64 65 73 74 53 74 65 70 32 3b 20 20 20 20 20 20  destStep2;      
19f00 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75    /* Where to ju
19f10 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65  mp when NULLs se
19f20 65 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a  en in step 2 */.
19f30 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 36 20    int destStep6 
19f40 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74  = 0;    /* Start
19f50 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65   of code for Ste
19f60 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  p 6 */.  int add
19f70 72 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f  rTruthOp;      /
19f80 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63  * Address of opc
19f90 6f 64 65 20 74 68 61 74 20 64 65 74 65 72 6d 69  ode that determi
19fa0 6e 65 73 20 74 68 65 20 49 4e 20 69 73 20 74 72  nes the IN is tr
19fb0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  ue */.  int dest
19fc0 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a  NotNull;      /*
19fd0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 20   Jump here if a 
19fe0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f  comparison is no
19ff0 74 20 74 72 75 65 20 69 6e 20 73 74 65 70 20 36  t true in step 6
1a000 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f   */.  int addrTo
1a010 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  p;          /* T
1a020 6f 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36  op of the step-6
1a030 20 6c 6f 6f 70 20 2a 2f 20 0a 20 20 69 6e 74 20   loop */ .  int 
1a040 69 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20  iTab = 0;       
1a050 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 75 73    /* Index to us
1a060 65 20 2a 2f 0a 0a 20 20 70 4c 65 66 74 20 3d 20  e */..  pLeft = 
1a070 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
1a080 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1a090 68 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70  heckIN(pParse, p
1a0a0 45 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a  Expr) ) return;.
1a0b0 20 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41    zAff = exprINA
1a0c0 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
1a0d0 70 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f  pExpr);.  nVecto
1a0e0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  r = sqlite3ExprV
1a0f0 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d  ectorSize(pExpr-
1a100 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70  >pLeft);.  aiMap
1a110 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
1a120 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  DbMallocZero(.  
1a130 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
1a140 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28  nVector*(sizeof(
1a150 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68  int) + sizeof(ch
1a160 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20  ar)) + 1.  );.  
1a170 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
1a180 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
1a190 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  oto sqlite3ExprC
1a1a0 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b  odeIN_oom_error;
1a1b0 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74  ..  /* Attempt t
1a1c0 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48  o compute the RH
1a1d0 53 2e 20 41 66 74 65 72 20 74 68 69 73 20 73 74  S. After this st
1a1e0 65 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ep, if anything 
1a1f0 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20  other than.  ** 
1a200 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73  IN_INDEX_NOOP is
1a210 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 74   returned, the t
1a220 61 62 6c 65 20 6f 70 65 6e 65 64 20 77 69 74 68  able opened with
1a230 20 63 75 72 73 6f 72 20 69 54 61 62 0a 20 20 2a   cursor iTab.  *
1a240 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  * contains the v
1a250 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20  alues that make 
1a260 75 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49  up the RHS. If I
1a270 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
1a280 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74  returned,.  ** t
1a290 68 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79  he RHS has not y
1a2a0 65 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20  et been coded.  
1a2b0 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
1a2c0 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
1a2d0 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ( v!=0 );       
1a2e0 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20  /* OOM detected 
1a2f0 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f  prior to this ro
1a300 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e  utine */.  VdbeN
1a310 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1a320 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29  begin IN expr"))
1a330 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69  ;.  eType = sqli
1a340 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
1a350 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20  Parse, pExpr,.  
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a370 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e             IN_IN
1a380 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c  DEX_MEMBERSHIP |
1a390 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
1a3a0 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K,.             
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3c0 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
1a3d0 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72  tIfNull ? 0 : &r
1a3e0 52 68 73 48 61 73 4e 75 6c 6c 2c 0a 20 20 20 20  RhsHasNull,.    
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a400 20 20 20 20 20 20 20 20 20 61 69 4d 61 70 2c 20           aiMap, 
1a410 26 69 54 61 62 29 3b 0a 0a 20 20 61 73 73 65 72  &iTab);..  asser
1a420 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  t( pParse->nErr 
1a430 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c  || nVector==1 ||
1a440 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
1a450 5f 45 50 48 0a 20 20 20 20 20 20 20 7c 7c 20 65  _EPH.       || e
1a460 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type==IN_INDEX_I
1a470 4e 44 45 58 5f 41 53 43 20 7c 7c 20 65 54 79 70  NDEX_ASC || eTyp
1a480 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e==IN_INDEX_INDE
1a490 58 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23 69 66  X_DESC .  );.#if
1a4a0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1a4b0 0a 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68  .  /* Confirm th
1a4c0 61 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61  at aiMap[] conta
1a4d0 69 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e 74 65  ins nVector inte
1a4e0 67 65 72 20 76 61 6c 75 65 73 20 62 65 74 77 65  ger values betwe
1a4f0 65 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56  en 0 and.  ** nV
1a500 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f  ector-1. */.  fo
1a510 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
1a520 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1a530 6a 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28  j, cnt;.    for(
1a540 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74  cnt=j=0; j<nVect
1a550 6f 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d  or; j++) if( aiM
1a560 61 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b  ap[j]==i ) cnt++
1a570 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6e  ;.    assert( cn
1a580 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  t==1 );.  }.#end
1a590 69 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68  if..  /* Code th
1a5a0 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72  e LHS, the <expr
1a5b0 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49  > from "<expr> I
1a5c0 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65  N (...)". If the
1a5d0 20 4c 48 53 20 69 73 20 61 20 0a 20 20 2a 2a 20   LHS is a .  ** 
1a5e0 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 69 74 20  vector, then it 
1a5f0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20  is stored in an 
1a600 61 72 72 61 79 20 6f 66 20 6e 56 65 63 74 6f 72  array of nVector
1a610 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
1a620 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e  ing .  ** at r1.
1a630 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74  .  **.  ** sqlit
1a640 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20  e3FindInIndex() 
1a650 6d 69 67 68 74 20 68 61 76 65 20 72 65 6f 72 64  might have reord
1a660 65 72 65 64 20 74 68 65 20 66 69 65 6c 64 73 20  ered the fields 
1a670 6f 66 20 74 68 65 20 4c 48 53 20 76 65 63 74 6f  of the LHS vecto
1a680 72 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74  r.  ** so that t
1a690 68 65 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e  he fields are in
1a6a0 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20   the same order 
1a6b0 61 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69  as an existing i
1a6c0 6e 64 65 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a  ndex.   The.  **
1a6d0 20 61 69 4d 61 70 5b 5d 20 61 72 72 61 79 20 63   aiMap[] array c
1a6e0 6f 6e 74 61 69 6e 73 20 61 20 6d 61 70 70 69 6e  ontains a mappin
1a6f0 67 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69  g from the origi
1a700 6e 61 6c 20 4c 48 53 20 66 69 65 6c 64 20 6f 72  nal LHS field or
1a710 64 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  der to.  ** the 
1a720 66 69 65 6c 64 20 6f 72 64 65 72 20 74 68 61 74  field order that
1a730 20 6d 61 74 63 68 65 73 20 74 68 65 20 52 48 53   matches the RHS
1a740 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 72   index..  */.  r
1a750 4c 68 73 4f 72 69 67 20 3d 20 65 78 70 72 43 6f  LhsOrig = exprCo
1a760 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c  deVector(pParse,
1a770 20 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d 79 29   pLeft, &iDummy)
1a780 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1a790 56 65 63 74 6f 72 20 26 26 20 61 69 4d 61 70 5b  Vector && aiMap[
1a7a0 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a  i]==i; i++){} /*
1a7b0 20 41 72 65 20 4c 48 53 20 66 69 65 6c 64 73 20   Are LHS fields 
1a7c0 72 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20  reordered? */.  
1a7d0 69 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29  if( i==nVector )
1a7e0 7b 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66 69 65  {.    /* LHS fie
1a7f0 6c 64 73 20 61 72 65 20 6e 6f 74 20 72 65 6f 72  lds are not reor
1a800 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68  dered */.    rLh
1a810 73 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20  s = rLhsOrig;.  
1a820 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65  }else{.    /* Ne
1a830 65 64 20 74 6f 20 72 65 6f 72 64 65 72 20 74 68  ed to reorder th
1a840 65 20 4c 48 53 20 66 69 65 6c 64 73 20 61 63 63  e LHS fields acc
1a850 6f 72 64 69 6e 67 20 74 6f 20 61 69 4d 61 70 20  ording to aiMap 
1a860 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 73 71  */.    rLhs = sq
1a870 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
1a880 65 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f  e(pParse, nVecto
1a890 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  r);.    for(i=0;
1a8a0 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29   i<nVector; i++)
1a8b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1a8c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1a8d0 43 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69  Copy, rLhsOrig+i
1a8e0 2c 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c  , rLhs+aiMap[i],
1a8f0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
1a900 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46    /* If sqlite3F
1a910 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64  indInIndex() did
1a920 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65   not find or cre
1a930 61 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61  ate an index tha
1a940 74 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62  t is.  ** suitab
1a950 6c 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e  le for evaluatin
1a960 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  g the IN operato
1a970 72 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65  r, then evaluate
1a980 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65   using a.  ** se
1a990 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72  quence of compar
1a9a0 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  isons..  **.  **
1a9b0 20 54 68 69 73 20 69 73 20 73 74 65 70 20 28 31   This is step (1
1a9c0 29 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72  ) in the in-oper
1a9d0 61 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65  ator.md optimize
1a9e0 64 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a  d algorithm..  *
1a9f0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49  /.  if( eType==I
1aa00 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a  N_INDEX_NOOP ){.
1aa10 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
1aa20 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
1aa30 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65  List;.    CollSe
1aa40 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
1aa50 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1aa60 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1aa70 66 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62  ft);.    int lab
1aa80 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  elOk = sqlite3Vd
1aa90 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
1aaa0 73 65 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c  se);.    int r2,
1aab0 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20   regToFree;.    
1aac0 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20  int regCkNull = 
1aad0 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  0;.    int ii;. 
1aae0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1aaf0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ab00 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1ab10 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74   );.    if( dest
1ab20 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61  IfNull!=destIfFa
1ab30 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65 67  lse ){.      reg
1ab40 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  CkNull = sqlite3
1ab50 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
1ab60 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1ab70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1ab80 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73 2c 20  P_BitAnd, rLhs, 
1ab90 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  rLhs, regCkNull)
1aba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1abb0 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e  ii=0; ii<pList->
1abc0 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
1abd0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1abe0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1abf0 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69  rse, pList->a[ii
1ac00 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46  ].pExpr, &regToF
1ac10 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ree);.      if( 
1ac20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c  regCkNull && sql
1ac30 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
1ac40 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70  l(pList->a[ii].p
1ac50 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1ac60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ac70 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c  p3(v, OP_BitAnd,
1ac80 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20   regCkNull, r2, 
1ac90 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20  regCkNull);.    
1aca0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69    }.      if( ii
1acb0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20  <pList->nExpr-1 
1acc0 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64  || destIfNull!=d
1acd0 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20  estIfFalse ){.  
1ace0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1acf0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71  eAddOp4(v, OP_Eq
1ad00 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c  , rLhs, labelOk,
1ad10 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r2,.           
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1ad30 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
1ad40 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
1ad50 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1ad60 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  (v, ii<pList->nE
1ad70 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  xpr-1);.        
1ad80 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1ad90 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78  , ii==pList->nEx
1ada0 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73  pr-1);.        s
1adb0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1adc0 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a  P5(v, zAff[0]);.
1add0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ade0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73       assert( des
1adf0 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
1ae00 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20  alse );.        
1ae10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ae20 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73  4(v, OP_Ne, rLhs
1ae30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72  , destIfFalse, r
1ae40 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
1ae60 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  id*)pColl, P4_CO
1ae70 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76 65  LLSEQ); VdbeCove
1ae80 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
1ae90 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1aea0 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20  geP5(v, zAff[0] 
1aeb0 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  | SQLITE_JUMPIFN
1aec0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULL);.      }.  
1aed0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1aee0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1aef0 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20  , regToFree);.  
1af00 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67 43    }.    if( regC
1af10 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73  kNull ){.      s
1af20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1af30 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
1af40 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66  egCkNull, destIf
1af50 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  Null); VdbeCover
1af60 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
1af70 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1af80 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1af90 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1afa0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1afb0 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20  (v, labelOk);.  
1afc0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1afd0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1afe0 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20  regCkNull);.    
1aff0 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  goto sqlite3Expr
1b000 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b  CodeIN_finished;
1b010 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
1b020 32 3a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  2: Check to see 
1b030 69 66 20 74 68 65 20 4c 48 53 20 63 6f 6e 74 61  if the LHS conta
1b040 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c  ins any NULL col
1b050 75 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a 20 20  umns.  If the.  
1b060 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f 6e 74  ** LHS does cont
1b070 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e 20 74  ain NULLs then t
1b080 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62  he result must b
1b090 65 20 65 69 74 68 65 72 20 46 41 4c 53 45 20 6f  e either FALSE o
1b0a0 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20  r NULL..  ** We 
1b0b0 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70 20 74  will then skip t
1b0c0 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  he binary search
1b0d0 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a   of the RHS..  *
1b0e0 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 4e 75  /.  if( destIfNu
1b0f0 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll==destIfFalse 
1b100 29 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70 32  ){.    destStep2
1b110 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   = destIfFalse;.
1b120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 73    }else{.    des
1b130 74 53 74 65 70 32 20 3d 20 64 65 73 74 53 74 65  tStep2 = destSte
1b140 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p6 = sqlite3Vdbe
1b150 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
1b160 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1b170 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
1b180 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
1b190 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
1b1a0 65 6c 64 53 75 62 65 78 70 72 28 70 45 78 70 72  eldSubexpr(pExpr
1b1b0 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  ->pLeft, i);.   
1b1c0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1b1d0 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a  CanBeNull(p) ){.
1b1e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b1f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
1b200 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65  Null, rLhs+i, de
1b210 73 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20 20  stStep2);.      
1b220 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b230 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1b240 20 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c 48   Step 3.  The LH
1b250 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74  S is now known t
1b260 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20  o be non-NULL.  
1b270 44 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  Do the binary se
1b280 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65  arch.  ** of the
1b290 20 52 48 53 20 75 73 69 6e 67 20 74 68 65 20 4c   RHS using the L
1b2a0 48 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20 20  HS as a probe.  
1b2b0 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72 65  If found, the re
1b2c0 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72 75  sult is.  ** tru
1b2d0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
1b2e0 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
1b2f0 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  WID ){.    /* In
1b300 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
1b310 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44  RHS is the ROWID
1b320 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65   of table b-tree
1b330 20 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a   and so we also.
1b340 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74      ** know that
1b350 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d   the RHS is non-
1b360 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65  NULL.  Hence, we
1b370 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 33   combine steps 3
1b380 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e   and 4.    ** in
1b390 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  to a single opco
1b3a0 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  de. */.    sqlit
1b3b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1b3c0 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 54  OP_SeekRowid, iT
1b3d0 61 62 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  ab, destIfFalse,
1b3e0 20 72 4c 68 73 29 3b 0a 20 20 20 20 56 64 62 65   rLhs);.    Vdbe
1b3f0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1b400 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73   addrTruthOp = s
1b410 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1b420 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f  (v, OP_Goto);  /
1b430 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 2a 2f  * Return True */
1b440 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1b450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1b460 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
1b470 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 2c 20 30  rLhs, nVector, 0
1b480 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f 72 29  , zAff, nVector)
1b490 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66  ;.    if( destIf
1b4a0 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c  False==destIfNul
1b4b0 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f  l ){.      /* Co
1b4c0 6d 62 69 6e 65 20 53 74 65 70 20 33 20 61 6e 64  mbine Step 3 and
1b4d0 20 53 74 65 70 20 35 20 69 6e 74 6f 20 61 20 73   Step 5 into a s
1b4e0 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20 2a 2f 0a  ingle opcode */.
1b4f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b500 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1b510 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 54 61 62 2c  _NotFound, iTab,
1b520 20 64 65 73 74 49 66 46 61 6c 73 65 2c 0a 20 20   destIfFalse,.  
1b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b540 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e           rLhs, n
1b550 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76  Vector); VdbeCov
1b560 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
1b570 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  goto sqlite3Expr
1b580 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b  CodeIN_finished;
1b590 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72  .    }.    /* Or
1b5a0 64 69 6e 61 72 79 20 53 74 65 70 20 33 2c 20 66  dinary Step 3, f
1b5b0 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 72  or the case wher
1b5c0 65 20 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c  e FALSE and NULL
1b5d0 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f   are distinct */
1b5e0 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70  .    addrTruthOp
1b5f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1b600 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
1b610 75 6e 64 2c 20 69 54 61 62 2c 20 30 2c 0a 20 20  und, iTab, 0,.  
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f      rLhs, nVecto
1b650 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
1b660 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  (v);.  }..  /* S
1b670 74 65 70 20 34 2e 20 20 49 66 20 74 68 65 20 52  tep 4.  If the R
1b680 48 53 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62  HS is known to b
1b690 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77  e non-NULL and w
1b6a0 65 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 0a 20  e did not find. 
1b6b0 20 2a 2a 20 61 6e 20 6d 61 74 63 68 20 6f 6e 20   ** an match on 
1b6c0 74 68 65 20 73 65 61 72 63 68 20 61 62 6f 76 65  the search above
1b6d0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
1b6e0 74 20 6d 75 73 74 20 62 65 20 46 41 4c 53 45 2e  t must be FALSE.
1b6f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 52 68 73  .  */.  if( rRhs
1b700 48 61 73 4e 75 6c 6c 20 26 26 20 6e 56 65 63 74  HasNull && nVect
1b710 6f 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  or==1 ){.    sql
1b720 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b730 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52  , OP_NotNull, rR
1b740 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49  hsHasNull, destI
1b750 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 56 64 62  fFalse);.    Vdb
1b760 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b770 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35 2e 20  }..  /* Step 5. 
1b780 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 63 61   If we do not ca
1b790 72 65 20 61 62 6f 75 74 20 74 68 65 20 64 69 66  re about the dif
1b7a0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1b7b0 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20 46 41  NULL and.  ** FA
1b7c0 4c 53 45 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  LSE, then just r
1b7d0 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 0a 20 20  eturn false. .  
1b7e0 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 46  */.  if( destIfF
1b7f0 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c  alse==destIfNull
1b800 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f   ) sqlite3VdbeGo
1b810 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  to(v, destIfFals
1b820 65 29 3b 0a 0a 20 20 2f 2a 20 53 74 65 70 20 36  e);..  /* Step 6
1b830 3a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 72  : Loop through r
1b840 6f 77 73 20 6f 66 20 74 68 65 20 52 48 53 2e 20  ows of the RHS. 
1b850 20 43 6f 6d 70 61 72 65 20 65 61 63 68 20 72 6f   Compare each ro
1b860 77 20 74 6f 20 74 68 65 20 4c 48 53 2e 0a 20 20  w to the LHS..  
1b870 2a 2a 20 49 66 20 61 6e 79 20 63 6f 6d 70 61 72  ** If any compar
1b880 69 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ison is NULL, th
1b890 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
1b8a0 20 4e 55 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a 20   NULL.  If all. 
1b8b0 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20   ** comparisons 
1b8c0 61 72 65 20 46 41 4c 53 45 20 74 68 65 6e 20 74  are FALSE then t
1b8d0 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20  he final result 
1b8e0 69 73 20 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20  is FALSE..  **. 
1b8f0 20 2a 2a 20 46 6f 72 20 61 20 73 63 61 6c 61 72   ** For a scalar
1b900 20 4c 48 53 2c 20 69 74 20 69 73 20 73 75 66 66   LHS, it is suff
1b910 69 63 69 65 6e 74 20 74 6f 20 63 68 65 63 6b 20  icient to check 
1b920 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20 72  just the first r
1b930 6f 77 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52  ow.  ** of the R
1b940 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  HS..  */.  if( d
1b950 65 73 74 53 74 65 70 36 20 29 20 73 71 6c 69 74  estStep6 ) sqlit
1b960 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1b970 65 6c 28 76 2c 20 64 65 73 74 53 74 65 70 36 29  el(v, destStep6)
1b980 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  ;.  addrTop = sq
1b990 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b9a0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
1b9b0 61 62 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  ab, destIfFalse)
1b9c0 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
1b9d0 28 76 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74  (v);.  if( nVect
1b9e0 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64 65 73 74  or>1 ){.    dest
1b9f0 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  NotNull = sqlite
1ba00 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
1ba10 50 61 72 73 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Parse);.  }else{
1ba20 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63  .    /* For nVec
1ba30 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20  tor==1, combine 
1ba40 73 74 65 70 73 20 36 20 61 6e 64 20 37 20 62 79  steps 6 and 7 by
1ba50 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
1ba60 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41  urning.    ** FA
1ba70 4c 53 45 20 69 66 20 74 68 65 20 66 69 72 73 74  LSE if the first
1ba80 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e   comparison is n
1ba90 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64  ot NULL */.    d
1baa0 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73  estNotNull = des
1bab0 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20  tIfFalse;.  }.  
1bac0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
1bad0 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  or; i++){.    Ex
1bae0 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53  pr *p;.    CollS
1baf0 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69  eq *pColl;.    i
1bb00 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47  nt r3 = sqlite3G
1bb10 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1bb20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
1bb30 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
1bb40 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
1bb50 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1bb60 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1bb70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73  Parse, p);.    s
1bb80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1bb90 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
1bba0 54 61 62 2c 20 69 2c 20 72 33 29 3b 0a 20 20 20  Tab, i, r3);.   
1bbb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bbc0 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68  p4(v, OP_Ne, rLh
1bbd0 73 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  s+i, destNotNull
1bbe0 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20  , r3,.          
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1bc00 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
1bc10 4c 53 45 51 29 3b 0a 20 20 20 20 56 64 62 65 43  LSEQ);.    VdbeC
1bc20 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1bc30 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1bc40 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33  mpReg(pParse, r3
1bc50 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1bc60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1bc70 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66  _Goto, 0, destIf
1bc80 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 56 65  Null);.  if( nVe
1bc90 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 73 71  ctor>1 ){.    sq
1bca0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1bcb0 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 4e 6f 74  Label(v, destNot
1bcc0 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Null);.    sqlit
1bcd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1bce0 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
1bcf0 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56  ddrTop+1);.    V
1bd00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1bd10 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37 3a 20  .    /* Step 7: 
1bd20 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
1bd30 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77  s point, we know
1bd40 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
1bd50 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
1bd60 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71  false. */.    sq
1bd70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1bd80 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
1bd90 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d  estIfFalse);.  }
1bda0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72  ..  /* Jumps her
1bdb0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65  e in order to re
1bdc0 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20  turn true. */.  
1bdd0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1bde0 65 72 65 28 76 2c 20 61 64 64 72 54 72 75 74 68  ere(v, addrTruth
1bdf0 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70  Op);..sqlite3Exp
1be00 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64  rCodeIN_finished
1be10 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d 72 4c  :.  if( rLhs!=rL
1be20 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74 65 33  hsOrig ) sqlite3
1be30 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1be40 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20  Parse, rLhs);.  
1be50 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1be60 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b  "end IN expr"));
1be70 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65  .sqlite3ExprCode
1be80 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20  IN_oom_error:.  
1be90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1bea0 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29  arse->db, aiMap)
1beb0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1bec0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41  e(pParse->db, zA
1bed0 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ff);.}.#endif /*
1bee0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1bef0 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65  QUERY */..#ifnde
1bf00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1bf10 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a  OATING_POINT./*.
1bf20 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
1bf30 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
1bf40 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f  will put the flo
1bf50 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
1bf60 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62  alue described b
1bf70 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  y z[0..n-1] into
1bf80 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
1bf90 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74  **.** The z[] st
1bfa0 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62  ring will probab
1bfb0 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74  ly not be zero-t
1bfc0 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20  erminated.  But 
1bfd0 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61  the .** z[n] cha
1bfe0 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e  racter is guaran
1bff0 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74  teed to be somet
1c000 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e  hing that does n
1c010 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20  ot look.** like 
1c020 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e  the continuation
1c030 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a   of the number..
1c040 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
1c050 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c  odeReal(Vdbe *v,
1c060 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
1c070 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20  int negateFlag, 
1c080 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28  int iMem){.  if(
1c090 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b   ALWAYS(z!=0) ){
1c0a0 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75  .    double valu
1c0b0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74  e;.    sqlite3At
1c0c0 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71  oF(z, &value, sq
1c0d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
1c0e0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
1c0f0 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c      assert( !sql
1c100 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29  ite3IsNaN(value)
1c110 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41   ); /* The new A
1c120 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e  toF never return
1c130 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28  s NaN */.    if(
1c140 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61   negateFlag ) va
1c150 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20  lue = -value;.  
1c160 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c170 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65  Op4Dup8(v, OP_Re
1c180 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20  al, 0, iMem, 0, 
1c190 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f  (u8*)&value, P4_
1c1a0 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  REAL);.  }.}.#en
1c1b0 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  dif.../*.** Gene
1c1c0 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
1c1d0 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
1c1e0 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65  t the integer de
1c1f0 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78  scribe by.** tex
1c200 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  t z[0..n-1] into
1c210 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
1c220 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f  **.** Expr.u.zTo
1c230 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54  ken is always UT
1c240 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d  F8 and zero-term
1c250 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  inated..*/.stati
1c260 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67  c void codeInteg
1c270 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
1c280 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1c290 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20  nt negFlag, int 
1c2a0 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76  iMem){.  Vdbe *v
1c2b0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1c2c0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
1c2d0 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
1c2e0 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  ue ){.    int i 
1c2f0 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75  = pExpr->u.iValu
1c300 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  e;.    assert( i
1c310 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  >=0 );.    if( n
1c320 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b  egFlag ) i = -i;
1c330 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c340 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1c350 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a  eger, i, iMem);.
1c360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1c370 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75   c;.    i64 valu
1c380 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1c390 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e  r *z = pExpr->u.
1c3a0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65  zToken;.    asse
1c3b0 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20  rt( z!=0 );.    
1c3c0 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72  c = sqlite3DecOr
1c3d0 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c  HexToI64(z, &val
1c3e0 75 65 29 3b 0a 20 20 20 20 69 66 28 20 28 63 3d  ue);.    if( (c=
1c3f0 3d 33 20 26 26 20 21 6e 65 67 46 6c 61 67 29 20  =3 && !negFlag) 
1c400 7c 7c 20 28 63 3d 3d 32 29 20 7c 7c 20 28 6e 65  || (c==2) || (ne
1c410 67 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d 3d  gFlag && value==
1c420 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29  SMALLEST_INT64))
1c430 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1c440 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1c450 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65  INT.      sqlite
1c460 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1c470 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74  , "oversized int
1c480 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67  eger: %s%s", neg
1c490 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c  Flag ? "-" : "",
1c4a0 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64   z);.#else.#ifnd
1c4b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48  ef SQLITE_OMIT_H
1c4c0 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20  EX_INTEGER.     
1c4d0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1c4e0 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d  nicmp(z,"0x",2)=
1c4f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1c500 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1c510 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72  arse, "hex liter
1c520 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25 73  al too big: %s%s
1c530 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22  ", negFlag?"-":"
1c540 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ",z);.      }els
1c550 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  e.#endif.      {
1c560 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
1c570 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c  l(v, z, negFlag,
1c580 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a   iMem);.      }.
1c590 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1c5a0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46  {.      if( negF
1c5b0 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63  lag ){ value = c
1c5c0 3d 3d 33 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49  ==3 ? SMALLEST_I
1c5d0 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d  NT64 : -value; }
1c5e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1c5f0 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
1c600 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65  OP_Int64, 0, iMe
1c610 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75  m, 0, (u8*)&valu
1c620 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1c630 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47    }.  }.}.../* G
1c640 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1c650 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f  t will load into
1c660 20 72 65 67 69 73 74 65 72 20 72 65 67 4f 75 74   register regOut
1c670 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69 73   a value that is
1c680 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
1c690 66 6f 72 20 74 68 65 20 69 49 64 78 43 6f 6c 2d  for the iIdxCol-
1c6a0 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  th column of ind
1c6b0 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64  ex pIdx..*/.void
1c6c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c6d0 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28  LoadIndexColumn(
1c6e0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1c6f0 2c 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e  ,  /* The parsin
1c700 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  g context */.  I
1c710 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 2f  ndex *pIdx,    /
1c720 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73  * The index whos
1c730 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62  e column is to b
1c740 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e  e loaded */.  in
1c750 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a  t iTabCur,    /*
1c760 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
1c770 20 74 6f 20 61 20 74 61 62 6c 65 20 72 6f 77 20   to a table row 
1c780 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c  */.  int iIdxCol
1c790 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75  ,    /* The colu
1c7a0 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  mn of the index 
1c7b0 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a  to be loaded */.
1c7c0 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20    int regOut    
1c7d0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 69    /* Store the i
1c7e0 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ndex column valu
1c7f0 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  e in this regist
1c800 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69  er */.){.  i16 i
1c810 54 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61  TabCol = pIdx->a
1c820 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d  iColumn[iIdxCol]
1c830 3b 0a 20 20 69 66 28 20 69 54 61 62 43 6f 6c 3d  ;.  if( iTabCol=
1c840 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20  =XN_EXPR ){.    
1c850 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43  assert( pIdx->aC
1c860 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73  olExpr );.    as
1c870 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c  sert( pIdx->aCol
1c880 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78  Expr->nExpr>iIdx
1c890 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61 72 73  Col );.    pPars
1c8a0 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 54  e->iSelfTab = iT
1c8b0 61 62 43 75 72 20 2b 20 31 3b 0a 20 20 20 20 73  abCur + 1;.    s
1c8c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
1c8d0 70 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  py(pParse, pIdx-
1c8e0 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64  >aColExpr->a[iId
1c8f0 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67  xCol].pExpr, reg
1c900 4f 75 74 29 3b 0a 20 20 20 20 70 50 61 72 73 65  Out);.    pParse
1c910 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a  ->iSelfTab = 0;.
1c920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1c930 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1c940 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61  olumnOfTable(pPa
1c950 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 49 64 78  rse->pVdbe, pIdx
1c960 2d 3e 70 54 61 62 6c 65 2c 20 69 54 61 62 43 75  ->pTable, iTabCu
1c970 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
1c980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c990 20 20 20 20 20 20 20 69 54 61 62 43 6f 6c 2c 20         iTabCol, 
1c9a0 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  regOut);.  }.}..
1c9b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1c9c0 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74  ode to extract t
1c9d0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1c9e0 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
1c9f0 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  f a table..*/.vo
1ca00 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1ca10 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
1ca20 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  le(.  Vdbe *v,  
1ca30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
1ca40 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  E under construc
1ca50 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20  tion */.  Table 
1ca60 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65  *pTab,    /* The
1ca70 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1ca80 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20  g the value */. 
1ca90 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
1caa0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75   /* The table cu
1cab0 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b  rsor.  Or the PK
1cac0 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48   cursor for WITH
1cad0 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69  OUT ROWID */.  i
1cae0 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f  nt iCol,       /
1caf0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63  * Index of the c
1cb00 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74  olumn to extract
1cb10 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
1cb20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
1cb30 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20   the value into 
1cb40 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
1cb50 0a 29 7b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  .){.  if( pTab==
1cb60 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1cb70 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1cb80 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 43 75 72  _Column, iTabCur
1cb90 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  , iCol, regOut);
1cba0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1cbb0 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c  .  if( iCol<0 ||
1cbc0 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b   iCol==pTab->iPK
1cbd0 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
1cbe0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cbf0 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72  P_Rowid, iTabCur
1cc00 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c  , regOut);.  }el
1cc10 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d  se{.    int op =
1cc20 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
1cc30 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20   ? OP_VColumn : 
1cc40 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  OP_Column;.    i
1cc50 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  nt x = iCol;.   
1cc60 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
1cc70 54 61 62 29 20 26 26 20 21 49 73 56 69 72 74 75  Tab) && !IsVirtu
1cc80 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
1cc90 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c    x = sqlite3Col
1cca0 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74  umnOfIndex(sqlit
1ccb0 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
1ccc0 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a  x(pTab), iCol);.
1ccd0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1cce0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
1ccf0 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72  p, iTabCur, x, r
1cd00 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66  egOut);.  }.  if
1cd10 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
1cd20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
1cd30 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
1cd40 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1cd50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1cd60 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1cd70 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69  ll extract the i
1cd80 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e  Column-th column
1cd90 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70   from.** table p
1cda0 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68  Tab and store th
1cdb0 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
1cdc0 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  n register iReg.
1cdd0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75   .**.** There mu
1cde0 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75  st be an open cu
1cdf0 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20  rsor to pTab in 
1ce00 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73  iTable when this
1ce10 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
1ce20 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75  alled.  If iColu
1ce30 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69  mn<0 then code i
1ce40 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74  s generated that
1ce50 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f   extracts the ro
1ce60 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  wid..*/.int sqli
1ce70 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1ce80 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
1ce90 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
1cea0 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
1ceb0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
1cec0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1ced0 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70  ,     /* Descrip
1cee0 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  tion of the tabl
1cef0 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  e we are reading
1cf00 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
1cf10 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49  Column,     /* I
1cf20 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
1cf30 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  e column */.  in
1cf40 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f  t iTable,      /
1cf50 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69  * The cursor poi
1cf60 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62  nting to the tab
1cf70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
1cf80 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ,        /* Stor
1cf90 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
1cfa0 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20  /.  u8 p5       
1cfb0 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65       /* P5 value
1cfc0 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b   for OP_Column +
1cfd0 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56   FLAGS */.){.  V
1cfe0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1cff0 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
1d000 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( v!=0 );.  sqli
1d010 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1d020 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70  lumnOfTable(v, p
1d030 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  Tab, iTable, iCo
1d040 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69  lumn, iReg);.  i
1d050 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c  f( p5 ){.    sql
1d060 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1d070 28 76 2c 20 70 35 29 3b 0a 20 20 7d 0a 20 20 72  (v, p5);.  }.  r
1d080 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f  eturn iReg;.}../
1d090 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1d0a0 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65  de to move conte
1d0b0 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  nt from register
1d0c0 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b  s iFrom...iFrom+
1d0d0 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74  nReg-1.** over t
1d0e0 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d  o iTo..iTo+nReg-
1d0f0 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  1..*/.void sqlit
1d100 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50  e3ExprCodeMove(P
1d110 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1d120 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
1d130 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61  , int nReg){.  a
1d140 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54  ssert( iFrom>=iT
1d150 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b  o+nReg || iFrom+
1d160 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73  nReg<=iTo );.  s
1d170 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1d180 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1d190 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20  OP_Move, iFrom, 
1d1a0 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 2f  iTo, nReg);.}../
1d1b0 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73  *.** Convert a s
1d1c0 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
1d1d0 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45   node to a TK_RE
1d1e0 47 49 53 54 45 52 20 72 65 66 65 72 65 6e 63 69  GISTER referenci
1d1f0 6e 67 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  ng.** register i
1d200 52 65 67 2e 20 20 54 68 65 20 63 61 6c 6c 65 72  Reg.  The caller
1d210 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
1d220 74 20 69 52 65 67 20 61 6c 72 65 61 64 79 20 63  t iReg already c
1d230 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63  ontains.** the c
1d240 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
1d250 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
1d260 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d270 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45  exprToRegister(E
1d280 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1d290 69 52 65 67 29 7b 0a 20 20 45 78 70 72 20 2a 70  iReg){.  Expr *p
1d2a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1d2b0 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29  ipCollate(pExpr)
1d2c0 3b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e  ;.  p->op2 = p->
1d2d0 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  op;.  p->op = TK
1d2e0 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e  _REGISTER;.  p->
1d2f0 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20  iTable = iReg;. 
1d300 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
1d310 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a  ty(p, EP_Skip);.
1d320 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74  }../*.** Evaluat
1d330 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
1d340 28 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72  (either a vector
1d350 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70   or a scalar exp
1d360 72 65 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f  ression) and sto
1d370 72 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  re.** the result
1d380 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20   in continguous 
1d390 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1d3a0 65 72 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ers.  Return the
1d3b0 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
1d3c0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
1d3d0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
1d3e0 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
1d3f0 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  If the returned 
1d400 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
1d410 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73  is a temporary s
1d420 63 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f  calar, then also
1d430 20 77 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72   write.** that r
1d440 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69  egister number i
1d450 6e 74 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e  nto *piFreeable.
1d460 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65    If the returne
1d470 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  d result registe
1d480 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65  r.** is not a te
1d490 6d 70 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68  mporary or if th
1d4a0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1d4b0 61 20 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69  a vector set *pi
1d4c0 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30  Freeable.** to 0
1d4d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d4e0 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50  exprCodeVector(P
1d4f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1d500 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72  pr *p, int *piFr
1d510 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  eeable){.  int i
1d520 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52  Result;.  int nR
1d530 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45  esult = sqlite3E
1d540 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29  xprVectorSize(p)
1d550 3b 0a 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d  ;.  if( nResult=
1d560 3d 31 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c  =1 ){.    iResul
1d570 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
1d580 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1d590 70 2c 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a  p, piFreeable);.
1d5a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69    }else{.    *pi
1d5b0 46 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20  Freeable = 0;.  
1d5c0 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
1d5d0 53 45 4c 45 43 54 20 29 7b 0a 23 69 66 20 53 51  SELECT ){.#if SQ
1d5e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1d5f0 52 59 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74  RY.      iResult
1d600 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20   = 0;.#else.    
1d610 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69    iResult = sqli
1d620 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
1d630 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 23 65 6e  (pParse, p);.#en
1d640 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
1d650 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1d660 20 20 69 52 65 73 75 6c 74 20 3d 20 70 50 61 72    iResult = pPar
1d670 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
1d680 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1d690 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20 20  = nResult;.     
1d6a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73   for(i=0; i<nRes
1d6b0 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ult; i++){.     
1d6c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1d6d0 64 65 46 61 63 74 6f 72 61 62 6c 65 28 70 50 61  deFactorable(pPa
1d6e0 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2d  rse, p->x.pList-
1d6f0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 2b 69  >a[i].pExpr, i+i
1d700 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
1d710 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1d720 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a  urn iResult;.}..
1d730 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1d740 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75  code into the cu
1d750 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76  rrent Vdbe to ev
1d760 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e  aluate the given
1d770 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .** expression. 
1d780 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72   Attempt to stor
1d790 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
1d7a0 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65   register "targe
1d7b0 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  t"..** Return th
1d7c0 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65  e register where
1d7d0 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
1d7e0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  red..**.** With 
1d7f0 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
1d800 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e  ere is no guaran
1d810 74 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73  tee that results
1d820 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72   will.** be stor
1d830 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54  ed in target.  T
1d840 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20  he result might 
1d850 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d  be stored in som
1d860 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73  e other.** regis
1d870 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e  ter if it is con
1d880 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f  venient to do so
1d890 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
1d8a0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
1d8b0 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
1d8c0 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74   code and move t
1d8d0 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68  he results to th
1d8e0 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67  e desired.** reg
1d8f0 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
1d900 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1d910 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  get(Parse *pPars
1d920 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1d930 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
1d940 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1d950 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20  >pVdbe;  /* The 
1d960 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  VM under constru
1d970 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ction */.  int o
1d980 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1d990 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
1d9a0 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  de being coded *
1d9b0 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20  /.  int inReg = 
1d9c0 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a  target;       /*
1d9d0 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20   Results stored 
1d9e0 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65  in register inRe
1d9f0 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  g */.  int regFr
1da00 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee1 = 0;        
1da10 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
1da20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
1da30 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
1da40 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
1da50 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
1da60 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
1da70 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
1da80 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
1da90 20 72 31 2c 20 72 32 3b 20 20 20 20 20 20 20 20   r1, r2;        
1daa0 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
1dab0 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  s register numbe
1dac0 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d  rs */.  Expr tem
1dad0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
1dae0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65    /* Temporary e
1daf0 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a  xpression node *
1db00 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a  /.  int p5 = 0;.
1db10 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
1db20 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
1db30 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
1db40 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
1db50 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1db60 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1db70 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d );.    return 
1db80 30 3b 0a 20 20 7d 0a 0a 65 78 70 72 5f 63 6f 64  0;.  }..expr_cod
1db90 65 5f 64 6f 6f 76 65 72 3a 0a 20 20 69 66 28 20  e_doover:.  if( 
1dba0 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
1dbb0 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1dbc0 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
1dbd0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20  pExpr->op;.  }. 
1dbe0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1dbf0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
1dc00 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41  OLUMN: {.      A
1dc10 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1dc20 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
1dc30 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  fo;.      struct
1dc40 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
1dc50 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
1dc60 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67  aCol[pExpr->iAgg
1dc70 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41  ];.      if( !pA
1dc80 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
1dc90 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  de ){.        as
1dca0 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d  sert( pCol->iMem
1dcb0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  >0 );.        re
1dcc0 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b  turn pCol->iMem;
1dcd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1dce0 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f   pAggInfo->useSo
1dcf0 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20  rtingIdx ){.    
1dd00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1dd10 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
1dd20 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f  mn, pAggInfo->so
1dd30 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20  rtingIdxPTab,.  
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1dd60 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c  ->iSorterColumn,
1dd70 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1dd80 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1dd90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
1dda0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c  * Otherwise, fal
1ddb0 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
1ddc0 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a  TK_COLUMN case *
1ddd0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
1dde0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
1ddf0 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70      int iTab = p
1de00 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
1de10 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1de20 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1de30 50 5f 46 69 78 65 64 43 6f 6c 29 20 29 7b 0a 20  P_FixedCol) ){. 
1de40 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 43         /* This C
1de50 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e  OLUMN expression
1de60 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6e   is really a con
1de70 73 74 61 6e 74 20 64 75 65 20 74 6f 20 57 48 45  stant due to WHE
1de80 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  RE clause.      
1de90 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73    ** constraints
1dea0 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 6e 73 74  , and that const
1deb0 61 6e 74 20 69 73 20 63 6f 64 65 64 20 62 79 20  ant is coded by 
1dec0 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  the pExpr->pLeft
1ded0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72  .        ** expr
1dee0 65 73 73 73 69 6f 6e 2e 20 20 48 6f 77 65 76 65  esssion.  Howeve
1def0 72 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  r, make sure the
1df00 20 63 6f 6e 73 74 61 6e 74 20 68 61 73 20 74 68   constant has th
1df10 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20  e correct.      
1df20 20 20 2a 2a 20 64 61 74 61 74 79 70 65 20 62 79    ** datatype by
1df30 20 61 70 70 6c 79 69 6e 67 20 74 68 65 20 41 66   applying the Af
1df40 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 74 61  finity of the ta
1df50 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  ble column to th
1df60 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  e.        ** con
1df70 73 74 61 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a  stant..        *
1df80 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
1df90 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
1dfa0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
1dfb0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1dfc0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1dfd0 20 69 6e 74 20 61 66 66 20 3d 20 73 71 6c 69 74   int aff = sqlit
1dfe0 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66  e3TableColumnAff
1dff0 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 79 2e 70  inity(pExpr->y.p
1e000 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  Tab, pExpr->iCol
1e010 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  umn);.        if
1e020 28 20 61 66 66 3e 53 51 4c 49 54 45 5f 41 46 46  ( aff>SQLITE_AFF
1e030 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20  _BLOB ){.       
1e040 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1e050 63 68 61 72 20 7a 41 66 66 5b 5d 20 3d 20 22 42  char zAff[] = "B
1e060 5c 30 30 30 43 5c 30 30 30 44 5c 30 30 30 45 22  \000C\000D\000E"
1e070 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1e080 72 74 28 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  rt( SQLITE_AFF_B
1e090 4c 4f 42 3d 3d 27 41 27 20 29 3b 0a 20 20 20 20  LOB=='A' );.    
1e0a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
1e0b0 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3d 3d 27  LITE_AFF_TEXT=='
1e0c0 42 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  B' );.          
1e0d0 69 66 28 20 69 52 65 67 21 3d 74 61 72 67 65 74  if( iReg!=target
1e0e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e0f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e100 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
1e110 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
1e120 20 20 20 20 20 20 20 20 20 20 69 52 65 67 20 3d            iReg =
1e130 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 20   target;.       
1e140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
1e150 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1e160 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
1e170 20 69 52 65 67 2c 20 31 2c 20 30 2c 0a 20 20 20   iReg, 1, 0,.   
1e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e190 20 20 20 20 20 20 20 20 20 26 7a 41 66 66 5b 28           &zAff[(
1e1a0 61 66 66 2d 27 42 27 29 2a 32 5d 2c 20 50 34 5f  aff-'B')*2], P4_
1e1b0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
1e1c0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
1e1d0 6e 20 69 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a  n iReg;.      }.
1e1e0 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30        if( iTab<0
1e1f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1e200 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1e210 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
1e220 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48  /* Generating CH
1e230 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
1e240 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74  or inserting int
1e250 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  o partial index 
1e260 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
1e270 75 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  urn pExpr->iColu
1e280 6d 6e 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65  mn - pParse->iSe
1e290 6c 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d  lfTab;.        }
1e2a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e2b0 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70  /* Coding an exp
1e2c0 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
1e2d0 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  part of an index
1e2e0 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61   where column na
1e2f0 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  mes.          **
1e300 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65   in the index re
1e310 66 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65  fer to the table
1e320 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e   to which the in
1e330 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  dex belongs */. 
1e340 20 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20           iTab = 
1e350 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1e360 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   - 1;.        }.
1e370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1e380 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
1e390 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
1e3a0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 79 2e 70  arse, pExpr->y.p
1e3b0 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
1e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3d0 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
1e3e0 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74  mn, iTab, target
1e3f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e410 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20   pExpr->op2);.  
1e420 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e430 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
1e440 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
1e450 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  rse, pExpr, 0, t
1e460 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65  arget);.      re
1e470 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e480 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
1e490 52 55 45 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20  RUEFALSE: {.    
1e4a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e4b0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1e4c0 72 2c 20 73 71 6c 69 74 65 33 45 78 70 72 54 72  r, sqlite3ExprTr
1e4d0 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 29 2c  uthValue(pExpr),
1e4e0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1e4f0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1e500 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1e510 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1e520 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65  G_POINT.    case
1e530 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
1e540 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1e550 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1e560 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1e570 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61  );.      codeRea
1e580 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  l(v, pExpr->u.zT
1e590 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29  oken, 0, target)
1e5a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1e5b0 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  arget;.    }.#en
1e5c0 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
1e5d0 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
1e5e0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1e5f0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1e600 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1e610 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e620 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74  eLoadString(v, t
1e630 61 72 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e  arget, pExpr->u.
1e640 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72  zToken);.      r
1e650 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1e660 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e670 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
1e680 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e690 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
1e6a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65  arget);.      re
1e6b0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e6c0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1e6d0 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
1e6e0 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
1e6f0 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  BLOB: {.      in
1e700 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t n;.      const
1e710 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
1e720 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20  char *zBlob;.   
1e730 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1e740 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1e750 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1e760 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e770 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e780 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70  [0]=='x' || pExp
1e790 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1e7a0 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  'X' );.      ass
1e7b0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1e7c0 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b  oken[1]=='\'' );
1e7d0 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70  .      z = &pExp
1e7e0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a  r->u.zToken[2];.
1e7f0 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
1e800 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31  3Strlen30(z) - 1
1e810 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e820 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  z[n]=='\'' );.  
1e830 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69      zBlob = sqli
1e840 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c  te3HexToBlob(sql
1e850 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a  ite3VdbeDb(v), z
1e860 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
1e870 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1e880 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74   OP_Blob, n/2, t
1e890 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c  arget, 0, zBlob,
1e8a0 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
1e8b0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1e8c0 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
1e8d0 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
1e8e0 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  ABLE: {.      as
1e8f0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1e900 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e910 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1e920 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1e930 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29  r->u.zToken!=0 )
1e940 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e950 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1e960 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  0]!=0 );.      s
1e970 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e980 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c  (v, OP_Variable,
1e990 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1e9a0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1e9b0 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  if( pExpr->u.zTo
1e9c0 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20  ken[1]!=0 ){.   
1e9d0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1e9e0 2a 7a 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73  *z = sqlite3VLis
1e9f0 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73  tNumToName(pPars
1ea00 65 2d 3e 70 56 4c 69 73 74 2c 20 70 45 78 70 72  e->pVList, pExpr
1ea10 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1ea20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1ea30 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1ea40 27 3f 27 20 7c 7c 20 73 74 72 63 6d 70 28 70 45  '?' || strcmp(pE
1ea50 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a  xpr->u.zToken, z
1ea60 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1ea70 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30  pParse->pVList[0
1ea80 5d 20 3d 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61  ] = 0; /* Indica
1ea90 74 65 20 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20  te VList may no 
1eaa0 6c 6f 6e 67 65 72 20 62 65 20 65 6e 6c 61 72 67  longer be enlarg
1eab0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  ed */.        sq
1eac0 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
1ead0 34 28 76 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50  4(v, (char*)z, P
1eae0 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
1eaf0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1eb00 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
1eb10 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
1eb20 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
1eb30 72 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  rn pExpr->iTable
1eb40 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1eb50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
1eb60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
1eb70 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  T: {.      /* Ex
1eb80 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
1eb90 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c   form:   CAST(pL
1eba0 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f  eft AS token) */
1ebb0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
1ebc0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1ebd0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1ebe0 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
1ebf0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  t);.      if( in
1ec00 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20  Reg!=target ){. 
1ec10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ec20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1ec30 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
1ec40 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  get);.        in
1ec50 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
1ec60 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1ec70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ec80 20 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74   OP_Cast, target
1ec90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1eca0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ecb0 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45  3AffinityType(pE
1ecc0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
1ecd0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1ece0 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65   inReg;.    }.#e
1ecf0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1ed00 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
1ed10 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
1ed20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
1ed30 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
1ed40 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
1ed50 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20  TK_NE;.      p5 
1ed60 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b  = SQLITE_NULLEQ;
1ed70 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74  .      /* fall-t
1ed80 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61  hrough */.    ca
1ed90 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
1eda0 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
1edb0 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
1edc0 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
1edd0 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
1ede0 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
1edf0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
1ee00 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
1ee10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1ee20 78 70 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66  xprIsVector(pLef
1ee30 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  t) ){.        co
1ee40 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28  deVectorCompare(
1ee50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1ee60 61 72 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a  arget, op, p5);.
1ee70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ee80 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1ee90 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1eea0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65  arse, pLeft, &re
1eeb0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
1eec0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1eed0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1eee0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1eef0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1ef00 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1ef10 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1ef20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1ef30 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  p,.            r
1ef40 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
1ef50 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70  LITE_STOREP2 | p
1ef60 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  5);.        asse
1ef70 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
1ef80 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1ef90 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
1efa0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1efb0 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t);.        asse
1efc0 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
1efd0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1efe0 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
1eff0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1f000 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
1f010 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
1f020 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f030 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
1f040 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
1f050 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t);.        asse
1f060 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
1f070 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f080 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
1f090 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
1f0a0 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
1f0b0 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
1f0c0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f0d0 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Eq); VdbeCover
1f0e0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45  ageIf(v,op==OP_E
1f0f0 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  q);.        asse
1f100 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
1f110 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f120 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ne); VdbeCover
1f130 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e  ageIf(v,op==OP_N
1f140 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
1f150 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1f160 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
1f170 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1f180 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
1f190 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f1a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1f1b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
1f1c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
1f1d0 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
1f1e0 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
1f1f0 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
1f200 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
1f210 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
1f220 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
1f230 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
1f240 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
1f250 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
1f260 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
1f270 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
1f280 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1f290 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20   TK_AND==OP_And 
1f2a0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65  );            te
1f2b0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41  stcase( op==TK_A
1f2c0 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ND );.      asse
1f2d0 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72  rt( TK_OR==OP_Or
1f2e0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
1f2f0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f300 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  K_OR );.      as
1f310 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
1f320 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20  P_Add );        
1f330 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f340 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20  =TK_PLUS );.    
1f350 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
1f360 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
1f370 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28  );     testcase(
1f380 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b   op==TK_MINUS );
1f390 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f3a0 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
1f3b0 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74  der );      test
1f3c0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
1f3d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f3e0 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
1f3f0 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74  BitAnd );      t
1f400 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f410 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  BITAND );.      
1f420 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
1f430 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20  ==OP_BitOr );   
1f440 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f450 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
1f460 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f470 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
1f480 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61   );       testca
1f490 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48  se( op==TK_SLASH
1f4a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f4b0 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
1f4c0 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74  ShiftLeft );   t
1f4d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f4e0 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  LSHIFT );.      
1f4f0 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46  assert( TK_RSHIF
1f500 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  T==OP_ShiftRight
1f510 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f   );  testcase( o
1f520 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a  p==TK_RSHIFT );.
1f530 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f540 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
1f550 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  at );      testc
1f560 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43  ase( op==TK_CONC
1f570 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  AT );.      r1 =
1f580 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f590 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1f5a0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1f5b0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1f5c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f5d0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f5e0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1f5f0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73  gFree2);.      s
1f600 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1f610 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20  (v, op, r2, r1, 
1f620 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74  target);.      t
1f630 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f640 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1f650 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1f660 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1f670 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f680 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
1f690 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
1f6a0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
1f6b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f6c0 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  pLeft );.      i
1f6d0 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
1f6e0 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
1f6f0 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
1f700 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31  pParse, pLeft, 1
1f710 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f720 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1f730 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1f740 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1f750 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65  OINT.      }else
1f760 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
1f770 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
1f780 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1f790 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1f7a0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1f7b0 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
1f7c0 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75  Real(v, pLeft->u
1f7d0 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67  .zToken, 1, targ
1f7e0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  et);.        ret
1f7f0 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e 64  urn target;.#end
1f800 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  if.      }else{.
1f810 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70          tempX.op
1f820 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20   = TK_INTEGER;. 
1f830 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61         tempX.fla
1f840 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs = EP_IntValue
1f850 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20  |EP_TokenOnly;. 
1f860 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69         tempX.u.i
1f870 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20  Value = 0;.     
1f880 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1f890 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f8a0 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67  se, &tempX, &reg
1f8b0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
1f8c0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1f8d0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f8e0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1f8f0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1f900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f910 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
1f920 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72  act, r2, r1, tar
1f930 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65  get);.        te
1f940 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1f950 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
1f960 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f970 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
1f980 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
1f990 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
1f9a0 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
1f9b0 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20  ==OP_BitNot );  
1f9c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f9d0 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20  K_BITNOT );.    
1f9e0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
1f9f0 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20  ==OP_Not );     
1fa00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1fa10 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20  ==TK_NOT );.    
1fa20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1fa30 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1fa40 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1fa50 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1fa60 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1fa70 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1fa80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fa90 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69  Op2(v, op, r1, i
1faa0 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
1fab0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fac0 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20  se TK_TRUTH: {. 
1fad0 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b       int isTrue;
1fae0 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f      /* IS TRUE o
1faf0 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f  r IS NOT TRUE */
1fb00 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 6f 72 6d  .      int bNorm
1fb10 61 6c 3b 20 20 20 2f 2a 20 49 53 20 54 52 55 45  al;   /* IS TRUE
1fb20 20 6f 72 20 49 53 20 46 41 4c 53 45 20 2a 2f 0a   or IS FALSE */.
1fb30 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1fb40 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1fb50 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1fb60 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1fb70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fb80 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1fb90 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20 73        isTrue = s
1fba0 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56  qlite3ExprTruthV
1fbb0 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67  alue(pExpr->pRig
1fbc0 68 74 29 3b 0a 20 20 20 20 20 20 62 4e 6f 72 6d  ht);.      bNorm
1fbd0 61 6c 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d  al = pExpr->op2=
1fbe0 3d 54 4b 5f 49 53 3b 0a 20 20 20 20 20 20 74 65  =TK_IS;.      te
1fbf0 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26  stcase( isTrue &
1fc00 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20  & bNormal);.    
1fc10 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54    testcase( !isT
1fc20 72 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b  rue && bNormal);
1fc30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1fc40 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
1fc50 50 5f 49 73 54 72 75 65 2c 20 72 31 2c 20 69 6e  P_IsTrue, r1, in
1fc60 52 65 67 2c 20 21 69 73 54 72 75 65 2c 20 69 73  Reg, !isTrue, is
1fc70 54 72 75 65 20 5e 20 62 4e 6f 72 6d 61 6c 29 3b  True ^ bNormal);
1fc80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fc90 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1fca0 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
1fcb0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
1fcc0 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
1fcd0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1fce0 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
1fcf0 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  l );   testcase(
1fd00 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
1fd10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fd20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
1fd30 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61  otNull ); testca
1fd40 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
1fd50 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  LL );.      sqli
1fd60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1fd70 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
1fd80 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
1fd90 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1fda0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1fdb0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1fdc0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1fdd0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1fde0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  e1==0 );.      a
1fdf0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
1fe00 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72  eAddOp1(v, op, r
1fe10 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
1fe20 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1fe30 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
1fe40 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1fe50 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
1fe60 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
1fe70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1fe80 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74  OP_Integer, 0, t
1fe90 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
1fea0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1feb0 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
1fec0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1fed0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
1fee0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
1fef0 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20   AggInfo *pInfo 
1ff00 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
1ff10 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
1ff20 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
1ff30 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1ff40 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1ff50 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1ff60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ff70 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1ff80 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
1ff90 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45  egate: %s()", pE
1ffa0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1ffb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ffc0 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e 66       return pInf
1ffd0 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e  o->aFunc[pExpr->
1ffe0 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20  iAgg].iMem;.    
1fff0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
20000 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20010 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
20020 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
20030 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
20040 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
20050 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
20060 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20     int nFarg;   
20070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20080 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ber of function 
20090 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
200a0 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
200b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
200c0 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
200d0 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
200e0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
200f0 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  *zId;       /* T
20100 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
20110 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f   */.      u32 co
20120 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  nstMask = 0;    
20130 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63   /* Mask of func
20140 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
20150 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  hat are constant
20160 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20180 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
20190 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
201a0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
201b0 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  db;  /* The data
201c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
201d0 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  */.      u8 enc 
201e0 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20  = ENC(db);      
201f0 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f  /* The text enco
20200 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69  ding used by thi
20210 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
20220 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
20230 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20  ll = 0;    /* A 
20240 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
20250 63 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ce */..#ifndef S
20260 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
20270 57 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20  WFUNC.      if( 
20280 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
20290 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e  pExpr, EP_WinFun
202a0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  c) ){.        re
202b0 74 75 72 6e 20 70 45 78 70 72 2d 3e 79 2e 70 57  turn pExpr->y.pW
202c0 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 3b 0a 20  in->regResult;. 
202d0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
202e0 20 20 20 20 20 69 66 28 20 43 6f 6e 73 74 46 61       if( ConstFa
202f0 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 26  ctorOk(pParse) &
20300 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
20310 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
20320 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
20330 20 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   /* SQL function
20340 73 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69  s can be expensi
20350 76 65 2e 20 53 6f 20 74 72 79 20 74 6f 20 6d 6f  ve. So try to mo
20360 76 65 20 63 6f 6e 73 74 61 6e 74 20 66 75 6e 63  ve constant func
20370 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a  tions.        **
20380 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
20390 72 20 6c 6f 6f 70 2c 20 65 76 65 6e 20 69 66 20  r loop, even if 
203a0 74 68 61 74 20 6d 65 61 6e 73 20 61 6e 20 65 78  that means an ex
203b0 74 72 61 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a  tra OP_Copy. */.
203c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
203d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
203e0 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
203f0 70 72 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d  pr, -1);.      }
20400 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
20410 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
20420 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
20430 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ect) );.      if
20440 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
20450 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
20460 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
20470 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20    pFarg = 0;.   
20480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20490 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d    pFarg = pExpr-
204a0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
204b0 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20  }.      nFarg = 
204c0 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e  pFarg ? pFarg->n
204d0 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20  Expr : 0;.      
204e0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
204f0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
20500 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
20510 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70        zId = pExp
20520 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
20530 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
20540 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
20550 2c 20 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e  , zId, nFarg, en
20560 63 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51  c, 0);.#ifdef SQ
20570 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e  LITE_ENABLE_UNKN
20580 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e  OWN_SQL_FUNCTION
20590 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
205a0 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78  =0 && pParse->ex
205b0 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  plain ){.       
205c0 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
205d0 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
205e0 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67  "unknown", nFarg
205f0 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
20600 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
20610 69 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70  if( pDef==0 || p
20620 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d  Def->xFinalize!=
20630 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
20640 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
20650 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75  rse, "unknown fu
20660 6e 63 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a  nction: %s()", z
20670 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Id);.        bre
20680 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
20690 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20     /* Attempt a 
206a0 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74  direct implement
206b0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69  ation of the bui
206c0 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29  lt-in COALESCE()
206d0 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46   and.      ** IF
206e0 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73  NULL() functions
206f0 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75  .  This avoids u
20700 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 75  nnecessary evalu
20710 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a  ation of.      *
20720 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74  * arguments past
20730 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e   the first non-N
20740 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  ULL argument..  
20750 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
20760 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
20770 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43   & SQLITE_FUNC_C
20780 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20  OALESCE ){.     
20790 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73     int endCoales
207a0 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
207b0 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
207c0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
207d0 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20  t( nFarg>=2 );. 
207e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
207f0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
20800 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
20810 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
20820 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46     for(i=1; i<nF
20830 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
20840 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20850 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp2(v, OP_Not
20860 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e  Null, target, en
20870 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
20880 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
20890 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
208a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
208b0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
208c0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[i].pExpr, targ
208d0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
208e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
208f0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
20900 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a  , endCoalesce);.
20910 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20920 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
20930 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20   The UNLIKELY() 
20940 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
20950 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74  -op.  The result
20960 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20   is the value.  
20970 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
20980 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  rst argument..  
20990 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
209a0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
209b0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55   & SQLITE_FUNC_U
209c0 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20  NLIKELY ){.     
209d0 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
209e0 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 72  >=1 );.        r
209f0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
20a00 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
20a10 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  se, pFarg->a[0].
20a20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
20a30 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20        }..#ifdef 
20a40 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
20a50 20 20 20 2f 2a 20 54 68 65 20 41 46 46 49 4e 49     /* The AFFINI
20a60 54 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 65 76  TY() function ev
20a70 61 6c 75 61 74 65 73 20 74 6f 20 61 20 73 74 72  aluates to a str
20a80 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
20a90 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  es.      ** the 
20aa0 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
20ab0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20   the argument.  
20ac0 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
20ad0 20 74 65 73 74 69 6e 67 20 6f 66 0a 20 20 20 20   testing of.    
20ae0 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20    ** the SQLite 
20af0 74 79 70 65 20 6c 6f 67 69 63 2e 0a 20 20 20 20  type logic..    
20b00 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
20b10 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
20b20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 41 46 46   SQLITE_FUNC_AFF
20b30 49 4e 49 54 59 20 29 7b 0a 20 20 20 20 20 20 20  INITY ){.       
20b40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41   const char *azA
20b50 66 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f 62 22 2c  ff[] = { "blob",
20b60 20 22 74 65 78 74 22 2c 20 22 6e 75 6d 65 72 69   "text", "numeri
20b70 63 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 22  c", "integer", "
20b80 72 65 61 6c 22 20 7d 3b 0a 20 20 20 20 20 20 20  real" };.       
20b90 20 63 68 61 72 20 61 66 66 3b 0a 20 20 20 20 20   char aff;.     
20ba0 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
20bb0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==1 );.        a
20bc0 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ff = sqlite3Expr
20bd0 41 66 66 69 6e 69 74 79 28 70 46 61 72 67 2d 3e  Affinity(pFarg->
20be0 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
20bf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20c00 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61  LoadString(v, ta
20c10 72 67 65 74 2c 20 0a 20 20 20 20 20 20 20 20 20  rget, .         
20c20 20 20 20 20 20 20 20 28 61 66 66 3c 3d 53 51 4c         (aff<=SQL
20c30 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 20 3f 20  ITE_AFF_NONE) ? 
20c40 22 6e 6f 6e 65 22 20 3a 20 61 7a 41 66 66 5b 61  "none" : azAff[a
20c50 66 66 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  ff-SQLITE_AFF_BL
20c60 4f 42 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 65  OB]);.        re
20c70 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
20c80 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
20c90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
20ca0 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
20cb0 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73     if( i<32 && s
20cc0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
20cd0 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d  tant(pFarg->a[i]
20ce0 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
20cf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
20d00 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
20d10 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d    constMask |= M
20d20 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20  ASKBIT32(i);.   
20d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
20d40 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
20d50 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
20d60 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
20d70 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
20d80 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
20d90 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
20da0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
20db0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
20dc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
20dd0 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29       if( pFarg )
20de0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
20df0 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20  nstMask ){.     
20e00 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65       r1 = pParse
20e10 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
20e20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
20e30 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20   += nFarg;.     
20e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20e50 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
20e60 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
20e70 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20  rse, nFarg);.   
20e80 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
20e90 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20  /* For length() 
20ea0 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e  and typeof() fun
20eb0 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f  ctions with a co
20ec0 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20  lumn argument,. 
20ed0 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68         ** set th
20ee0 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74  e P5 parameter t
20ef0 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  o the OP_Column 
20f00 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47  opcode to OPFLAG
20f10 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20  _LENGTHARG.     
20f20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f     ** or OPFLAG_
20f30 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63  TYPEOFARG respec
20f40 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64  tively, to avoid
20f50 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74   unnecessary dat
20f60 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61  a.        ** loa
20f70 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ding..        */
20f80 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
20f90 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20fa0 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e  (SQLITE_FUNC_LEN
20fb0 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  GTH|SQLITE_FUNC_
20fc0 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20  TYPEOF))!=0 ){. 
20fd0 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72           u8 expr
20fe0 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  Op;.          as
20ff0 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
21000 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
21010 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rt( pFarg->a[0].
21020 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
21030 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70        exprOp = p
21040 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
21050 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  ->op;.          
21060 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43  if( exprOp==TK_C
21070 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d  OLUMN || exprOp=
21080 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
21090 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
210a0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
210b0 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47  C_LENGTH==OPFLAG
210c0 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
210d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
210e0 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  ( SQLITE_FUNC_TY
210f0 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50  PEOF==OPFLAG_TYP
21100 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20  EOFARG );.      
21110 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21120 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
21130 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  & OPFLAG_LENGTHA
21140 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
21150 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45    pFarg->a[0].pE
21160 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20  xpr->op2 = .    
21170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
21180 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
21190 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  (OPFLAG_LENGTHAR
211a0 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  G|OPFLAG_TYPEOFA
211b0 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  RG);.          }
211c0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
211d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
211e0 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
211f0 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 30  se, pFarg, r1, 0
21200 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21220 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55    SQLITE_ECEL_DU
21230 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  P|SQLITE_ECEL_FA
21240 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 7d 65 6c  CTOR);.      }el
21250 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
21260 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
21270 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21280 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
21290 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f     /* Possibly o
212a0 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63  verload the func
212b0 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73  tion if the firs
212c0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20  t argument is.  
212d0 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c      ** a virtual
212e0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20   table column.. 
212f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
21300 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74   For infix funct
21310 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42  ions (LIKE, GLOB
21320 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41  , REGEXP, and MA
21330 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20  TCH) use the.   
21340 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67     ** second arg
21350 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66  ument, not the f
21360 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67  irst, as the arg
21370 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f  ument to test to
21380 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66  .      ** see if
21390 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20   it is a column 
213a0 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  in a virtual tab
213b0 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e  le.  This is don
213c0 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20  e because.      
213d0 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  ** the left oper
213e0 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e  and of infix fun
213f0 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72  ctions (the oper
21400 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20  and we want to. 
21410 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20       ** control 
21420 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64  overloading) end
21430 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f  s up as the seco
21440 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
21450 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  he.      ** func
21460 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65  tion.  The expre
21470 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22  ssion "A glob B"
21480 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
21490 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f  o .      ** "glo
214a0 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74  b(B,A).  We want
214b0 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e   to use the A in
214c0 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74   "A glob B" to t
214d0 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  est.      ** for
214e0 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f   function overlo
214f0 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75  ading.  But we u
21500 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e  se the B term in
21510 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20   "glob(B,A)"..  
21520 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
21530 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 45 78 70   nFarg>=2 && Exp
21540 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
21550 70 72 2c 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  pr, EP_InfixFunc
21560 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
21570 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
21580 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
21590 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
215a0 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78   pFarg->a[1].pEx
215b0 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
215c0 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a   if( nFarg>0 ){.
215d0 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
215e0 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
215f0 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
21600 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
21610 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
21620 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
21630 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
21640 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
21650 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
21660 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
21670 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
21680 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a  db->pDfltColl; .
21690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
216a0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
216b0 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30  CollSeq, 0, 0, 0
216c0 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
216d0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
216e0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
216f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45  ITE_ENABLE_OFFSE
21700 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20  T_SQL_FUNC.     
21710 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
21720 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
21730 4e 43 5f 4f 46 46 53 45 54 20 29 7b 0a 20 20 20  NC_OFFSET ){.   
21740 20 20 20 20 20 45 78 70 72 20 2a 70 41 72 67 20       Expr *pArg 
21750 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  = pFarg->a[0].pE
21760 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
21770 20 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f   pArg->op==TK_CO
21780 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
21790 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
217a0 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74  Op3(v, OP_Offset
217b0 2c 20 70 41 72 67 2d 3e 69 54 61 62 6c 65 2c 20  , pArg->iTable, 
217c0 70 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74  pArg->iColumn, t
217d0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
217e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
217f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21800 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
21810 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
21820 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
21830 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
21840 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
21850 64 62 65 41 64 64 4f 70 34 28 76 2c 20 70 50 61  dbeAddOp4(v, pPa
21860 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3f 20  rse->iSelfTab ? 
21870 4f 50 5f 50 75 72 65 46 75 6e 63 30 20 3a 20 4f  OP_PureFunc0 : O
21880 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a 20 20 20  P_Function0,.   
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218a0 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
218b0 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 20 28 63  , r1, target, (c
218c0 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55  har*)pDef, P4_FU
218d0 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20  NCDEF);.        
218e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
218f0 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67  eP5(v, (u8)nFarg
21900 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21910 20 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f   if( nFarg && co
21920 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20  nstMask==0 ){.  
21930 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
21940 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
21950 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29  arse, r1, nFarg)
21960 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21970 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
21980 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
21990 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
219a0 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
219b0 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
219c0 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
219d0 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
219e0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
219f0 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20  TK_EXISTS );.   
21a00 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
21a10 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
21a20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53      if( op==TK_S
21a30 45 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d  ELECT && (nCol =
21a40 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
21a50 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
21a60 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=1 ){.        
21a70 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
21a80 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43  Error(pParse, nC
21a90 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  ol, 1);.      }e
21aa0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
21ab0 75 72 6e 20 73 71 6c 69 74 65 33 43 6f 64 65 53  urn sqlite3CodeS
21ac0 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
21ad0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d   pExpr);.      }
21ae0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
21af0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
21b00 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b  SELECT_COLUMN: {
21b10 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
21b20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
21b30 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  Left->iTable==0 
21b40 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
21b50 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20  ->pLeft->iTable 
21b60 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  = sqlite3CodeSub
21b70 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
21b80 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
21b90 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
21ba0 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt( pExpr->iTabl
21bb0 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70  e==0 || pExpr->p
21bc0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Left->op==TK_SEL
21bd0 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ECT );.      if(
21be0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20   pExpr->iTable. 
21bf0 20 20 20 20 20 20 26 26 20 70 45 78 70 72 2d 3e        && pExpr->
21c00 69 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73 71 6c  iTable!=(n = sql
21c10 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
21c20 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ze(pExpr->pLeft)
21c30 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
21c40 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
21c50 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20  Msg(pParse, "%d 
21c60 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64  columns assigned
21c70 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20   %d values",.   
21c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
21ca0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29 3b 0a  pr->iTable, n);.
21cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
21cc0 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  turn pExpr->pLef
21cd0 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78 70  t->iTable + pExp
21ce0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
21cf0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
21d00 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
21d10 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69  stIfFalse = sqli
21d20 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
21d30 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
21d40 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
21d50 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
21d60 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
21d70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21d80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
21d90 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
21da0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21db0 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
21dc0 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
21dd0 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
21de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21df0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
21e00 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
21e10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21e20 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
21e30 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
21e40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21e50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21e60 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
21e70 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
21e80 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
21e90 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
21ea0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
21eb0 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  arget;.    }.#en
21ec0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
21ed0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
21ee0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
21ef0 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
21f00 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  D z.    **.    *
21f10 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61  * This is equiva
21f20 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20  lent to.    **. 
21f30 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
21f40 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20  D x<=z.    **.  
21f50 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64    ** X is stored
21f60 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
21f70 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74  ..    ** Y is st
21f80 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
21f90 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
21fa0 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74  ..    ** Z is st
21fb0 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
21fc0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
21fd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
21fe0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
21ff0 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
22000 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
22010 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20  xpr, target, 0, 
22020 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
22030 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20   target;.    }. 
22040 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a     case TK_SPAN:
22050 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
22060 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20  LATE: .    case 
22070 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
22080 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d    pExpr = pExpr-
22090 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 67 6f  >pLeft;.      go
220a0 74 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f  to expr_code_doo
220b0 76 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30 34 2d  ver; /* 2018-04-
220c0 32 38 3a 20 50 72 65 76 65 6e 74 20 64 65 65 70  28: Prevent deep
220d0 20 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53 53 46   recursion. OSSF
220e0 75 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20  uzz. */.    }.. 
220f0 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47     case TK_TRIGG
22100 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ER: {.      /* I
22110 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20  f the opcode is 
22120 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e  TK_TRIGGER, then
22130 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
22140 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20  is a reference. 
22150 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c       ** to a col
22160 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
22170 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f   or old.* pseudo
22180 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c  -tables availabl
22190 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72  e to.      ** tr
221a0 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20  igger programs. 
221b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70  In this case Exp
221c0 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20  r.iTable is set 
221d0 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20  to 1 for the.   
221e0 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75     ** new.* pseu
221f0 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66  do-table, or 0 f
22200 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  or the old.* pse
22210 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e  udo-table. Expr.
22220 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a  iColumn.      **
22230 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
22240 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65  olumn of the pse
22250 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61  udo-table to rea
22260 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20  d, or to -1 to. 
22270 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65       ** read the
22280 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20   rowid field..  
22290 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
222a0 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
222b0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  s implemented us
222c0 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20  ing an OP_Param 
222d0 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20  opcode. The p1. 
222e0 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65       ** paramete
222f0 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f  r is set to 0 fo
22300 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72  r an old.rowid r
22310 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20  eference, or to 
22320 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74  (i+1).      ** t
22330 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74  o reference anot
22340 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  her column of th
22350 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
22360 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20  able, where .   
22370 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69     ** i is the i
22380 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
22390 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f  mn. For a new.ro
223a0 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70  wid reference, p
223b0 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65  1 is.      ** se
223c0 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72  t to (n+1), wher
223d0 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e n is the numbe
223e0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
223f0 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c  each pseudo-tabl
22400 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  e..      ** For 
22410 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
22420 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20  ny other column 
22430 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65  in the new.* pse
22440 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20  udo-table, p1.  
22450 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
22460 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20   (n+2+i), where 
22470 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64  n and i are as d
22480 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c  efined previousl
22490 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20  y. For.      ** 
224a0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
224b0 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74  table on which t
224c0 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e  riggers are bein
224d0 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20  g fired is.     
224e0 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a   ** declared as:
224f0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
22500 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
22510 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
22520 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
22530 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72  en p1 is interpr
22540 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
22550 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
22560 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20  **   p1==0   -> 
22570 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20     old.rowid    
22580 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e   p1==3   ->    n
22590 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a  ew.rowid.      *
225a0 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20  *   p1==1   ->  
225b0 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20    old.a         
225c0 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65  p1==4   ->    ne
225d0 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  w.a.      **   p
225e0 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==2   ->    old
225f0 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35  .b         p1==5
22600 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20     ->    new.b  
22610 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20       .      */. 
22620 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
22630 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62   = pExpr->y.pTab
22640 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d  ;.      int p1 =
22650 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a   pExpr->iTable *
22660 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20   (pTab->nCol+1) 
22670 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f  + 1 + pExpr->iCo
22680 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73  lumn;..      ass
22690 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62  ert( pExpr->iTab
226a0 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e  le==0 || pExpr->
226b0 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
226c0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
226d0 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26  ->iColumn>=-1 &&
226e0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
226f0 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
22700 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
22710 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78  ->iPKey<0 || pEx
22720 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61  pr->iColumn!=pTa
22730 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20  b->iPKey );.    
22740 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20    assert( p1>=0 
22750 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f  && p1<(pTab->nCo
22760 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20  l*2+2) );..     
22770 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22780 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20  p2(v, OP_Param, 
22790 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  p1, target);.   
227a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
227b0 76 2c 20 22 72 5b 25 64 5d 3d 25 73 2e 25 73 22  v, "r[%d]=%s.%s"
227c0 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
227d0 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65    (pExpr->iTable
227e0 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22   ? "new" : "old"
227f0 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70  ),.        (pExp
22800 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22  r->iColumn<0 ? "
22810 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e  rowid" : pExpr->
22820 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  y.pTab->aCol[pEx
22830 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61  pr->iColumn].zNa
22840 6d 65 29 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23  me).      ));..#
22850 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22860 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
22870 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  T.      /* If th
22880 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41  e column has REA
22890 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d  L affinity, it m
228a0 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
228b0 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20  stored as an.   
228c0 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55     ** integer. U
228d0 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  se OP_RealAffini
228e0 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ty to make sure 
228f0 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61  it is really rea
22900 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  l..      **.    
22910 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
22920 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20  : R-60985-57662 
22930 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76  SQLite will conv
22940 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62 61  ert the value ba
22950 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66  ck to.      ** f
22960 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68  loating point wh
22970 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 74  en extracting it
22980 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64   from the record
22990 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
229a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
229b0 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54 61  0 .       && pTa
229c0 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
229d0 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
229e0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
229f0 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  L.      ){.     
22a00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22a10 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41  dOp1(v, OP_RealA
22a20 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29  ffinity, target)
22a30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
22a40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22a50 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
22a60 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20  _VECTOR: {.     
22a70 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
22a80 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61  (pParse, "row va
22a90 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20  lue misused");. 
22aa0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22ab0 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  }..    case TK_I
22ac0 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a 20 20  F_NULL_ROW: {.  
22ad0 20 20 20 20 69 6e 74 20 61 64 64 72 49 4e 52 3b      int addrINR;
22ae0 0a 20 20 20 20 20 20 61 64 64 72 49 4e 52 20 3d  .      addrINR =
22af0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22b00 70 31 28 76 2c 20 4f 50 5f 49 66 4e 75 6c 6c 52  p1(v, OP_IfNullR
22b10 6f 77 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ow, pExpr->iTabl
22b20 65 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  e);.      inReg 
22b30 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
22b40 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
22b50 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
22b60 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
22b70 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
22b80 28 76 2c 20 61 64 64 72 49 4e 52 29 3b 0a 20 20  (v, addrINR);.  
22b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
22ba0 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 49  hangeP3(v, addrI
22bb0 4e 52 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  NR, inReg);.    
22bc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
22bd0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f      /*.    ** Fo
22be0 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm A:.    **   C
22bf0 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48  ASE x WHEN e1 TH
22c00 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
22c10 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
22c20 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
22c30 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
22c40 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a  ** Form B:.    *
22c50 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31  *   CASE WHEN e1
22c60 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
22c70 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
22c80 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
22c90 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
22ca0 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20     ** Form A is 
22cb0 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d  can be transform
22cc0 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69  ed into the equi
22cd0 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73  valent form B as
22ce0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
22cf0 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65     CASE WHEN x=e
22d00 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78  1 THEN r1 WHEN x
22d10 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a  =e2 THEN r2 ....
22d20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48      **        WH
22d30 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20  EN x=eN THEN rN 
22d40 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
22d50 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69  *.    ** X (if i
22d60 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20  t exists) is in 
22d70 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
22d80 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74 68 65    ** Y is in the
22d90 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66   last element of
22da0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
22db0 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  if pExpr->x.pLis
22dc0 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20 20 20  t->nExpr is.    
22dd0 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59 20 69  ** odd.  The Y i
22de0 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e  s also optional.
22df0 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20    If the number 
22e00 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78  of elements in x
22e10 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69 73  .pList.    ** is
22e20 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20 69 73   even, then Y is
22e30 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68 65   omitted and the
22e40 20 22 6f 74 68 65 72 77 69 73 65 22 20 72 65 73   "otherwise" res
22e50 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20  ult is NULL..   
22e60 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78   ** Ei is in pEx
22e70 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
22e80 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78 70  ] and Ri is pExp
22e90 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b  r->pList->a[i*2+
22ea0 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  1]..    **.    *
22eb0 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * The result of 
22ec0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
22ed0 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68 65  s the Ri for the
22ee0 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
22ef0 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66  Ei,.    ** or if
22f00 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74   there is no mat
22f10 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c  ching Ei, the EL
22f20 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66  SE term Y, or if
22f30 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a   there is.    **
22f40 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e   no ELSE term, N
22f50 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ULL..    */.    
22f60 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
22f70 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20   op==TK_CASE ); 
22f80 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c  {.      int endL
22f90 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  abel;           
22fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54            /* GOT
22fb0 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20  O label for end 
22fc0 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a  of CASE stmt */.
22fd0 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61        int nextCa
22fe0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
22ff0 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20          /* GOTO 
23000 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57  label for next W
23010 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  HEN clause */.  
23020 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20      int nExpr;  
23030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23040 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62        /* 2x numb
23050 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  er of WHEN terms
23060 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
23090 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
230a0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
230b0 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  EList;          
230c0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
230d0 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
230e0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
230f0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73  rList_item *aLis
23100 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79  telem;  /* Array
23110 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
23120 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70 43  /.      Expr opC
23130 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20 20  ompare;         
23140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23150 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f   X==Ei expressio
23160 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
23170 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23190 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e  The X expression
231a0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
231b0 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pTest = 0;      
231c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58              /* X
231d0 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72  ==Ei (form A) or
231e0 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42   just Ei (form B
231f0 29 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  ) */.      Expr 
23200 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  *pDel = 0;.     
23210 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
23220 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 20 20  Parse->db;..    
23230 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
23240 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
23250 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
23260 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
23270 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
23280 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
23290 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
232a0 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
232b0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
232c0 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
232d0 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
232e0 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
232f0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
23300 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
23310 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
23320 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
23330 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  (pX = pExpr->pLe
23340 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ft)!=0 ){.      
23350 20 20 70 44 65 6c 20 3d 20 73 71 6c 69 74 65 33    pDel = sqlite3
23360 45 78 70 72 44 75 70 28 64 62 2c 20 70 58 2c 20  ExprDup(db, pX, 
23370 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
23380 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
23390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
233a0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
233b0 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20  db, pDel);.     
233c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
233d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
233e0 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
233f0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
23400 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69 73       exprToRegis
23410 74 65 72 28 70 44 65 6c 2c 20 65 78 70 72 43 6f  ter(pDel, exprCo
23420 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c  deVector(pParse,
23430 20 70 44 65 6c 2c 20 26 72 65 67 46 72 65 65 31   pDel, &regFree1
23440 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ));.        test
23450 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
23460 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  0 );.        mem
23470 73 65 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20  set(&opCompare, 
23480 30 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70  0, sizeof(opComp
23490 61 72 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f  are));.        o
234a0 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b  pCompare.op = TK
234b0 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  _EQ;.        opC
234c0 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 70  ompare.pLeft = p
234d0 44 65 6c 3b 0a 20 20 20 20 20 20 20 20 70 54 65  Del;.        pTe
234e0 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b  st = &opCompare;
234f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  .        /* Tick
23500 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65  et b351d95f9cd5e
23510 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63  f17e9d9dbae18f5c
23520 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20  a8611190001:.   
23530 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75       ** The valu
23540 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69  e in regFree1 mi
23550 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64  ght get SCopy-ed
23560 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72   into the file r
23570 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a  esult..        *
23580 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * So make sure t
23590 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31  hat the regFree1
235a0 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
235b0 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65   reused for othe
235c0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72  r.        ** pur
235d0 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62  poses and possib
235e0 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ly overwritten. 
235f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46   */.        regF
23600 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  ree1 = 0;.      
23610 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
23620 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b   i<nExpr-1; i=i+
23630 32 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2){.        if( 
23640 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
23650 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
23660 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
23670 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
23680 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
23690 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
236a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
236b0 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
236c0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
236d0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
236e0 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
236f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
23700 73 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  se);.        tes
23710 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70  tcase( pTest->op
23720 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
23730 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
23740 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
23750 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
23760 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
23770 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
23780 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
23790 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
237a0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
237b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
237c0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
237d0 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
237e0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
237f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23800 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62  beGoto(v, endLab
23810 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
23820 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
23830 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65  abel(v, nextCase
23840 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23850 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d   if( (nExpr&1)!=
23860 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
23870 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
23880 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e  rse, pEList->a[n
23890 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74  Expr-1].pExpr, t
238a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65  arget);.      }e
238b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
238c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
238d0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
238e0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
238f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23900 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
23910 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
23920 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
23930 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  v, endLabel);.  
23940 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
23950 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23960 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
23970 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
23980 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23990 70 45 78 70 72 2d 3e 61 66 66 45 78 70 72 3d 3d  pExpr->affExpr==
239a0 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20  OE_Rollback .   
239b0 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
239c0 2d 3e 61 66 66 45 78 70 72 3d 3d 4f 45 5f 41 62  ->affExpr==OE_Ab
239d0 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ort.           |
239e0 7c 20 70 45 78 70 72 2d 3e 61 66 66 45 78 70 72  | pExpr->affExpr
239f0 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20  ==OE_Fail.      
23a00 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
23a10 66 66 45 78 70 72 3d 3d 4f 45 5f 49 67 6e 6f 72  ffExpr==OE_Ignor
23a20 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
23a30 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54   if( !pParse->pT
23a40 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20  riggerTab ){.   
23a50 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
23a60 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
23a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a80 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79      "RAISE() may
23a90 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
23aa0 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70  thin a trigger-p
23ab0 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
23ac0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
23ad0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
23ae0 78 70 72 2d 3e 61 66 66 45 78 70 72 3d 3d 4f 45  xpr->affExpr==OE
23af0 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
23b00 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
23b10 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  t(pParse);.     
23b20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
23b30 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
23b40 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
23b50 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69  alue) );.      i
23b60 66 28 20 70 45 78 70 72 2d 3e 61 66 66 45 78 70  f( pExpr->affExp
23b70 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  r==OE_Ignore ){.
23b80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23b90 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
23ba0 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c         v, OP_Hal
23bb0 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45  t, SQLITE_OK, OE
23bc0 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70  _Ignore, 0, pExp
23bd0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a  r->u.zToken,0);.
23be0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
23bf0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
23c00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
23c10 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
23c20 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49  int(pParse, SQLI
23c30 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
23c40 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20  IGGER,.         
23c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c60 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 45       pExpr->affE
23c70 78 70 72 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  xpr, pExpr->u.zT
23c80 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  oken, 0, 0);.   
23c90 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61     }..      brea
23ca0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
23cb0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
23cc0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
23cd0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
23ce0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
23cf0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
23d00 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75  egFree2);.  retu
23d10 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  rn inReg;.}../*.
23d20 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68  ** Factor out th
23d30 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69  e code of the gi
23d40 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ven expression t
23d50 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  o initialization
23d60 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   time..**.** If 
23d70 72 65 67 44 65 73 74 3e 3d 30 20 74 68 65 6e 20  regDest>=0 then 
23d80 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c  the result is al
23d90 77 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20 74  ways stored in t
23da0 68 61 74 20 72 65 67 69 73 74 65 72 20 61 6e 64  hat register and
23db0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69   the.** result i
23dc0 73 20 6e 6f 74 20 72 65 75 73 61 62 6c 65 2e 20  s not reusable. 
23dd0 20 49 66 20 72 65 67 44 65 73 74 3c 30 20 74 68   If regDest<0 th
23de0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
23df0 69 73 20 66 72 65 65 20 74 6f 20 0a 2a 2a 20 73  is free to .** s
23e00 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 77  tore the value w
23e10 68 65 72 65 65 76 65 72 20 69 74 20 77 61 6e 74  hereever it want
23e20 73 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  s.  The register
23e30 20 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65   where the expre
23e40 73 73 69 6f 6e 20 0a 2a 2a 20 69 73 20 73 74 6f  ssion .** is sto
23e50 72 65 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e  red is returned.
23e60 20 20 57 68 65 6e 20 72 65 67 44 65 73 74 3c 30    When regDest<0
23e70 2c 20 74 77 6f 20 69 64 65 6e 74 69 63 61 6c 20  , two identical 
23e80 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69 6c 6c  expressions will
23e90 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 74 68 65 20  .** code to the 
23ea0 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e 0a 2a  same register..*
23eb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
23ec0 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50  rCodeAtInit(.  P
23ed0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
23ee0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
23ef0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
23f00 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  Expr,      /* Th
23f10 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
23f20 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56 44  code when the VD
23f30 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a  BE initializes *
23f40 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74 20  /.  int regDest 
23f50 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
23f60 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73  he value in this
23f70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
23f80 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20    ExprList *p;. 
23f90 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61   assert( ConstFa
23fa0 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29  ctorOk(pParse) )
23fb0 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
23fc0 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 69 66  pConstExpr;.  if
23fd0 28 20 72 65 67 44 65 73 74 3c 30 20 26 26 20 70  ( regDest<0 && p
23fe0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
23ff0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
24000 74 65 6d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  tem;.    int i;.
24010 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d      for(pItem=p-
24020 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20  >a, i=p->nExpr; 
24030 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d  i>0; pItem++, i-
24040 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  -){.      if( pI
24050 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26  tem->reusable &&
24060 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
24070 61 72 65 28 30 2c 70 49 74 65 6d 2d 3e 70 45 78  are(0,pItem->pEx
24080 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20  pr,pExpr,-1)==0 
24090 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
240a0 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73  n pItem->u.iCons
240b0 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20  tExprReg;.      
240c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  }.    }.  }.  pE
240d0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
240e0 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
240f0 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20   pExpr, 0);.  p 
24100 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
24110 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
24120 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  p, pExpr);.  if(
24130 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63   p ){.     struc
24140 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
24150 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
24160 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
24170 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
24180 20 3d 20 72 65 67 44 65 73 74 3c 30 3b 0a 20 20   = regDest<0;.  
24190 20 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30     if( regDest<0
241a0 20 29 20 72 65 67 44 65 73 74 20 3d 20 2b 2b 70   ) regDest = ++p
241b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
241c0 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73    pItem->u.iCons
241d0 74 45 78 70 72 52 65 67 20 3d 20 72 65 67 44 65  tExprReg = regDe
241e0 73 74 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  st;.  }.  pParse
241f0 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70  ->pConstExpr = p
24200 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 44 65  ;.  return regDe
24210 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  st;.}../*.** Gen
24220 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
24230 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73  aluate an expres
24240 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  sion and store t
24250 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
24260 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  to a register.  
24270 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
24280 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ter number where
24290 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
242a0 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
242b0 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65  * If the registe
242c0 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  r is a temporary
242d0 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63   register that c
242e0 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65  an be deallocate
242f0 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65  d,.** then write
24300 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f   its number into
24310 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20   *pReg.  If the 
24320 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
24330 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70  is not.** a temp
24340 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20  orary, then set 
24350 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pReg to zero..*
24360 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73  *.** If pExpr is
24370 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65   a constant, the
24380 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  n this routine m
24390 69 67 68 74 20 67 65 6e 65 72 61 74 65 20 74 68  ight generate th
243a0 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69  is.** code to fi
243b0 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ll the register 
243c0 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  in the initializ
243d0 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66  ation section of
243e0 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
243f0 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74  gram, in order t
24400 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20  o factor it out 
24410 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  of the evaluatio
24420 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73  n loop..*/.int s
24430 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
24440 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mp(Parse *pParse
24450 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
24460 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74  nt *pReg){.  int
24470 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   r2;.  pExpr = s
24480 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
24490 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
244a0 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f  if( ConstFactorO
244b0 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26 26 20  k(pParse).   && 
244c0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
244d0 47 49 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c  GISTER.   && sql
244e0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
244f0 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29  ntNotJoin(pExpr)
24500 0a 20 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20  .  ){.    *pReg 
24510 20 3d 20 30 3b 0a 20 20 20 20 72 32 20 3d 20 73   = 0;.    r2 = s
24520 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
24530 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
24540 70 72 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65  pr, -1);.  }else
24550 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73  {.    int r1 = s
24560 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
24570 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32  (pParse);.    r2
24580 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24590 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
245a0 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20   pExpr, r1);.   
245b0 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20   if( r2==r1 ){. 
245c0 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b       *pReg = r1;
245d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
245e0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
245f0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
24600 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67  r1);.      *pReg
24610 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
24620 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a    return r2;.}..
24630 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
24640 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
24650 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
24660 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
24670 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
24680 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
24690 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
246a0 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
246b0 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e   to appear.** in
246c0 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
246d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
246e0 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
246f0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
24700 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
24710 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a  ){.  int inReg;.
24720 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
24730 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
24740 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
24750 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45   if( pExpr && pE
24760 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
24770 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69  STER ){.    sqli
24780 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
24790 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
247a0 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61  Copy, pExpr->iTa
247b0 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ble, target);.  
247c0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67  }else{.    inReg
247d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
247e0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
247f0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
24800 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24810 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c  rse->pVdbe!=0 ||
24820 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
24830 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
24840 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
24850 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56  et && pParse->pV
24860 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  dbe ){.      sql
24870 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
24880 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
24890 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74  _SCopy, inReg, t
248a0 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arget);.    }.  
248b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
248c0 61 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79  a transient copy
248d0 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
248e0 45 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f  Expr and then co
248f0 64 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73  de it using.** s
24900 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
24910 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
24920 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
24930 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
24940 29 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74  ).** except that
24950 20 74 68 65 20 69 6e 70 75 74 20 65 78 70 72 65   the input expre
24960 73 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74  ssion is guarant
24970 65 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e  eed to be unchan
24980 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ged..*/.void sql
24990 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79  ite3ExprCodeCopy
249a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
249b0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
249c0 20 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69   target){.  sqli
249d0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
249e0 2d 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20  ->db;.  pExpr = 
249f0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
24a00 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
24a10 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
24a20 61 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45  ailed ) sqlite3E
24a30 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
24a40 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
24a50 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
24a60 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
24a70 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
24a80 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
24a90 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
24aa0 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73  sion pExpr and s
24ab0 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
24ac0 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
24ad0 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
24ae0 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74  ults are guarant
24af0 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a  eed to appear.**
24b00 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
24b10 67 65 74 2e 20 20 49 66 20 74 68 65 20 65 78 70  get.  If the exp
24b20 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
24b30 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
24b40 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20  outine.** might 
24b50 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74  choose to code t
24b60 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74  he expression at
24b70 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
24b80 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
24b90 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63  lite3ExprCodeFac
24ba0 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70  torable(Parse *p
24bb0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
24bc0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
24bd0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f  .  if( pParse->o
24be0 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20  kConstFactor && 
24bf0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
24c00 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78  stantNotJoin(pEx
24c10 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pr) ){.    sqlit
24c20 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
24c30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
24c40 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  target);.  }else
24c50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
24c60 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
24c70 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
24c80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
24c90 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76  ate code that ev
24ca0 61 6c 75 61 74 65 73 20 74 68 65 20 67 69 76 65  aluates the give
24cb0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
24cc0 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74   puts the result
24cd0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
24ce0 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c  target..**.** Al
24cf0 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  so make a copy o
24d00 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
24d10 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e   results into an
24d20 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65  other "cache" re
24d30 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f  gister.** and mo
24d40 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73  dify the express
24d50 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20  ion so that the 
24d60 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20  next time it is 
24d70 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68  evaluated,.** th
24d80 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f  e result is a co
24d90 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  py of the cache 
24da0 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  register..**.** 
24db0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
24dc0 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73  used for express
24dd0 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73  ions that are us
24de0 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20  ed multiple .** 
24df0 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65  times.  They are
24e00 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20   evaluated once 
24e10 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20  and the results 
24e20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
24e30 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e  n.** are reused.
24e40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24e50 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65  ExprCodeAndCache
24e60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
24e70 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
24e80 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
24e90 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
24ea0 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b  dbe;.  int iMem;
24eb0 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
24ec0 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  et>0 );.  assert
24ed0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
24ee0 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71  REGISTER );.  sq
24ef0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
24f00 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
24f10 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b  get);.  iMem = +
24f20 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
24f30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24f40 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74  p2(v, OP_Copy, t
24f50 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20  arget, iMem);.  
24f60 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70  exprToRegister(p
24f70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a  Expr, iMem);.}..
24f80 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
24f90 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20  ode that pushes 
24fa0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65  the value of eve
24fb0 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ry element of th
24fc0 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
24fd0 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20  ssion list into 
24fe0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
24ff0 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e  gisters beginnin
25000 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  g at target..**.
25010 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
25020 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
25030 20 65 76 61 6c 75 61 74 65 64 2e 20 20 54 68 65   evaluated.  The
25040 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
25050 20 77 69 6c 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79   will.** usually
25060 20 62 65 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72   be pList->nExpr
25070 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 72 65   but might be re
25080 64 75 63 65 64 20 69 66 20 53 51 4c 49 54 45 5f  duced if SQLITE_
25090 45 43 45 4c 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20  ECEL_OMITREF.** 
250a0 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a  is defined..**.*
250b0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
250c0 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76 65  L_DUP flag preve
250d0 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74  nts the argument
250e0 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20  s from being.** 
250f0 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f  filled using OP_
25100 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20  SCopy.  OP_Copy 
25110 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73  must be used ins
25120 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tead..**.** The 
25130 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
25140 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f  OR argument allo
25150 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  ws constant argu
25160 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66  ments to be.** f
25170 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f  actored out into
25180 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
25190 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
251a0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20  SQLITE_ECEL_REF 
251b0 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20  flag means that 
251c0 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
251d0 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20  he list with.** 
251e0 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78  ExprList.a[].u.x
251f0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 68  .iOrderByCol>0 h
25200 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
25210 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 73   evaluated and s
25220 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69  tored.** in regi
25230 73 74 65 72 73 20 61 74 20 73 72 63 52 65 67 2c  sters at srcReg,
25240 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61 6c 75   and so the valu
25250 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65 64 20  e can be copied 
25260 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2a 20 49  from there..** I
25270 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d  f SQLITE_ECEL_OM
25280 49 54 52 45 46 20 69 73 20 61 6c 73 6f 20 73 65  ITREF is also se
25290 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  t, then the valu
252a0 65 73 20 77 69 74 68 20 75 2e 78 2e 69 4f 72 64  es with u.x.iOrd
252b0 65 72 42 79 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65  erByCol>0.** are
252c0 20 73 69 6d 70 6c 79 20 6f 6d 69 74 74 65 64 20   simply omitted 
252d0 72 61 74 68 65 72 20 74 68 61 6e 20 62 65 69 6e  rather than bein
252e0 67 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 72  g copied from sr
252f0 63 52 65 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  cReg..*/.int sql
25300 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
25310 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
25320 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
25330 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
25340 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
25350 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70  st,   /* The exp
25360 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
25370 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  be coded */.  in
25380 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20  t target,       
25390 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
253a0 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  te results */.  
253b0 69 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20 20  int srcReg,     
253c0 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67     /* Source reg
253d0 69 73 74 65 72 73 20 69 66 20 53 51 4c 49 54 45  isters if SQLITE
253e0 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75  _ECEL_REF */.  u
253f0 38 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  8 flags         
25400 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c    /* SQLITE_ECEL
25410 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
25420 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
25430 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
25440 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75  int i, j, n;.  u
25450 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67  8 copyOp = (flag
25460 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
25470 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a  DUP) ? OP_Copy :
25480 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62   OP_SCopy;.  Vdb
25490 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
254a0 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
254b0 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73  pList!=0 );.  as
254c0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
254d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
254e0 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20  se->pVdbe!=0 ); 
254f0 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74   /* Never gets t
25500 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69 73  his far otherwis
25510 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74  e */.  n = pList
25520 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21  ->nExpr;.  if( !
25530 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
25540 61 72 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d  arse) ) flags &=
25550 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41   ~SQLITE_ECEL_FA
25560 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65  CTOR;.  for(pIte
25570 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
25580 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d   i<n; i++, pItem
25590 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
255a0 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45  Expr = pItem->pE
255b0 78 70 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  xpr;.#ifdef SQLI
255c0 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
255d0 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
255e0 69 66 28 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74  if( pItem->bSort
255f0 65 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 69  erRef ){.      i
25600 2d 2d 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20  --;.      n--;. 
25610 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
25620 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
25630 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46   SQLITE_ECEL_REF
25640 29 21 3d 30 20 26 26 20 28 6a 20 3d 20 70 49 74  )!=0 && (j = pIt
25650 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
25660 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  Col)>0 ){.      
25670 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
25680 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20  TE_ECEL_OMITREF 
25690 29 7b 0a 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a  ){.        i--;.
256a0 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20          n--;.   
256b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
256c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
256d0 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a  Op2(v, copyOp, j
256e0 2b 73 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65  +srcReg-1, targe
256f0 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t+i);.      }.  
25700 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
25710 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
25720 5f 46 41 43 54 4f 52 29 21 3d 30 0a 20 20 20 20  _FACTOR)!=0.    
25730 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
25740 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
25750 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20  otJoin(pExpr).  
25760 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
25770 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
25780 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
25790 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d  target+i);.    }
257a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
257b0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
257c0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
257d0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
257e0 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66  get+i);.      if
257f0 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b  ( inReg!=target+
25800 69 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  i ){.        Vdb
25810 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20  eOp *pOp;.      
25820 20 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50    if( copyOp==OP
25830 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26  _Copy.         &
25840 26 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64  & (pOp=sqlite3Vd
25850 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d  beGetOp(v, -1))-
25860 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79  >opcode==OP_Copy
25870 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70  .         && pOp
25880 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d  ->p1+pOp->p3+1==
25890 69 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  inReg.         &
258a0 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70  & pOp->p2+pOp->p
258b0 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20  3+1==target+i.  
258c0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
258d0 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20     pOp->p3++;.  
258e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
258f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
25900 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79  beAddOp2(v, copy
25910 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  Op, inReg, targe
25920 74 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t+i);.        }.
25930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25940 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
25950 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
25960 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45  code for a BETWE
25970 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  EN operator..**.
25980 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  **    x BETWEEN 
25990 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68  y AND z.**.** Th
259a0 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76  e above is equiv
259b0 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20  alent to .**.** 
259c0 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
259d0 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61  .**.** Code it a
259e0 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63  s such, taking c
259f0 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f  are to do the co
25a00 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69  mmon subexpressi
25a10 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f  on.** eliminatio
25a20 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68  n of x..**.** Th
25a30 65 20 78 4a 75 6d 70 49 66 20 70 61 72 61 6d 65  e xJumpIf parame
25a40 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 64  ter determines d
25a50 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  etails:.**.**   
25a60 20 4e 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20   NULL:          
25a70 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 74           Store t
25a80 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
25a90 74 20 69 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a  t in reg[dest].*
25aa0 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  *    sqlite3Expr
25ab0 49 66 54 72 75 65 3a 20 20 20 20 20 20 4a 75 6d  IfTrue:      Jum
25ac0 70 20 74 6f 20 64 65 73 74 20 69 66 20 74 72 75  p to dest if tru
25ad0 65 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45  e.**    sqlite3E
25ae0 78 70 72 49 66 46 61 6c 73 65 3a 20 20 20 20 20  xprIfFalse:     
25af0 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20  Jump to dest if 
25b00 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  false.**.** The 
25b10 6a 75 6d 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d  jumpIfNull param
25b20 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20  eter is ignored 
25b30 69 66 20 78 4a 75 6d 70 49 66 20 69 73 20 4e 55  if xJumpIf is NU
25b40 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  LL..*/.static vo
25b50 69 64 20 65 78 70 72 43 6f 64 65 42 65 74 77 65  id exprCodeBetwe
25b60 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
25b70 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
25b80 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
25b90 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
25ba0 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
25bb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54        /* The BET
25bc0 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  WEEN expression 
25bd0 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
25be0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64         /* Jump d
25bf0 65 73 74 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74  estination or st
25c00 6f 72 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a  orage location *
25c10 2f 0a 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70  /.  void (*xJump
25c20 29 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69  )(Parse*,Expr*,i
25c30 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69  nt,int), /* Acti
25c40 6f 6e 20 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20  on to take */.  
25c50 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20  int jumpIfNull  
25c60 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75    /* Take the ju
25c70 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45  mp if the BETWEE
25c80 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  N is NULL */.){.
25c90 20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20    Expr exprAnd; 
25ca0 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f      /* The AND o
25cb0 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79  perator in  x>=y
25cc0 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20   AND x<=z  */.  
25cd0 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20  Expr compLeft;  
25ce0 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20    /* The  x>=y  
25cf0 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63  term */.  Expr c
25d00 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54  ompRight;   /* T
25d10 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a  he  x<=z  term *
25d20 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  /.  int regFree1
25d30 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61   = 0; /* Tempora
25d40 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20  ry use register 
25d50 2a 2f 0a 20 20 45 78 70 72 20 2a 70 44 65 6c 20  */.  Expr *pDel 
25d60 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
25d70 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
25d80 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70  ..  memset(&comp
25d90 4c 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Left, 0, sizeof(
25da0 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  Expr));.  memset
25db0 28 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20  (&compRight, 0, 
25dc0 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
25dd0 20 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64   memset(&exprAnd
25de0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
25df0 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  ));..  assert( !
25e00 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
25e10 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
25e20 65 63 74 29 20 29 3b 0a 20 20 70 44 65 6c 20 3d  ect) );.  pDel =
25e30 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
25e40 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
25e50 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  , 0);.  if( db->
25e60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
25e70 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 64 2e 6f  ){.    exprAnd.o
25e80 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20  p = TK_AND;.    
25e90 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20  exprAnd.pLeft = 
25ea0 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 65  &compLeft;.    e
25eb0 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
25ec0 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20  &compRight;.    
25ed0 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
25ee0 5f 47 45 3b 0a 20 20 20 20 63 6f 6d 70 4c 65 66  _GE;.    compLef
25ef0 74 2e 70 4c 65 66 74 20 3d 20 70 44 65 6c 3b 0a  t.pLeft = pDel;.
25f00 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69      compLeft.pRi
25f10 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
25f20 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
25f30 3b 0a 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e  ;.    compRight.
25f40 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20  op = TK_LE;.    
25f50 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20  compRight.pLeft 
25f60 3d 20 70 44 65 6c 3b 0a 20 20 20 20 63 6f 6d 70  = pDel;.    comp
25f70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70  Right.pRight = p
25f80 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
25f90 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 65  [1].pExpr;.    e
25fa0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 44  xprToRegister(pD
25fb0 65 6c 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74  el, exprCodeVect
25fc0 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 6c 2c  or(pParse, pDel,
25fd0 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20   &regFree1));.  
25fe0 20 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20    if( xJump ){. 
25ff0 20 20 20 20 20 78 4a 75 6d 70 28 70 50 61 72 73       xJump(pPars
26000 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
26010 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26020 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26030 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 65 78 70   /* Mark the exp
26040 72 65 73 73 69 6f 6e 20 69 73 20 62 65 69 6e 67  ression is being
26050 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20   from the ON or 
26060 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
26070 61 20 6a 6f 69 6e 0a 20 20 20 20 20 20 2a 2a 20  a join.      ** 
26080 73 6f 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  so that the sqli
26090 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
260a0 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  t() routine will
260b0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
260c0 6d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 74  move.      ** it
260d0 20 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e   into the Parse.
260e0 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 2e  pConstExpr list.
260f0 20 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65 20    We should use 
26100 61 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74 68  a new bit for th
26110 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  is,.      ** for
26120 20 63 6c 61 72 69 74 79 2c 20 62 75 74 20 77 65   clarity, but we
26130 20 61 72 65 20 6f 75 74 20 6f 66 20 62 69 74 73   are out of bits
26140 20 69 6e 20 74 68 65 20 45 78 70 72 2e 66 6c 61   in the Expr.fla
26150 67 73 20 66 69 65 6c 64 20 73 6f 20 77 65 0a 20  gs field so we. 
26160 20 20 20 20 20 2a 2a 20 68 61 76 65 20 74 6f 20       ** have to 
26170 72 65 75 73 65 20 74 68 65 20 45 50 5f 46 72 6f  reuse the EP_Fro
26180 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75 6d 6d  mJoin bit.  Bumm
26190 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 44 65  er. */.      pDe
261a0 6c 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46  l->flags |= EP_F
261b0 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 73  romJoin;.      s
261c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
261d0 72 67 65 74 28 70 50 61 72 73 65 2c 20 26 65 78  rget(pParse, &ex
261e0 70 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20  prAnd, dest);.  
261f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52    }.    sqlite3R
26200 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
26210 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
26220 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
26230 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  prDelete(db, pDe
26240 6c 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  l);..  /* Ensure
26250 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63   adequate test c
26260 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73  overage */.  tes
26270 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
26280 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
26290 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
262a0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
262b0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
262c0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
262d0 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
262e0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
262f0 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
26300 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
26310 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
26320 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
26330 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
26340 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
26350 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
26360 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
26370 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
26380 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
26390 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
263a0 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
263b0 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
263c0 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
263d0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
263e0 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
263f0 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
26400 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
26410 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
26420 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
26430 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
26440 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
26450 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
26460 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
26470 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
26480 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
26490 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
264a0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
264b0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
264c0 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  Jump==0 );.}../*
264d0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
264e0 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
264f0 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
26500 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
26510 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
26520 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
26530 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
26540 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69  true but executi
26550 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
26560 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
26570 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
26580 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  is false..**.** 
26590 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
265a0 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
265b0 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
265c0 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68  e nor false), th
265d0 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
265e0 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49  ump if the jumpI
265f0 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51  fNull flag is SQ
26600 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e  LITE_JUMPIFNULL.
26610 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
26620 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
26630 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
26640 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
26650 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
26660 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
26670 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
26680 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
26690 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
266a0 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
266b0 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
266c0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
266d0 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
266e0 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
266f0 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
26700 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
26710 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
26720 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
26730 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
26740 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
26750 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
26760 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
26770 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
26780 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
26790 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
267a0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
267b0 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
267c0 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
267d0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
267e0 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
267f0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
26800 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
26810 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
26820 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
26830 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
26840 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
26850 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26860 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
26870 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20  ) )     return; 
26880 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66   /* Existence of
26890 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
268a0 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
268b0 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
268c0 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e   ) return;  /* N
268d0 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68  o way this can h
268e0 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20  appen */.  op = 
268f0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
26900 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
26910 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
26920 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
26930 20 20 20 20 45 78 70 72 20 2a 70 41 6c 74 20 3d      Expr *pAlt =
26940 20 73 71 6c 69 74 65 33 45 78 70 72 53 69 6d 70   sqlite3ExprSimp
26950 6c 69 66 69 65 64 41 6e 64 4f 72 28 70 45 78 70  lifiedAndOr(pExp
26960 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  r);.      if( pA
26970 6c 74 21 3d 70 45 78 70 72 20 29 7b 0a 20 20 20  lt!=pExpr ){.   
26980 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26990 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
269a0 41 6c 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  Alt, dest, jumpI
269b0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 65  fNull);.      }e
269c0 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  lse if( op==TK_A
269d0 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ND ){.        in
269e0 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
269f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
26a00 73 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  se);.        tes
26a10 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
26a20 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l==0 );.        
26a30 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
26a40 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
26a50 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 0a 20 20 20  ->pLeft, d2,.   
26a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a70 20 20 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75          jumpIfNu
26a80 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
26a90 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 73  NULL);.        s
26aa0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
26ab0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
26ac0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
26ad0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
26ae0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
26af0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
26b00 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
26b10 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
26b20 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26b30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
26b40 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
26b50 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
26b60 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
26b70 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ull);.        sq
26b80 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
26b90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
26ba0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
26bb0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
26bc0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
26bd0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
26be0 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
26bf0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26c00 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
26c10 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
26c20 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
26c30 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
26c40 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
26c50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
26c60 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a    case TK_TRUTH:
26c70 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e   {.      int isN
26c80 6f 74 3b 20 20 20 20 20 20 2f 2a 20 49 53 20 4e  ot;      /* IS N
26c90 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f  OT TRUE or IS NO
26ca0 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20  T FALSE */.     
26cb0 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 20 20   int isTrue;    
26cc0 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49   /* IS TRUE or I
26cd0 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20  S NOT TRUE */.  
26ce0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26cf0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26d00 20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78       isNot = pEx
26d10 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f  pr->op2==TK_ISNO
26d20 54 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20  T;.      isTrue 
26d30 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75  = sqlite3ExprTru
26d40 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70  thValue(pExpr->p
26d50 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65  Right);.      te
26d60 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26  stcase( isTrue &
26d70 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20  & isNot );.     
26d80 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72   testcase( !isTr
26d90 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20  ue && isNot );. 
26da0 20 20 20 20 20 69 66 28 20 69 73 54 72 75 65 20       if( isTrue 
26db0 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20  ^ isNot ){.     
26dc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
26dd0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
26de0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
26df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26e00 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74             isNot
26e10 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   ? SQLITE_JUMPIF
26e20 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20  NULL : 0);.     
26e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26e40 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
26e50 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
26e60 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20  ->pLeft, dest,. 
26e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e80 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20            isNot 
26e90 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ? SQLITE_JUMPIFN
26ea0 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ULL : 0);.      
26eb0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
26ec0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
26ed0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
26ee0 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65  _ISNOT:.      te
26ef0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
26f00 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
26f10 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
26f20 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  T );.      op = 
26f30 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
26f40 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
26f50 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20     jumpIfNull = 
26f60 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
26f70 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
26f80 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  u */.    case TK
26f90 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
26fa0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
26fb0 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
26fc0 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
26fd0 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
26fe0 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _EQ: {.      if(
26ff0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
27000 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  ctor(pExpr->pLef
27010 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c  t) ) goto defaul
27020 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65  t_expr;.      te
27030 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
27040 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ll==0 );.      r
27050 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
27060 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
27070 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
27080 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
27090 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
270a0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
270b0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
270c0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
270d0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(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 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
27100 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
27110 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
27120 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
27130 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
27140 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
27150 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
27160 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
27170 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
27180 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
27190 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
271a0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
271b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
271c0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
271d0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
271e0 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
271f0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
27200 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27210 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
27220 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
27230 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
27240 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
27250 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27260 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
27270 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
27280 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
27290 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  (op==OP_Eq);.   
272a0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
272b0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
272c0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
272d0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
272e0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
272f0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
27300 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
27310 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
27320 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
27330 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
27340 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  ase(op==OP_Ne);.
27350 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27360 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
27370 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
27380 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
27390 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
273a0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
273b0 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
273c0 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
273d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
273e0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
273f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27400 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
27410 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27420 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
27430 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
27440 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
27450 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
27460 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
27470 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
27480 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
27490 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
274a0 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
274b0 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
274c0 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
274d0 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  L );.      r1 = 
274e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
274f0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
27500 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
27510 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
27520 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
27530 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
27540 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27550 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
27560 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
27570 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27580 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
27590 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
275a0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
275b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
275c0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
275d0 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
275e0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
275f0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
27600 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
27610 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
27620 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70  dest, sqlite3Exp
27630 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e  rIfTrue, jumpIfN
27640 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
27650 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
27660 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
27670 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
27680 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
27690 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
276a0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
276b0 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
276c0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
276d0 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  ll = jumpIfNull 
276e0 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46  ? dest : destIfF
276f0 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  alse;.      sqli
27700 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
27710 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
27720 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
27730 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
27740 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
27750 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
27760 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
27770 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61  abel(v, destIfFa
27780 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lse);.      brea
27790 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
277a0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
277b0 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a     default_expr:
277c0 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 41  .      if( ExprA
277d0 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
277e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
277f0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
27800 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
27810 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73  e if( ExprAlways
27820 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
27830 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70          /* No-op
27840 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
27850 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
27860 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
27870 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
27880 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
27890 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
278a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c  AddOp3(v, OP_If,
278b0 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
278c0 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
278d0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
278e0 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
278f0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
27900 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
27910 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
27920 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  l==0 );.      }.
27930 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27940 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
27950 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
27960 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
27970 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
27980 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
27990 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d  , regFree2);  .}
279a0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
279b0 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
279c0 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
279d0 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
279e0 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
279f0 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
27a00 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
27a10 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78   is false but ex
27a20 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
27a30 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
27a40 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
27a50 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a  sion is true..**
27a60 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
27a70 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
27a80 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
27a90 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
27aa0 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66   then.** jump if
27ab0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53   jumpIfNull is S
27ac0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
27ad0 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
27ae0 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a   if jumpIfNull.*
27af0 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  * is 0..*/.void 
27b00 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
27b10 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
27b20 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
27b30 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
27b40 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
27b50 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
27b60 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
27b70 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
27b80 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
27b90 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
27ba0 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
27bb0 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
27bc0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
27bd0 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
27be0 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
27bf0 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
27c00 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f  ; /* Existence o
27c10 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
27c20 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
27c30 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20  ( pExpr==0 )    
27c40 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
27c50 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72  e value of pExpr
27c60 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20  ->op and op are 
27c70 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  related as follo
27c80 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
27c90 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
27ca0 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a           op.  **
27cb0 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
27cc0 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
27cd0 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20  ----.  **       
27ce0 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20  TK_ISNULL       
27cf0 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20     OP_NotNull.  
27d00 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e  **       TK_NOTN
27d10 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49  ULL         OP_I
27d20 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  sNull.  **      
27d30 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20   TK_NE          
27d40 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20      OP_Eq.  **  
27d50 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20       TK_EQ      
27d60 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20          OP_Ne.  
27d70 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20  **       TK_GT  
27d80 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
27d90 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
27da0 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
27db0 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Gt.  **      
27dc0 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20   TK_GE          
27dd0 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20      OP_Lt.  **  
27de0 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20       TK_LT      
27df0 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20          OP_Ge.  
27e00 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65  **.  ** For othe
27e10 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70  r values of pExp
27e20 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64  r->op, op is und
27e30 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65  efined and unuse
27e40 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  d..  ** The valu
27e50 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  e of TK_ and OP_
27e60 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61   constants are a
27e70 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61  rranged such tha
27e80 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f  t we.  ** can co
27e90 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e  mpute the mappin
27ea0 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68  g above using th
27eb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
27ec0 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73  ession..  ** Ass
27ed0 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68  ert()s verify th
27ee0 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  at the computati
27ef0 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  on is correct.. 
27f00 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78   */.  op = ((pEx
27f10 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c  pr->op+(TK_ISNUL
27f20 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e  L&1))^1)-(TK_ISN
27f30 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65  ULL&1);..  /* Ve
27f40 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69  rify correct ali
27f50 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e  gnment of TK_ an
27f60 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a  d OP_ constants.
27f70 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
27f80 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e  Expr->op!=TK_ISN
27f90 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f  ULL || op==OP_No
27fa0 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  tNull );.  asser
27fb0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
27fc0 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  _NOTNULL || op==
27fd0 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61  OP_IsNull );.  a
27fe0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27ff0 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_NE || op==O
28000 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Eq );.  assert
28010 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
28020 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  EQ || op==OP_Ne 
28030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
28040 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  pr->op!=TK_LT ||
28050 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20   op==OP_Ge );.  
28060 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28070 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_LE || op==
28080 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72  OP_Gt );.  asser
28090 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
280a0 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _GT || op==OP_Le
280b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
280c0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c  xpr->op!=TK_GE |
280d0 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a  | op==OP_Lt );..
280e0 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
280f0 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
28100 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
28110 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
28120 45 78 70 72 20 2a 70 41 6c 74 20 3d 20 73 71 6c  Expr *pAlt = sql
28130 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66 69  ite3ExprSimplifi
28140 65 64 41 6e 64 4f 72 28 70 45 78 70 72 29 3b 0a  edAndOr(pExpr);.
28150 20 20 20 20 20 20 69 66 28 20 70 41 6c 74 21 3d        if( pAlt!=
28160 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  pExpr ){.       
28170 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
28180 6c 73 65 28 70 50 61 72 73 65 2c 20 70 41 6c 74  lse(pParse, pAlt
28190 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
281a0 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ll);.      }else
281b0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
281c0 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20  TK_AND ){.      
281d0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
281e0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
281f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28200 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
28210 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
28220 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
28230 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28240 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
28250 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
28260 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
28270 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ull);.      }els
28280 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  e{.        int d
28290 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
282a0 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
282b0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
282c0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
282d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
282e0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
282f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
28300 65 66 74 2c 20 64 32 2c 0a 20 20 20 20 20 20 20  eft, d2,.       
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28320 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51     jumpIfNull^SQ
28330 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
28340 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28350 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
28360 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
28370 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
28380 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
28390 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
283a0 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
283b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
283c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
283d0 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
283e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
283f0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28400 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
28410 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
28420 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
28430 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
28440 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28450 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
28460 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UTH: {.      int
28470 20 69 73 4e 6f 74 3b 20 20 20 2f 2a 20 49 53 20   isNot;   /* IS 
28480 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e  NOT TRUE or IS N
28490 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20  OT FALSE */.    
284a0 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 2f    int isTrue;  /
284b0 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20  * IS TRUE or IS 
284c0 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20  NOT TRUE */.    
284d0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
284e0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
284f0 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70 72     isNot = pExpr
28500 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b  ->op2==TK_ISNOT;
28510 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20  .      isTrue = 
28520 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
28530 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69  Value(pExpr->pRi
28540 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ght);.      test
28550 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26 20  case( isTrue && 
28560 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74  isNot );.      t
28570 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75 65  estcase( !isTrue
28580 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20   && isNot );.   
28590 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e 20     if( isTrue ^ 
285a0 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 20  isNot ){.       
285b0 20 2f 2a 20 49 53 20 54 52 55 45 20 61 6e 64 20   /* IS TRUE and 
285c0 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a  IS NOT FALSE */.
285d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
285e0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
285f0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
28600 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20   dest,.         
28610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28620 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51    isNot ? 0 : SQ
28630 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
28640 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ;..      }else{.
28650 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20 46 41          /* IS FA
28660 4c 53 45 20 61 6e 64 20 49 53 20 4e 4f 54 20 54  LSE and IS NOT T
28670 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  RUE */.        s
28680 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
28690 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
286a0 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20  pLeft, dest,.   
286b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286c0 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 30         isNot ? 0
286d0 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   : SQLITE_JUMPIF
286e0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
286f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28700 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
28710 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
28720 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63  NOT:.      testc
28730 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
28740 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
28750 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
28760 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
28770 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70        op = (pExp
28780 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  r->op==TK_IS) ? 
28790 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20  TK_NE : TK_EQ;. 
287a0 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20       jumpIfNull 
287b0 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b  = SQLITE_NULLEQ;
287c0 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
287d0 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  hru */.    case 
287e0 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
287f0 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
28800 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
28810 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
28820 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
28830 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69  TK_EQ: {.      i
28840 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
28850 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c  Vector(pExpr->pL
28860 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61  eft) ) goto defa
28870 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20  ult_expr;.      
28880 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
28890 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
288a0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
288b0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
288c0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
288d0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
288e0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
288f0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
28900 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
28910 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
28920 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
28930 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28940 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
28950 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
28960 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
28970 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
28980 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
28990 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
289a0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
289b0 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
289c0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
289d0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
289e0 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
289f0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
28a00 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
28a10 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
28a20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
28a30 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
28a40 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
28a50 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
28a60 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
28a70 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
28a80 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
28a90 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
28aa0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28ab0 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
28ac0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
28ad0 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
28ae0 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  se(op==OP_Eq);. 
28af0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
28b00 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71  eIf(v, op==OP_Eq
28b10 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
28b20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
28b30 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
28b40 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
28b50 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  q && jumpIfNull=
28b60 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
28b70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
28b80 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
28b90 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
28ba0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
28bb0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
28bc0 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Ne && jumpIfNul
28bd0 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
28be0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
28bf0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
28c00 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
28c10 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
28c20 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  Q);.      testca
28c30 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
28c40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
28c50 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
28c60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
28c70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
28c80 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
28c90 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
28ca0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
28cb0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
28cc0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
28cd0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
28ce0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28cf0 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
28d00 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
28d10 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
28d20 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64  K_ISNULL );   Vd
28d30 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
28d40 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
28d50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28d60 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
28d70 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ;  VdbeCoverageI
28d80 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
28d90 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
28da0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
28db0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
28dc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
28dd0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
28de0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
28df0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
28e00 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
28e10 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
28e20 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74  xpr, dest, sqlit
28e30 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c 20 6a  e3ExprIfFalse, j
28e40 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
28e50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
28e60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28e70 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
28e80 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
28e90 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75      if( jumpIfNu
28ea0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ll ){.        sq
28eb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
28ec0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
28ed0 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  est, dest);.    
28ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28ef0 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
28f00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
28f10 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
28f20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28f30 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
28f40 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
28f50 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
28f60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
28f70 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
28f80 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
28f90 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
28fa0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
28fb0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
28fc0 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a   default_expr: .
28fd0 20 20 20 20 20 20 69 66 28 20 45 78 70 72 41 6c        if( ExprAl
28fe0 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29  waysFalse(pExpr)
28ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
29000 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
29010 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
29020 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73  e if( ExprAlways
29030 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
29040 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20         /* no-op 
29050 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
29060 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
29070 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
29080 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
29090 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
290a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
290b0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
290c0 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  t, r1, dest, jum
290d0 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
290e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
290f0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e(v);.        te
29100 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
29110 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
29120 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
29130 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
29140 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
29150 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
29160 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
29170 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
29180 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
29190 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
291a0 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d  se, regFree2);.}
291b0 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c  ../*.** Like sql
291c0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
291d0 29 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20  ) except that a 
291e0 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
291f0 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20  pExpr before.** 
29200 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c  code generation,
29210 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69   and that copy i
29220 73 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20  s deleted after 
29230 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e  code generation.
29240 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73   This.** ensures
29250 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
29260 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68  al pExpr is unch
29270 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  anged..*/.void s
29280 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
29290 65 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  eDup(Parse *pPar
292a0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
292b0 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75   int dest,int ju
292c0 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c  mpIfNull){.  sql
292d0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
292e0 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
292f0 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78  Copy = sqlite3Ex
29300 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c  prDup(db, pExpr,
29310 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
29320 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
29330 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
29340 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
29350 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75   pCopy, dest, ju
29360 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  mpIfNull);.  }. 
29370 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
29380 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d  te(db, pCopy);.}
29390 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
293a0 6f 6e 20 70 56 61 72 20 69 73 20 67 75 61 72 61  on pVar is guara
293b0 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 53  nteed to be an S
293c0 51 4c 20 76 61 72 69 61 62 6c 65 2e 20 70 45 78  QL variable. pEx
293d0 70 72 20 6d 61 79 20 62 65 20 61 6e 79 0a 2a 2a  pr may be any.**
293e0 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73 73   type of express
293f0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ion..**.** If pE
29400 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20  xpr is a simple 
29410 53 51 4c 20 76 61 6c 75 65 20 2d 20 61 6e 20 69  SQL value - an i
29420 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74  nteger, real, st
29430 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72  ring, blob.** or
29440 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2d 20 74 68   NULL value - th
29450 65 6e 20 74 68 65 20 56 44 42 45 20 63 75 72 72  en the VDBE curr
29460 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 72 65 70  ently being prep
29470 61 72 65 64 20 69 73 20 63 6f 6e 66 69 67 75 72  ared is configur
29480 65 64 0a 2a 2a 20 74 6f 20 72 65 2d 70 72 65 70  ed.** to re-prep
29490 61 72 65 20 65 61 63 68 20 74 69 6d 65 20 61 20  are each time a 
294a0 6e 65 77 20 76 61 6c 75 65 20 69 73 20 62 6f 75  new value is bou
294b0 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70  nd to variable p
294c0 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74  Var..**.** Addit
294d0 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 70 45 78 70  ionally, if pExp
294e0 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51  r is a simple SQ
294f0 4c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  L value and the 
29500 76 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a 20  value is the.** 
29510 73 61 6d 65 20 61 73 20 74 68 61 74 20 63 75 72  same as that cur
29520 72 65 6e 74 6c 79 20 62 6f 75 6e 64 20 74 6f 20  rently bound to 
29530 76 61 72 69 61 62 6c 65 20 70 56 61 72 2c 20 6e  variable pVar, n
29540 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
29550 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ned..** Otherwis
29560 65 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 73  e, if the values
29570 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61 6d   are not the sam
29580 65 20 6f 72 20 69 66 20 70 45 78 70 72 20 69 73  e or if pExpr is
29590 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 0a 2a 2a   not a simple.**
295a0 20 53 51 4c 20 76 61 6c 75 65 2c 20 7a 65 72 6f   SQL value, zero
295b0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
295c0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
295d0 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28  CompareVariable(
295e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
295f0 78 70 72 20 2a 70 56 61 72 2c 20 45 78 70 72 20  xpr *pVar, Expr 
29600 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
29610 65 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56  es = 0;.  int iV
29620 61 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ar;.  sqlite3_va
29630 6c 75 65 20 2a 70 4c 2c 20 2a 70 52 20 3d 20 30  lue *pL, *pR = 0
29640 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 56 61  ;.  .  sqlite3Va
29650 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
29660 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53  se->db, pExpr, S
29670 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
29680 54 45 5f 41 46 46 5f 42 4c 4f 42 2c 20 26 70 52  TE_AFF_BLOB, &pR
29690 29 3b 0a 20 20 69 66 28 20 70 52 20 29 7b 0a 20  );.  if( pR ){. 
296a0 20 20 20 69 56 61 72 20 3d 20 70 56 61 72 2d 3e     iVar = pVar->
296b0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c  iColumn;.    sql
296c0 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
296d0 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  sk(pParse->pVdbe
296e0 2c 20 69 56 61 72 29 3b 0a 20 20 20 20 70 4c 20  , iVar);.    pL 
296f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
29700 42 6f 75 6e 64 56 61 6c 75 65 28 70 50 61 72 73  BoundValue(pPars
29710 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69  e->pReprepare, i
29720 56 61 72 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Var, SQLITE_AFF_
29730 42 4c 4f 42 29 3b 0a 20 20 20 20 69 66 28 20 70  BLOB);.    if( p
29740 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  L ){.      if( s
29750 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
29760 65 28 70 4c 29 3d 3d 53 51 4c 49 54 45 5f 54 45  e(pL)==SQLITE_TE
29770 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  XT ){.        sq
29780 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
29790 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75  (pL); /* Make su
297a0 72 65 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  re the encoding 
297b0 69 73 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20 20  is UTF-8 */.    
297c0 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20    }.      res = 
297d0 20 30 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 43 6f   0==sqlite3MemCo
297e0 6d 70 61 72 65 28 70 4c 2c 20 70 52 2c 20 30 29  mpare(pL, pR, 0)
297f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29800 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 29  te3ValueFree(pR)
29810 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
29820 75 65 46 72 65 65 28 70 4c 29 3b 0a 20 20 7d 0a  ueFree(pL);.  }.
29830 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
29840 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
29850 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
29860 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
29870 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20  rees.  Return 0 
29880 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
29890 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f  pressions are co
298a0 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63  mpletely identic
298b0 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  al.  Return 1 if
298c0 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c   they differ onl
298d0 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54  y.** by a COLLAT
298e0 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68  E operator at th
298f0 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65  e top level.  Re
29900 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20  turn 2 if there 
29910 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a  are differences.
29920 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ** other than th
29930 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c  e top-level COLL
29940 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
29950 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
29960 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
29970 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
29980 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
29990 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
299a0 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
299b0 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
299c0 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
299d0 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
299e0 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64  **.** The pA sid
299f0 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67  e might be using
29a00 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49   TK_REGISTER.  I
29a10 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
29a20 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20  se and pB is.** 
29a30 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47  not using TK_REG
29a40 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68  ISTER but is oth
29a50 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e  erwise equivalen
29a60 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  t, then still re
29a70 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f  turn 0..**.** So
29a80 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
29a90 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
29aa0 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
29ab0 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
29ac0 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
29ad0 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
29ae0 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
29af0 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
29b00 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
29b10 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
29b20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
29b30 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
29b40 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
29b50 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
29b60 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
29b70 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
29b80 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
29b90 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
29ba0 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
29bb0 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
29bc0 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
29bd0 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
29be0 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
29bf0 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
29c00 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
29c10 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
29c20 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
29c30 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
29c40 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
29c50 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
29c60 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
29c70 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
29c80 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
29c90 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
29ca0 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
29cb0 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
29cc0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
29cd0 20 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e   pParse is not N
29ce0 55 4c 4c 20 74 68 65 6e 20 54 4b 5f 56 41 52 49  ULL then TK_VARI
29cf0 41 42 4c 45 20 74 65 72 6d 73 20 69 6e 20 70 41  ABLE terms in pA
29d00 20 77 69 74 68 20 62 69 6e 64 69 6e 67 73 20 69   with bindings i
29d10 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 52 65  n.** pParse->pRe
29d20 70 72 65 70 61 72 65 20 63 61 6e 20 62 65 20 6d  prepare can be m
29d30 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 6c  atched against l
29d40 69 74 65 72 61 6c 73 20 69 6e 20 70 42 2e 20 20  iterals in pB.  
29d50 54 68 65 20 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  The .** pParse->
29d60 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 62  pVdbe->expmask b
29d70 69 74 6d 61 73 6b 20 69 73 20 75 70 64 61 74 65  itmask is update
29d80 64 20 66 6f 72 20 65 61 63 68 20 76 61 72 69 61  d for each varia
29d90 62 6c 65 20 72 65 66 65 72 65 6e 63 65 64 2e 0a  ble referenced..
29da0 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20  ** If pParse is 
29db0 4e 55 4c 4c 20 28 74 68 65 20 6e 6f 72 6d 61 6c  NULL (the normal
29dc0 20 63 61 73 65 29 20 74 68 65 6e 20 61 6e 79 20   case) then any 
29dd0 54 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d  TK_VARIABLE term
29de0 20 69 6e 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74   in .** Argument
29df0 20 70 50 61 72 73 65 20 73 68 6f 75 6c 64 20 6e   pParse should n
29e00 6f 72 6d 61 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e  ormally be NULL.
29e10 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   If it is not NU
29e20 4c 4c 20 61 6e 64 20 70 41 20 6f 72 0a 2a 2a 20  LL and pA or.** 
29e30 70 42 20 63 61 75 73 65 73 20 61 20 72 65 74 75  pB causes a retu
29e40 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 2e 0a 2a  rn value of 2..*
29e50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
29e60 72 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a  rCompare(Parse *
29e70 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 41  pParse, Expr *pA
29e80 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
29e90 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d  iTab){.  u32 com
29ea0 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66  binedFlags;.  if
29eb0 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
29ec0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
29ed0 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20  B==pA ? 0 : 2;. 
29ee0 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 20   }.  if( pParse 
29ef0 26 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41  && pA->op==TK_VA
29f00 52 49 41 42 4c 45 20 26 26 20 65 78 70 72 43 6f  RIABLE && exprCo
29f10 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 70 50  mpareVariable(pP
29f20 61 72 73 65 2c 20 70 41 2c 20 70 42 29 20 29 7b  arse, pA, pB) ){
29f30 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
29f40 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61   }.  combinedFla
29f50 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c  gs = pA->flags |
29f60 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66   pB->flags;.  if
29f70 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
29f80 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
29f90 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  .    if( (pA->fl
29fa0 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50  ags&pB->flags&EP
29fb0 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26  _IntValue)!=0 &&
29fc0 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70   pA->u.iValue==p
29fd0 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20  B->u.iValue ){. 
29fe0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
29ff0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2a000 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  2;.  }.  if( pA-
2a010 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 7c 7c 20 70  >op!=pB->op || p
2a020 41 2d 3e 6f 70 3d 3d 54 4b 5f 52 41 49 53 45 20  A->op==TK_RAISE 
2a030 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  ){.    if( pA->o
2a040 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
2a050 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2a060 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e  are(pParse, pA->
2a070 70 4c 65 66 74 2c 70 42 2c 69 54 61 62 29 3c 32  pLeft,pB,iTab)<2
2a080 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2a090 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
2a0a0 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pB->op==TK_COL
2a0b0 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
2a0c0 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
2a0d0 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65 66 74 2c  e, pA,pB->pLeft,
2a0e0 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
2a0f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2a100 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
2a110 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
2a120 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
2a130 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
2a140 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f  UMN && pA->u.zTo
2a150 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ken ){.    if( p
2a160 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  A->op==TK_FUNCTI
2a170 4f 4e 20 7c 7c 20 70 41 2d 3e 6f 70 3d 3d 54 4b  ON || pA->op==TK
2a180 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  _AGG_FUNCTION ){
2a190 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2a1a0 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e  e3StrICmp(pA->u.
2a1b0 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f  zToken,pB->u.zTo
2a1c0 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ken)!=0 ) return
2a1d0 20 32 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   2;.#ifndef SQLI
2a1e0 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
2a1f0 4e 43 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  NC.      assert(
2a200 20 70 41 2d 3e 6f 70 3d 3d 70 42 2d 3e 6f 70 20   pA->op==pB->op 
2a210 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
2a220 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c  rHasProperty(pA,
2a230 45 50 5f 57 69 6e 46 75 6e 63 29 21 3d 45 78 70  EP_WinFunc)!=Exp
2a240 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c  rHasProperty(pB,
2a250 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20  EP_WinFunc) ){. 
2a260 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b         return 2;
2a270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2a280 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
2a290 74 79 28 70 41 2c 45 50 5f 57 69 6e 46 75 6e 63  ty(pA,EP_WinFunc
2a2a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
2a2b0 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
2a2c0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41  mpare(pParse, pA
2a2d0 2d 3e 79 2e 70 57 69 6e 2c 20 70 42 2d 3e 79 2e  ->y.pWin, pB->y.
2a2e0 70 57 69 6e 2c 20 31 29 21 3d 30 20 29 7b 0a 20  pWin, 1)!=0 ){. 
2a2f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2a300 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
2a310 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2a320 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70  }else if( pA->op
2a330 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  ==TK_NULL ){.   
2a340 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
2a350 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f   }else if( pA->o
2a360 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b  p==TK_COLLATE ){
2a370 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2a380 65 33 5f 73 74 72 69 63 6d 70 28 70 41 2d 3e 75  e3_stricmp(pA->u
2a390 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
2a3a0 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72  oken)!=0 ) retur
2a3b0 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 2;.    }else i
2a3c0 66 28 20 41 4c 57 41 59 53 28 70 42 2d 3e 75 2e  f( ALWAYS(pB->u.
2a3d0 7a 54 6f 6b 65 6e 21 3d 30 29 20 26 26 20 73 74  zToken!=0) && st
2a3e0 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65  rcmp(pA->u.zToke
2a3f0 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21  n,pB->u.zToken)!
2a400 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
2a410 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 2;.    }.  }.
2a420 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
2a430 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21   & EP_Distinct)!
2a440 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50  =(pB->flags & EP
2a450 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74  _Distinct) ) ret
2a460 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 28 63 6f  urn 2;.  if( (co
2a470 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
2a480 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 20 29  _TokenOnly)==0 )
2a490 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69 6e  {.    if( combin
2a4a0 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49 73  edFlags & EP_xIs
2a4b0 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
2a4c0 32 3b 0a 20 20 20 20 69 66 28 20 28 63 6f 6d 62  2;.    if( (comb
2a4d0 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 46  inedFlags & EP_F
2a4e0 69 78 65 64 43 6f 6c 29 3d 3d 30 0a 20 20 20 20  ixedCol)==0.    
2a4f0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
2a500 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2a510 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
2a520 65 66 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  eft, iTab) ) ret
2a530 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
2a540 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2a550 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 52  e(pParse, pA->pR
2a560 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
2a570 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
2a580 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
2a590 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
2a5a0 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20  re(pA->x.pList, 
2a5b0 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pB->x.pList, iTa
2a5c0 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
2a5d0 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54     if( pA->op!=T
2a5e0 4b 5f 53 54 52 49 4e 47 0a 20 20 20 20 20 26 26  K_STRING.     &&
2a5f0 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 54 52 55 45   pA->op!=TK_TRUE
2a600 46 41 4c 53 45 0a 20 20 20 20 20 26 26 20 28 63  FALSE.     && (c
2a610 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
2a620 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 0a 20 20  P_Reduced)==0.  
2a630 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
2a640 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
2a650 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
2a660 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41   2;.      if( pA
2a670 2d 3e 6f 70 32 21 3d 70 42 2d 3e 6f 70 32 20 29  ->op2!=pB->op2 )
2a680 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20   return 2;.     
2a690 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21   if( pA->iTable!
2a6a0 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20 20  =pB->iTable .   
2a6b0 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61 62      && (pA->iTab
2a6c0 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56 45  le!=iTab || NEVE
2a6d0 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30 29  R(pB->iTable>=0)
2a6e0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
2a6f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2a700 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   0;.}../*.** Com
2a710 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73  pare two ExprLis
2a720 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75  t objects.  Retu
2a730 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72 65  rn 0 if they are
2a740 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a   identical and .
2a750 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ** non-zero if t
2a760 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e  hey differ in an
2a770 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  y way..**.** If 
2a780 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f  any subelement o
2a790 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54  f pB has Expr.iT
2a7a0 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20  able==(-1) then 
2a7b0 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  it is allowed.**
2a7c0 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61   to compare equa
2a7d0 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65  l to an equivale
2a7e0 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41  nt element in pA
2a7f0 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c   with Expr.iTabl
2a800 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54  e==iTab..**.** T
2a810 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
2a820 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  t return non-zer
2a830 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74  o for equivalent
2a840 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65   ExprLists.  The
2a850 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75  .** only consequ
2a860 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73  ence will be dis
2a870 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69  abled optimizati
2a880 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20 72  ons.  But this r
2a890 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e  outine.** must n
2a8a0 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69 66  ever return 0 if
2a8b0 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73   the two ExprLis
2a8c0 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69  t objects are di
2a8d0 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61  fferent, or.** a
2a8e0 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c   malfunction wil
2a8f0 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  l result..**.** 
2a900 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  Two NULL pointer
2a910 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
2a920 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e   to be the same.
2a930 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69    But a NULL poi
2a940 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64  nter.** always d
2a950 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f  iffers from a no
2a960 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  n-NULL pointer..
2a970 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2a980 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78  prListCompare(Ex
2a990 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72  prList *pA, Expr
2a9a0 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69 54  List *pB, int iT
2a9b0 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ab){.  int i;.  
2a9c0 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d  if( pA==0 && pB=
2a9d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2a9e0 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42   if( pA==0 || pB
2a9f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
2aa00 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21    if( pA->nExpr!
2aa10 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74  =pB->nExpr ) ret
2aa20 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 1;.  for(i=0
2aa30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69  ; i<pA->nExpr; i
2aa40 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
2aa50 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d  ExprA = pA->a[i]
2aa60 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  .pExpr;.    Expr
2aa70 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61   *pExprB = pB->a
2aa80 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
2aa90 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74  f( pA->a[i].sort
2aaa0 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e  Order!=pB->a[i].
2aab0 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75  sortOrder ) retu
2aac0 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 1;.    if( sq
2aad0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2aae0 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45 78 70  (0, pExprA, pExp
2aaf0 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  rB, iTab) ) retu
2ab00 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
2ab10 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn 0;.}../*.** L
2ab20 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  ike sqlite3ExprC
2ab30 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70 74 20  ompare() except 
2ab40 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
2ab50 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65 76  s at the top-lev
2ab60 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72 65  el.** are ignore
2ab70 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2ab80 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69 70  3ExprCompareSkip
2ab90 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
2aba0 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
2abb0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2abc0 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a 20  ExprCompare(0,. 
2abd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2abe0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2abf0 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20 20 20  te(pA),.        
2ac00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2ac10 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42 29 2c  SkipCollate(pB),
2ac20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54  .             iT
2ac30 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ab);.}../*.** Re
2ac40 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
2ac50 20 45 78 70 72 20 70 20 63 61 6e 20 6f 6e 6c 79   Expr p can only
2ac60 20 62 65 20 74 72 75 65 20 69 66 20 70 4e 4e 20   be true if pNN 
2ac70 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 2a 2f 0a  is not NULL..*/.
2ac80 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
2ac90 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 0a 20  mpliesNotNull(. 
2aca0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2acb0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
2acc0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
2acd0 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  r *p,           
2ace0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
2acf0 6f 6e 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64  on to be checked
2ad00 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4e 4e 2c   */.  Expr *pNN,
2ad10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2ad20 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
2ad30 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a   is NOT NULL */.
2ad40 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
2ad50 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
2ad60 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 2a  eing evaluated *
2ad70 2f 0a 20 20 69 6e 74 20 73 65 65 6e 4e 6f 74 20  /.  int seenNot 
2ad80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2ad90 69 66 20 70 20 69 73 20 61 6e 20 6f 70 65 72 61  if p is an opera
2ada0 6e 64 20 6f 66 20 4e 4f 54 20 2a 2f 0a 29 7b 0a  nd of NOT */.){.
2adb0 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20    assert( p );. 
2adc0 20 61 73 73 65 72 74 28 20 70 4e 4e 20 29 3b 0a   assert( pNN );.
2add0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2ade0 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
2adf0 20 70 2c 20 70 4e 4e 2c 20 69 54 61 62 29 3d 3d   p, pNN, iTab)==
2ae00 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2ae10 70 4e 4e 2d 3e 6f 70 21 3d 54 4b 5f 4e 55 4c 4c  pNN->op!=TK_NULL
2ae20 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
2ae30 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
2ae40 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
2ae50 20 69 66 28 20 73 65 65 6e 4e 6f 74 20 26 26 20   if( seenNot && 
2ae60 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2ae70 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
2ae80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
2ae90 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
2aea0 61 73 50 72 6f 70 65 72 74 79 28 70 2c 45 50 5f  asProperty(p,EP_
2aeb0 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20 20 20  xIsSelect).     
2aec0 20 20 20 20 20 20 7c 7c 20 28 70 2d 3e 78 2e 70        || (p->x.p
2aed0 4c 69 73 74 21 3d 30 20 26 26 20 70 2d 3e 78 2e  List!=0 && p->x.
2aee0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 20  pList->nExpr>0) 
2aef0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2af00 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75  exprImpliesNotNu
2af10 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  ll(pParse, p->pL
2af20 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20  eft, pNN, iTab, 
2af30 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a  seenNot);.    }.
2af40 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
2af50 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  EEN: {.      Exp
2af60 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
2af70 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
2af80 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
2af90 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
2afa0 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
2afb0 3d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =2 );.      if( 
2afc0 73 65 65 6e 4e 6f 74 20 29 20 72 65 74 75 72 6e  seenNot ) return
2afd0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 65 78   0;.      if( ex
2afe0 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c  prImpliesNotNull
2aff0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
2b000 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 4e 4e 2c  a[0].pExpr, pNN,
2b010 20 69 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29 0a   iTab, seenNot).
2b020 20 20 20 20 20 20 20 7c 7c 20 65 78 70 72 49 6d         || exprIm
2b030 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70 50 61  pliesNotNull(pPa
2b040 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d  rse, pList->a[1]
2b050 2e 70 45 78 70 72 2c 20 70 4e 4e 2c 20 69 54 61  .pExpr, pNN, iTa
2b060 62 2c 20 73 65 65 6e 4e 6f 74 29 0a 20 20 20 20  b, seenNot).    
2b070 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
2b080 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
2b090 20 20 20 20 20 72 65 74 75 72 6e 20 65 78 70 72       return expr
2b0a0 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70  ImpliesNotNull(p
2b0b0 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65 66 74 2c  Parse, p->pLeft,
2b0c0 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65 6e   pNN, iTab, seen
2b0d0 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Not);.    }.    
2b0e0 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20  case TK_EQ:.    
2b0f0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
2b100 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
2b110 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
2b120 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
2b130 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
2b140 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
2b150 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
2b160 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
2b170 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  R:.    case TK_R
2b180 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
2b190 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
2b1a0 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
2b1b0 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
2b1c0 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
2b1d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
2b1e0 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
2b1f0 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
2b200 20 20 20 69 66 28 20 65 78 70 72 49 6d 70 6c 69     if( exprImpli
2b210 65 73 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65  esNotNull(pParse
2b220 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 70 4e 4e  , p->pRight, pNN
2b230 2c 20 69 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29  , iTab, seenNot)
2b240 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
2b250 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
2b260 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61  into the next ca
2b270 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
2b280 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20  case TK_SPAN:.  
2b290 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54    case TK_COLLAT
2b2a0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  E:.    case TK_B
2b2b0 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
2b2c0 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61  TK_UPLUS:.    ca
2b2d0 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
2b2e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 78 70        return exp
2b2f0 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28  rImpliesNotNull(
2b300 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65 66 74  pParse, p->pLeft
2b310 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65  , pNN, iTab, see
2b320 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nNot);.    }.   
2b330 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20   case TK_TRUTH: 
2b340 7b 0a 20 20 20 20 20 20 69 66 28 20 73 65 65 6e  {.      if( seen
2b350 4e 6f 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Not ) return 0;.
2b360 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 32        if( p->op2
2b370 21 3d 54 4b 5f 49 53 20 29 20 72 65 74 75 72 6e  !=TK_IS ) return
2b380 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2b390 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e   exprImpliesNotN
2b3a0 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ull(pParse, p->p
2b3b0 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c  Left, pNN, iTab,
2b3c0 20 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d   seenNot);.    }
2b3d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
2b3e0 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
2b3f0 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e   exprImpliesNotN
2b400 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ull(pParse, p->p
2b410 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c  Left, pNN, iTab,
2b420 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   1);.    }.  }. 
2b430 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2b440 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
2b450 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20  if we can prove 
2b460 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77  the pE2 will alw
2b470 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20 70  ays be true if p
2b480 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20  E1 is.** true.  
2b490 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
2b4a0 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65  we cannot comple
2b4b0 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20  te the proof or 
2b4c0 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20  if pE2 might.** 
2b4d0 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70  be false.  Examp
2b4e0 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  les:.**.**     p
2b4f0 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70  E1: x==5       p
2b500 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
2b510 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
2b520 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e  e.**     pE1: x>
2b530 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  0        pE2: x=
2b540 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52  =5             R
2b550 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
2b560 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20      pE1: x=21   
2b570 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52      pE2: x=21 OR
2b580 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74   y=43     Result
2b590 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
2b5a0 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70 45  1: x!=123     pE
2b5b0 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
2b5c0 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
2b5d0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d  .**     pE1: x!=
2b5e0 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20 49  ?1      pE2: x I
2b5f0 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
2b600 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
2b610 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c    pE1: x IS NULL
2b620 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
2b630 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
2b640 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31  false.**     pE1
2b650 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45 32  : x IS ?2    pE2
2b660 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
2b670 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65     Reuslt: false
2b680 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70  .**.** When comp
2b690 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20  aring TK_COLUMN 
2b6a0 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70 45  nodes between pE
2b6b0 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45  1 and pE2, if pE
2b6c0 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54  2 has.** Expr.iT
2b6d0 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75  able<0 then assu
2b6e0 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65  me a table numbe
2b6f0 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e  r given by iTab.
2b700 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73 65  .**.** If pParse
2b710 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
2b720 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  en the values of
2b730 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73   bound variables
2b740 20 69 6e 20 70 45 31 20 61 72 65 20 0a 2a 2a 20   in pE1 are .** 
2b750 63 6f 6d 70 61 72 65 64 20 61 67 61 69 6e 73 74  compared against
2b760 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73 20   literal values 
2b770 69 6e 20 70 45 32 20 61 6e 64 20 70 50 61 72 73  in pE2 and pPars
2b780 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61 73  e->pVdbe->expmas
2b790 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66 69 65 64  k is.** modified
2b7a0 20 74 6f 20 72 65 63 6f 72 64 20 77 68 69 63 68   to record which
2b7b0 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73   bound variables
2b7c0 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64 2e   are referenced.
2b7d0 20 20 49 66 20 70 50 61 72 73 65 20 0a 2a 2a 20    If pParse .** 
2b7e0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66 61  is NULL, then fa
2b7f0 6c 73 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75  lse will be retu
2b800 72 6e 65 64 20 69 66 20 70 45 31 20 63 6f 6e 74  rned if pE1 cont
2b810 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e 64 20 76  ains any bound v
2b820 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ariables..**.** 
2b830 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72  When in doubt, r
2b840 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65  eturn false.  Re
2b850 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67  turning true mig
2b860 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
2b870 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65  mance.** improve
2b880 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67  ment.  Returning
2b890 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75   false might cau
2b8a0 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  se a performance
2b8b0 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a   reduction, but.
2b8c0 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79  ** it will alway
2b8d0 73 20 67 69 76 65 20 74 68 65 20 63 6f 72 72 65  s give the corre
2b8e0 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73  ct answer and is
2b8f0 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61   hence always sa
2b900 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  fe..*/.int sqlit
2b910 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
2b920 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
2b930 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72   Expr *pE1, Expr
2b940 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29   *pE2, int iTab)
2b950 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  {.  if( sqlite3E
2b960 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
2b970 65 2c 20 70 45 31 2c 20 70 45 32 2c 20 69 54 61  e, pE1, pE2, iTa
2b980 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  b)==0 ){.    ret
2b990 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
2b9a0 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a   pE2->op==TK_OR.
2b9b0 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78     && (sqlite3Ex
2b9c0 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 50  prImpliesExpr(pP
2b9d0 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e  arse, pE1, pE2->
2b9e0 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20  pLeft, iTab).   
2b9f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
2ba00 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
2ba10 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c  xpr(pParse, pE1,
2ba20 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54   pE2->pRight, iT
2ba30 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72  ab) ).  ){.    r
2ba40 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
2ba50 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e  f( pE2->op==TK_N
2ba60 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 65 78 70  OTNULL.   && exp
2ba70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28  rImpliesNotNull(
2ba80 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32  pParse, pE1, pE2
2ba90 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 2c 20 30  ->pLeft, iTab, 0
2baa0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2bab0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
2bac0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
2bad0 69 73 20 69 73 20 74 68 65 20 45 78 70 72 20 6e  is is the Expr n
2bae0 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ode callback for
2baf0 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
2bb00 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 29 2e  iesNotNullRow().
2bb10 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
2bb20 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 71 75 69  ssion node requi
2bb30 72 65 73 20 74 68 61 74 20 74 68 65 20 74 61 62  res that the tab
2bb40 6c 65 20 61 74 20 70 57 61 6c 6b 65 72 2d 3e 69  le at pWalker->i
2bb50 43 75 72 0a 2a 2a 20 68 61 76 65 20 6f 6e 65 20  Cur.** have one 
2bb60 6f 72 20 6d 6f 72 65 20 6e 6f 6e 2d 4e 55 4c 4c  or more non-NULL
2bb70 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 73 65   column, then se
2bb80 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  t pWalker->eCode
2bb90 20 74 6f 20 31 20 61 6e 64 20 61 62 6f 72 74 2e   to 1 and abort.
2bba0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2bbb0 69 6e 65 20 63 6f 6e 74 72 6f 6c 73 20 61 6e 20  ine controls an 
2bbc0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 46  optimization.  F
2bbd0 61 6c 73 65 20 70 6f 73 69 74 69 76 65 73 20 28  alse positives (
2bbe0 73 65 74 74 69 6e 67 0a 2a 2a 20 70 57 61 6c 6b  setting.** pWalk
2bbf0 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 20 77  er->eCode to 1 w
2bc00 68 65 6e 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f  hen it should no
2bc10 74 20 62 65 29 20 61 72 65 20 64 65 61 64 6c 79  t be) are deadly
2bc20 2c 20 62 75 74 20 66 61 6c 73 65 2d 6e 65 67 61  , but false-nega
2bc30 74 69 76 65 73 0a 2a 2a 20 28 6e 65 76 65 72 20  tives.** (never 
2bc40 73 65 74 74 69 6e 67 20 70 57 61 6c 6b 65 72 2d  setting pWalker-
2bc50 3e 65 43 6f 64 65 29 20 69 73 20 61 20 68 61 72  >eCode) is a har
2bc60 6d 6c 65 73 73 20 6d 69 73 73 65 64 20 6f 70 74  mless missed opt
2bc70 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  imization..*/.st
2bc80 61 74 69 63 20 69 6e 74 20 69 6d 70 6c 69 65 73  atic int implies
2bc90 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57 61 6c 6b 65  NotNullRow(Walke
2bca0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2bcb0 20 2a 70 45 78 70 72 29 7b 0a 20 20 74 65 73 74   *pExpr){.  test
2bcc0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2bcd0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
2bce0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
2bcf0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2bd00 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66  FUNCTION );.  if
2bd10 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2bd20 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
2bd30 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 57  Join) ) return W
2bd40 52 43 5f 50 72 75 6e 65 3b 0a 20 20 73 77 69 74  RC_Prune;.  swit
2bd50 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
2bd60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
2bd70 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
2bd80 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
2bd90 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
2bda0 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 0a 20 20  e TK_NOTNULL:.  
2bdb0 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
2bdc0 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
2bdd0 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 0a    case TK_CASE:.
2bde0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a      case TK_IN:.
2bdf0 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
2be00 54 49 4f 4e 3a 0a 20 20 20 20 20 20 74 65 73 74  TION:.      test
2be10 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2be20 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
2be30 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2be40 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29  pr->op==TK_NOT )
2be50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2be60 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2be70 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
2be80 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2be90 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20  >op==TK_NOTNULL 
2bea0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2beb0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2bec0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
2bed0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2bee0 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20  ==TK_OR );.     
2bef0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2bf00 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b  ->op==TK_CASE );
2bf10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2bf20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2bf30 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
2bf40 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2bf50 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  TK_FUNCTION );. 
2bf60 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2bf70 50 72 75 6e 65 3b 0a 20 20 20 20 63 61 73 65 20  Prune;.    case 
2bf80 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20  TK_COLUMN:.     
2bf90 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   if( pWalker->u.
2bfa0 69 43 75 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61  iCur==pExpr->iTa
2bfb0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ble ){.        p
2bfc0 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
2bfd0 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
2bfe0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2bff0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
2c000 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 0a 20 20  n WRC_Prune;..  
2c010 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
2c020 6c 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  les are allowed 
2c030 74 6f 20 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  to use constrain
2c040 74 73 20 6c 69 6b 65 20 78 3d 4e 55 4c 4c 2e 20  ts like x=NULL. 
2c050 20 53 6f 0a 20 20 20 20 2a 2a 20 61 20 74 65 72   So.    ** a ter
2c060 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 78 3d  m of the form x=
2c070 79 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 65  y does not prove
2c080 20 74 68 61 74 20 79 20 69 73 20 6e 6f 74 20 6e   that y is not n
2c090 75 6c 6c 20 69 66 20 78 0a 20 20 20 20 2a 2a 20  ull if x.    ** 
2c0a0 69 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  is the column of
2c0b0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
2c0c0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
2c0d0 45 51 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EQ:.    case TK_
2c0e0 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
2c0f0 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
2c100 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
2c110 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
2c120 47 45 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  GE:.      testca
2c130 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2c140 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65  K_EQ );.      te
2c150 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c160 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20  p==TK_NE );.    
2c170 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2c180 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  r->op==TK_LT );.
2c190 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c1a0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  pExpr->op==TK_LE
2c1b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2c1c0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2c1d0 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GT );.      te
2c1e0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c1f0 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
2c200 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e 70 4c    if( (pExpr->pL
2c210 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
2c220 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c 28  MN && IsVirtual(
2c230 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 79 2e  pExpr->pLeft->y.
2c240 70 54 61 62 29 29 0a 20 20 20 20 20 20 20 7c 7c  pTab)).       ||
2c250 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d   (pExpr->pRight-
2c260 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
2c270 26 20 49 73 56 69 72 74 75 61 6c 28 70 45 78 70  & IsVirtual(pExp
2c280 72 2d 3e 70 52 69 67 68 74 2d 3e 79 2e 70 54 61  r->pRight->y.pTa
2c290 62 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  b)).      ){.   
2c2a0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2c2b0 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rune;.      }.  
2c2c0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
2c2d0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2c2e0 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  inue;.  }.}../*.
2c2f0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28  ** Return true (
2c300 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 65 78 70  non-zero) if exp
2c310 72 65 73 73 69 6f 6e 20 70 20 63 61 6e 20 6f 6e  ression p can on
2c320 6c 79 20 62 65 20 74 72 75 65 20 69 66 20 61 74  ly be true if at
2c330 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 63 6f   least.** one co
2c340 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 54  lumn of table iT
2c350 61 62 20 69 73 20 6e 6f 6e 2d 6e 75 6c 6c 2e 20  ab is non-null. 
2c360 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2c370 20 72 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20   return true.** 
2c380 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  if expression p 
2c390 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 4e  will always be N
2c3a0 55 4c 4c 20 6f 72 20 66 61 6c 73 65 20 69 66 20  ULL or false if 
2c3b0 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  every column of 
2c3c0 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e  iTab.** is NULL.
2c3d0 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 6e 65 67  .**.** False neg
2c3e0 61 74 69 76 65 73 20 61 72 65 20 61 63 63 65 70  atives are accep
2c3f0 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72  table.  In other
2c400 20 77 6f 72 64 73 2c 20 69 74 20 69 73 20 6f 6b   words, it is ok
2c410 20 74 6f 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65   to return.** ze
2c420 72 6f 20 65 76 65 6e 20 69 66 20 65 78 70 72 65  ro even if expre
2c430 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20 6e 65 76  ssion p will nev
2c440 65 72 20 62 65 20 74 72 75 65 20 6f 66 20 65 76  er be true of ev
2c450 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54  ery column of iT
2c460 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 20 20  ab.** is NULL.  
2c470 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  A false negative
2c480 20 69 73 20 6d 65 72 65 6c 79 20 61 20 6d 69 73   is merely a mis
2c490 73 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  sed optimization
2c4a0 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2a   opportunity..**
2c4b0 0a 2a 2a 20 46 61 6c 73 65 20 70 6f 73 69 74 69  .** False positi
2c4c0 76 65 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ves are not allo
2c4d0 77 65 64 2c 20 68 6f 77 65 76 65 72 2e 20 20 41  wed, however.  A
2c4e0 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 20   false positive 
2c4f0 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  may result.** in
2c500 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e   an incorrect an
2c510 73 77 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  swer..**.** Term
2c520 73 20 6f 66 20 70 20 74 68 61 74 20 61 72 65 20  s of p that are 
2c530 6d 61 72 6b 65 64 20 77 69 74 68 20 45 50 5f 46  marked with EP_F
2c540 72 6f 6d 4a 6f 69 6e 20 28 61 6e 64 20 68 65 6e  romJoin (and hen
2c550 63 65 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f  ce that come fro
2c560 6d 0a 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55  m.** the ON or U
2c570 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
2c580 4c 45 46 54 20 4a 4f 49 4e 53 29 20 61 72 65 20  LEFT JOINS) are 
2c590 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
2c5a0 65 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a  e analysis..**.*
2c5b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2c5c0 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
2c5d0 69 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  if a LEFT JOIN c
2c5e0 61 6e 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  an be converted 
2c5f0 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e  into.** an ordin
2c600 61 72 79 20 4a 4f 49 4e 2e 20 20 54 68 65 20 70  ary JOIN.  The p
2c610 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2c620 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2c630 49 66 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  If the WHERE.** 
2c640 63 6c 61 75 73 65 20 72 65 71 75 69 72 65 73 20  clause requires 
2c650 74 68 61 74 20 73 6f 6d 65 20 63 6f 6c 75 6d 6e  that some column
2c660 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
2c670 62 6c 65 20 6f 66 20 74 68 65 20 4c 45 46 54 20  ble of the LEFT 
2c680 4a 4f 49 4e 0a 2a 2a 20 62 65 20 6e 6f 6e 2d 4e  JOIN.** be non-N
2c690 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 4c 45  ULL, then the LE
2c6a0 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 73  FT JOIN can be s
2c6b0 61 66 65 6c 79 20 63 6f 6e 76 65 72 74 65 64 20  afely converted 
2c6c0 69 6e 74 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e  into an.** ordin
2c6d0 61 72 79 20 6a 6f 69 6e 2e 0a 2a 2f 0a 69 6e 74  ary join..*/.int
2c6e0 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
2c6f0 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 45 78  iesNonNullRow(Ex
2c700 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 29  pr *p, int iTab)
2c710 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2c720 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
2c730 6b 69 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20  kipCollate(p);. 
2c740 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
2c750 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e   if( p->op==TK_N
2c760 4f 54 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  OTNULL ){.      
2c770 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
2c780 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f    }else if( p->o
2c790 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
2c7a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2c7b0 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c  prImpliesNonNull
2c7c0 52 6f 77 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54  Row(p->pLeft, iT
2c7d0 61 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ab) ) return 1;.
2c7e0 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69        p = p->pRi
2c7f0 67 68 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ght;.    }else{.
2c800 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c810 20 7d 0a 20 20 7d 0a 20 20 77 2e 78 45 78 70 72   }.  }.  w.xExpr
2c820 43 61 6c 6c 62 61 63 6b 20 3d 20 69 6d 70 6c 69  Callback = impli
2c830 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20  esNotNullRow;.  
2c840 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2c850 6b 20 3d 20 30 3b 0a 20 20 77 2e 78 53 65 6c 65  k = 0;.  w.xSele
2c860 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b  ctCallback2 = 0;
2c870 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b 0a  .  w.eCode = 0;.
2c880 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 54 61    w.u.iCur = iTa
2c890 62 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  b;.  sqlite3Walk
2c8a0 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
2c8b0 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d  eturn w.eCode;.}
2c8c0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
2c8d0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2c8e0 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
2c8f0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
2c900 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
2c910 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20  determine if an 
2c920 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
2c930 65 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72  e evaluated by r
2c940 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
2c950 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77  ** index only, w
2c960 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
2c970 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
2c980 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2c990 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72  ng.** table entr
2c9a0 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72  y.  The IdxCover
2c9b0 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74  .pIdx field is t
2c9c0 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f  he index.  IdxCo
2c9d0 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74  ver.iCur.** is t
2c9e0 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  he cursor for th
2c9f0 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  e table..*/.stru
2ca00 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20  ct IdxCover {.  
2ca10 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
2ca20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
2ca30 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63   be tested for c
2ca40 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74  overage */.  int
2ca50 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a   iCur;        /*
2ca60 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
2ca70 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72  or the table cor
2ca80 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
2ca90 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f  e index */.};../
2caa0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
2cab0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72  e if there are r
2cac0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2cad0 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a  umns in table .*
2cae0 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  * pWalker->u.pId
2caf0 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e  xCover->iCur can
2cb00 20 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73   be satisfied us
2cb10 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ing the index.**
2cb20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
2cb30 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a  Cover->pIdx..*/.
2cb40 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
2cb50 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a  dxCover(Walker *
2cb60 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2cb70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
2cb80 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
2cb90 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  N.   && pExpr->i
2cba0 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Table==pWalker->
2cbb0 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75  u.pIdxCover->iCu
2cbc0 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43  r.   && sqlite3C
2cbd0 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61  olumnOfIndex(pWa
2cbe0 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2cbf0 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e  r->pIdx, pExpr->
2cc00 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a  iColumn)<0.  ){.
2cc10 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
2cc20 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  de = 1;.    retu
2cc30 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2cc40 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2cc50 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2cc60 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
2cc70 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20  n index pIdx on 
2cc80 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
2cc90 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  r iCur contains 
2cca0 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72  will.** the expr
2ccb0 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
2ccc0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
2ccd0 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76  e index does cov
2cce0 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  er the.** expres
2ccf0 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69  sion and false i
2cd00 66 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  f the pExpr expr
2cd10 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65  ession reference
2cd20 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a  s table columns.
2cd30 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
2cd40 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64  found in the ind
2cd50 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41  ex pIdx..**.** A
2cd60 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67  n index covering
2cd70 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
2cd80 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78  eans that the ex
2cd90 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a  pression can be.
2cda0 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69  ** evaluated usi
2cdb0 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65  ng only the inde
2cdc0 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61  x and without ha
2cdd0 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74  ving to lookup t
2cde0 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
2cdf0 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  ing table entry.
2ce00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2ce10 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65  xprCoveredByInde
2ce20 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  x(.  Expr *pExpr
2ce30 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
2ce40 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74  index to be test
2ce50 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
2ce60 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2ce70 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
2ce80 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
2ce90 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a  onding table */.
2cea0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
2ceb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
2cec0 65 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ex that might be
2ced0 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61   used for covera
2cee0 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65  ge */.){.  Walke
2cef0 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64  r w;.  struct Id
2cf00 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d  xCover xcov;.  m
2cf10 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
2cf20 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e  eof(w));.  xcov.
2cf30 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78  iCur = iCur;.  x
2cf40 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  cov.pIdx = pIdx;
2cf50 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
2cf60 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65  ck = exprIdxCove
2cf70 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76  r;.  w.u.pIdxCov
2cf80 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71  er = &xcov;.  sq
2cf90 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
2cfa0 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75  , pExpr);.  retu
2cfb0 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  rn !w.eCode;.}..
2cfc0 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2cfd0 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2cfe0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2cff0 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
2d000 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63  e walker.** to c
2d010 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  ount references 
2d020 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  to table columns
2d030 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
2d040 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72  s of an .** aggr
2d050 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  egate function, 
2d060 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
2d070 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c  ement the.** sql
2d080 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73  ite3FunctionThis
2d090 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  Src() routine..*
2d0a0 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e  /.struct SrcCoun
2d0b0 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  t {.  SrcList *p
2d0c0 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61  Src;   /* One pa
2d0d0 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c  rticular FROM cl
2d0e0 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64  ause in a nested
2d0f0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
2d100 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20  nThis;       /* 
2d110 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
2d120 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
2d130 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  in pSrcList */. 
2d140 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20   int nOther;    
2d150 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2d160 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2d170 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52  umns in other FR
2d180 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b  OM clauses */.};
2d190 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  ../*.** Count th
2d1a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
2d1b0 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
2d1c0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2d1d0 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61   exprSrcCount(Wa
2d1e0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2d1f0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f  xpr *pExpr){.  /
2d200 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e  * The NEVER() on
2d210 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d   the second term
2d220 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69   is because sqli
2d230 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
2d240 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73  hisSrc().  ** is
2d250 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62   always called b
2d260 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70  efore sqlite3Exp
2d270 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2d280 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a  es() and so the.
2d290 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20    ** TK_COLUMNs 
2d2a0 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
2d2b0 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  n converted into
2d2c0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20   TK_AGG_COLUMN. 
2d2d0 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   If.  ** sqlite3
2d2e0 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
2d2f0 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69  Src() is used di
2d300 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  fferently in the
2d310 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a   future, the.  *
2d320 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e  * NEVER() will n
2d330 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65  eed to be remove
2d340 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  d. */.  if( pExp
2d350 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2d360 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d   || NEVER(pExpr-
2d370 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
2d380 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  MN) ){.    int i
2d390 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
2d3a0 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b  Count *p = pWalk
2d3b0 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b  er->u.pSrcCount;
2d3c0 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
2d3d0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
2d3e0 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72    int nSrc = pSr
2d3f0 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a  c ? pSrc->nSrc :
2d400 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
2d410 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20   i<nSrc; i++){. 
2d420 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
2d430 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
2d440 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65  i].iCursor ) bre
2d450 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
2d460 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20  ( i<nSrc ){.    
2d470 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20    p->nThis++;.  
2d480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2d490 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20  ->nOther++;.    
2d4a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
2d4b0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2d4c0 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
2d4d0 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72  if any of the ar
2d4e0 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70  guments to the p
2d4f0 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65  Expr Function re
2d500 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c  ference.** pSrcL
2d510 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ist.  Return tru
2d520 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41  e if they do.  A
2d530 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20  lso return true 
2d540 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  if the function.
2d550 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65  ** has no argume
2d560 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20  nts or has only 
2d570 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
2d580 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ts.  Return fals
2d590 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65  e if pExpr.** re
2d5a0 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73  ferences columns
2d5b0 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73   but not columns
2d5c0 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64   of tables found
2d5d0 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f   in pSrcList..*/
2d5e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63  .int sqlite3Func
2d5f0 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
2d600 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63  Expr *pExpr, Src
2d610 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b  List *pSrcList){
2d620 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
2d630 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63  truct SrcCount c
2d640 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  nt;.  assert( pE
2d650 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2d660 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77 2e  FUNCTION );.  w.
2d670 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2d680 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20  exprSrcCount;.  
2d690 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2d6a0 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 72  k = 0;.  w.u.pSr
2d6b0 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20  cCount = &cnt;. 
2d6c0 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63   cnt.pSrc = pSrc
2d6d0 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69  List;.  cnt.nThi
2d6e0 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74  s = 0;.  cnt.nOt
2d6f0 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  her = 0;.  sqlit
2d700 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26  e3WalkExprList(&
2d710 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  w, pExpr->x.pLis
2d720 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74  t);.  return cnt
2d730 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e  .nThis>0 || cnt.
2d740 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  nOther==0;.}../*
2d750 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
2d760 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
2d770 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
2d780 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
2d790 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
2d7a0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
2d7b0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
2d7c0 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
2d7d0 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
2d7e0 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
2d7f0 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
2d800 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
2d810 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
2d820 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
2d830 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
2d840 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
2d850 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
2d860 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
2d870 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
2d880 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
2d890 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->nColumn,.     
2d8a0 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
2d8b0 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
2d8c0 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
2d8d0 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
2d8e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72  Info->aFunc[] ar
2d8f0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
2d900 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
2d910 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
2d920 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
2d930 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
2d940 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
2d950 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
2d960 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64  oFunc(sqlite3 *d
2d970 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
2d980 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
2d990 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71  Info->aFunc = sq
2d9a0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
2d9b0 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a  te(.       db, .
2d9c0 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46         pInfo->aF
2d9d0 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  unc,.       size
2d9e0 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
2d9f0 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
2da00 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
2da10 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
2da20 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
2da30 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
2da40 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ExprCallback for
2da50 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20   a tree walker. 
2da60 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a   It is used to.*
2da70 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  * implement sqli
2da80 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2da90 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
2daa0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2dab0 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
2dac0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
2dad0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
2dae0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
2daf0 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b  zeAggregate(Walk
2db00 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2db10 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
2db20 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
2db30 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
2db40 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65  ->u.pNC;.  Parse
2db50 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
2db60 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
2db70 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
2db80 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
2db90 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2dba0 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 41 67 67   = pNC->uNC.pAgg
2dbb0 49 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  Info;..  assert(
2dbc0 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20   pNC->ncFlags & 
2dbd0 4e 43 5f 55 41 67 67 49 6e 66 6f 20 29 3b 0a 20  NC_UAggInfo );. 
2dbe0 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
2dbf0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
2dc00 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
2dc10 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
2dc20 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
2dc30 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2dc40 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
2dc50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2dc60 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
2dc70 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  LUMN );.      /*
2dc80 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2dc90 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69   the column is i
2dca0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62  n one of the tab
2dcb0 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
2dcc0 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20        ** clause 
2dcd0 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
2dce0 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
2dcf0 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c  if( ALWAYS(pSrcL
2dd00 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
2dd10 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2dd20 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
2dd30 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pSrcList->a;.   
2dd40 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2dd50 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
2dd60 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
2dd70 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2dd80 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
2dd90 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  l;.          ass
2dda0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2ddb0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2ddc0 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2ddd0 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
2dde0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
2ddf0 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
2de00 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
2de10 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
2de20 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
2de30 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78  t means that pEx
2de40 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  pr refers to a t
2de50 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
2de60 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74   ** that is in t
2de70 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2de80 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
2de90 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20  query.  .       
2dea0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2deb0 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65      ** Make an e
2dec0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  ntry for the col
2ded0 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  umn in pAggInfo-
2dee0 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65  >aCol[] if there
2def0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2df00 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20  is not an entry 
2df10 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
2df20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2df30 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
2df40 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
2df50 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  l = pAggInfo->aC
2df60 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
2df70 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49  for(k=0; k<pAggI
2df80 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  nfo->nColumn; k+
2df90 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
2dfa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2dfb0 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  ol->iTable==pExp
2dfc0 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
2dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2dfe0 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  Col->iColumn==pE
2dff0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
2e000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e010 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2e020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e030 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2e040 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66   if( (k>=pAggInf
2e050 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20  o->nColumn).    
2e060 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d           && (k =
2e070 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
2e080 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  n(pParse->db, pA
2e090 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20  ggInfo))>=0 .   
2e0a0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2e0b0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
2e0c0 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
2e0d0 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [k];.           
2e0e0 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
2e0f0 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20  pExpr->y.pTab;. 
2e100 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2e110 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70  l->iTable = pExp
2e120 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
2e130 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2e140 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
2e150 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
2e160 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65         pCol->iMe
2e170 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
2e180 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
2e190 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
2e1a0 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
2e1b0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2e1c0 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
2e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2e1e0 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
2e1f0 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBy ){.         
2e200 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b         int j, n;
2e210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e220 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d   ExprList *pGB =
2e230 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
2e240 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBy;.           
2e250 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
2e260 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d  List_item *pTerm
2e270 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20   = pGB->a;.     
2e280 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70             n = p
2e290 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  GB->nExpr;.     
2e2a0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
2e2b0 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54  =0; j<n; j++, pT
2e2c0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
2e2d0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
2e2e0 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
2e2f0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
2e300 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
2e310 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
2e320 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
2e330 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
2e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e350 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45   pE->iColumn==pE
2e360 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
2e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e380 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
2e390 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20  rColumn = j;.   
2e3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2e3c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e3d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2e3e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2e3f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e400 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2e410 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
2e420 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2e430 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70  SorterColumn = p
2e440 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e  AggInfo->nSortin
2e450 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20  gColumn++;.     
2e460 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e480 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
2e490 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f   now an entry fo
2e4a0 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49  r pExpr in pAggI
2e4b0 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74  nfo->aCol[] (eit
2e4c0 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  her.            
2e4d0 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61  ** because it wa
2e4e0 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f  s there before o
2e4f0 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  r because we jus
2e500 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20  t created it).. 
2e510 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f             ** Co
2e520 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20  nvert the pExpr 
2e530 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43  to be a TK_AGG_C
2e540 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20  OLUMN referring 
2e550 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  to that.        
2e560 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d      ** pAggInfo-
2e570 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20  >aCol[] entry.. 
2e580 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2e590 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
2e5a0 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
2e5b0 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
2e5c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
2e5d0 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
2e5e0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
2e5f0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
2e600 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b  = TK_AGG_COLUMN;
2e610 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
2e620 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29  pr->iAgg = (i16)
2e630 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  k;.            b
2e640 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2e650 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72  } /* endif pExpr
2e660 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
2e670 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20  >iCursor */.    
2e680 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f      } /* end loo
2e690 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  p over pSrcList 
2e6a0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
2e6b0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2e6c0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  e;.    }.    cas
2e6d0 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
2e6e0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28  N: {.      if( (
2e6f0 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e  pNC->ncFlags & N
2e700 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a  C_InAggFunc)==0.
2e710 20 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65         && pWalke
2e720 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d  r->walkerDepth==
2e730 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20  pExpr->op2.     
2e740 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
2e750 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
2e760 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63  Expr is a duplic
2e770 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61  ate of another a
2e780 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20  ggregate .      
2e790 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68    ** function th
2e7a0 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  at is already in
2e7b0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74   the pAggInfo st
2e7c0 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20  ructure.        
2e7d0 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  */.        struc
2e7e0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
2e7f0 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f  pItem = pAggInfo
2e800 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  ->aFunc;.       
2e810 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
2e820 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
2e830 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2e840 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2e850 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
2e860 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45  pItem->pExpr, pE
2e870 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  xpr, -1)==0 ){. 
2e880 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2e890 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2e8a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e8b0 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d  if( i>=pAggInfo-
2e8c0 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  >nFunc ){.      
2e8d0 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20      /* pExpr is 
2e8e0 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20  original.  Make 
2e8f0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
2e900 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
2e910 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2e920 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d          u8 enc =
2e930 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
2e940 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  ;.          i = 
2e950 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70  addAggInfoFunc(p
2e960 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
2e970 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
2e980 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20  if( i>=0 ){.    
2e990 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e9a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2e9b0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
2e9c0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20  lect) );.       
2e9d0 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41       pItem = &pA
2e9e0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
2e9f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
2ea00 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
2ea10 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
2ea20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b  pItem->iMem = ++
2ea30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2ea40 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2ea50 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2ea60 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
2ea70 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
2ea80 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75        pItem->pFu
2ea90 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nc = sqlite3Find
2eaa0 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
2eab0 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
2eac0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75          pExpr->u
2ead0 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20  .zToken, .      
2eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2eaf0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45  pr->x.pList ? pE
2eb00 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
2eb10 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29  xpr : 0, enc, 0)
2eb20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2eb30 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
2eb40 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   EP_Distinct ){.
2eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2eb60 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
2eb70 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2eb80 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
2eb90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2eba0 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
2ebb0 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ct = -1;.       
2ebc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ebd0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2ebe0 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78       /* Make pEx
2ebf0 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  pr point to the 
2ec00 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67  appropriate pAgg
2ec10 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e  Info->aFunc[] en
2ec20 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  try.        */. 
2ec30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2ec40 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2ec50 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
2ec60 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
2ec70 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53  );.        ExprS
2ec80 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
2ec90 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
2eca0 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
2ecb0 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b  ->iAgg = (i16)i;
2ecc0 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
2ecd0 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
2ece0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  nfo;.        ret
2ecf0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2ed00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ed10 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
2ed20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
2ed30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2ed40 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2ed50 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
2ed60 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2ed70 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20  InSelect(Walker 
2ed80 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
2ed90 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e   *pSelect){.  UN
2eda0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2edb0 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b  Select);.  pWalk
2edc0 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2b  er->walkerDepth+
2edd0 2b 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  +;.  return WRC_
2ede0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
2edf0 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 41  ic void analyzeA
2ee00 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
2ee10 74 45 6e 64 28 57 61 6c 6b 65 72 20 2a 70 57 61  tEnd(Walker *pWa
2ee20 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
2ee30 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44  elect){.  UNUSED
2ee40 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65  _PARAMETER(pSele
2ee50 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ct);.  pWalker->
2ee60 77 61 6c 6b 65 72 44 65 70 74 68 2d 2d 3b 0a 7d  walkerDepth--;.}
2ee70 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
2ee80 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
2ee90 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
2eea0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2eeb0 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
2eec0 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
2eed0 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
2eee0 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  to AggInfo objec
2eef0 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67  t that pNC->pAgg
2ef00 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  Info.** points t
2ef10 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65  o.  Additional e
2ef20 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20  ntries are made 
2ef30 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f  on the AggInfo o
2ef40 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65  bject as.** nece
2ef50 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
2ef60 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
2ef70 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
2ef80 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
2ef90 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
2efa0 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
2efb0 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
2efc0 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ames()..*/.void 
2efd0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2efe0 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d  zeAggregates(Nam
2eff0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
2f000 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57  xpr *pExpr){.  W
2f010 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78  alker w;.  w.xEx
2f020 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  prCallback = ana
2f030 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20  lyzeAggregate;. 
2f040 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2f050 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
2f060 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a  egatesInSelect;.
2f070 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2f080 61 63 6b 32 20 3d 20 61 6e 61 6c 79 7a 65 41 67  ack2 = analyzeAg
2f090 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
2f0a0 45 6e 64 3b 0a 20 20 77 2e 77 61 6c 6b 65 72 44  End;.  w.walkerD
2f0b0 65 70 74 68 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  epth = 0;.  w.u.
2f0c0 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 77 2e 70  pNC = pNC;.  w.p
2f0d0 50 61 72 73 65 20 3d 20 30 3b 0a 20 20 61 73 73  Parse = 0;.  ass
2f0e0 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ert( pNC->pSrcLi
2f0f0 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  st!=0 );.  sqlit
2f100 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
2f110 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
2f120 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  Call sqlite3Expr
2f130 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2f140 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  s() for every ex
2f150 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a  pression in an.*
2f160 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
2f170 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  t.  Return the n
2f180 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
2f190 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2f1a0 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
2f1b0 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74   analysis is cut
2f1c0 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20   short..*/.void 
2f1d0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2f1e0 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f  zeAggList(NameCo
2f1f0 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
2f200 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2f210 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2f220 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
2f230 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
2f240 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74  t ){.    for(pIt
2f250 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
2f260 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
2f270 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
2f280 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2f290 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2f2a0 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e  tes(pNC, pItem->
2f2b0 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2f2c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
2f2d0 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77  ate a single new
2f2e0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75 73   register for us
2f2f0 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69  e to hold some i
2f300 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
2f310 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  lt..*/.int sqlit
2f320 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72  e3GetTempReg(Par
2f330 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
2f340 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
2f350 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Reg==0 ){.    re
2f360 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  turn ++pParse->n
2f370 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Mem;.  }.  retur
2f380 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  n pParse->aTempR
2f390 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65  eg[--pParse->nTe
2f3a0 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mpReg];.}../*.**
2f3b0 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65   Deallocate a re
2f3c0 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61  gister, making a
2f3d0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75  vailable for reu
2f3e0 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  se for some othe
2f3f0 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2f  r.** purpose..*/
2f400 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
2f410 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73  easeTempReg(Pars
2f420 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
2f430 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67  Reg){.  if( iReg
2f440 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d   && pParse->nTem
2f450 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
2f460 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
2f470 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
2f480 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
2f490 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69  >nTempReg++] = i
2f4a0 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
2f4b0 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65  * Allocate or de
2f4c0 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b  allocate a block
2f4d0 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75   of nReg consecu
2f4e0 74 69 76 65 20 72 65 67 69 73 74 65 72 73 2e 0a  tive registers..
2f4f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
2f500 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  tTempRange(Parse
2f510 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52   *pParse, int nR
2f520 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  eg){.  int i, n;
2f530 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29  .  if( nReg==1 )
2f540 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47   return sqlite3G
2f550 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2f560 29 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d  );.  i = pParse-
2f570 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20  >iRangeReg;.  n 
2f580 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  = pParse->nRange
2f590 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c  Reg;.  if( nReg<
2f5a0 3d 6e 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  =n ){.    pParse
2f5b0 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e  ->iRangeReg += n
2f5c0 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
2f5d0 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52  >nRangeReg -= nR
2f5e0 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eg;.  }else{.   
2f5f0 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65   i = pParse->nMe
2f600 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
2f610 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20  >nMem += nReg;. 
2f620 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
2f630 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
2f640 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61  easeTempRange(Pa
2f650 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2f660 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
2f670 7b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20  {.  if( nReg==1 
2f680 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
2f690 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
2f6a0 72 73 65 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  rse, iReg);.    
2f6b0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
2f6c0 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e  ( nReg>pParse->n
2f6d0 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20  RangeReg ){.    
2f6e0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2f6f0 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50  g = nReg;.    pP
2f700 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
2f710 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
2f720 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65  *.** Mark all te
2f730 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
2f740 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61  s as being unava
2f750 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65  ilable for reuse
2f760 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2f770 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2f780 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
2f790 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65  ){.  pParse->nTe
2f7a0 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61  mpReg = 0;.  pPa
2f7b0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2f7c0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c   0;.}../*.** Val
2f7d0 69 64 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65  idate that no te
2f7e0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
2f7f0 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68   falls within th
2f800 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46  e range of.** iF
2f810 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63  irst..iLast, inc
2f820 6c 75 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f  lusive.  This ro
2f830 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
2f840 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  ll from within a
2f850 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
2f860 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  ments..*/.#ifdef
2f870 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
2f880 74 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73  t sqlite3NoTemps
2f890 49 6e 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  InRange(Parse *p
2f8a0 50 61 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73  Parse, int iFirs
2f8b0 74 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20  t, int iLast){. 
2f8c0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50   int i;.  if( pP
2f8d0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e  arse->nRangeReg>
2f8e0 30 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e  0.   && pParse->
2f8f0 69 52 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65  iRangeReg+pParse
2f900 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3e 20 69 46  ->nRangeReg > iF
2f910 69 72 73 74 0a 20 20 20 26 26 20 70 50 61 72 73  irst.   && pPars
2f920 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3c 3d 20  e->iRangeReg <= 
2f930 69 4c 61 73 74 0a 20 20 29 7b 0a 20 20 20 20 20  iLast.  ){.     
2f940 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2f950 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
2f960 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b  e->nTempReg; i++
2f970 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
2f980 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d  e->aTempReg[i]>=
2f990 69 46 69 72 73 74 20 26 26 20 70 50 61 72 73 65  iFirst && pParse
2f9a0 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69  ->aTempReg[i]<=i
2f9b0 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
2f9c0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
2f9d0 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
2f9e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2f9f0 5f 44 45 42 55 47 20 2a 2f 0a                    _DEBUG */.