/ Hex Artifact Content
Login

Artifact f17e014c320093dfae1fa22cf395385ef5520b441bf341d48763dd9eca12ec16:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72   op;.  if( pExpr
0600: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e  ->flags & EP_Gen
0610: 65 72 69 63 20 29 20 72 65 74 75 72 6e 20 30 3b  eric ) return 0;
0620: 0a 20 20 77 68 69 6c 65 28 20 45 78 70 72 48 61  .  while( ExprHa
0630: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0640: 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20 20   EP_Skip) ){.   
0650: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0660: 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
0670: 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 45  ;.    pExpr = pE
0680: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
0690: 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30  assert( pExpr!=0
06a0: 20 29 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70   );.  }.  op = p
06b0: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
06c0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
06d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
06e0: 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49 73  pr->flags&EP_xIs
06f0: 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72 65  Select );.    re
0700: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
0710: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
0720: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
0730: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
0740: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
0750: 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
0760: 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23 69 66   pExpr->op2;.#if
0770: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0780: 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d  _CAST.  if( op==
0790: 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61  TK_CAST ){.    a
07a0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
07b0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
07c0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
07d0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
07e0: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45  3AffinityType(pE
07f0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
0800: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
0810: 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f  if( (op==TK_AGG_
0820: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
0830: 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45 78 70  _COLUMN) && pExp
0840: 72 2d 3e 79 2e 70 54 61 62 20 29 7b 0a 20 20 20  r->y.pTab ){.   
0850: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0860: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0870: 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54 61 62  ty(pExpr->y.pTab
0880: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
0890: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d  );.  }.  if( op=
08a0: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
08b0: 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  N ){.    assert(
08c0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66   pExpr->pLeft->f
08d0: 6c 61 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63  lags&EP_xIsSelec
08e0: 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t );.    return 
08f0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
0900: 69 74 79 28 0a 20 20 20 20 20 20 20 20 70 45 78  ity(.        pEx
0910: 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65  pr->pLeft->x.pSe
0920: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
0930: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
0940: 70 45 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d  pExpr.    );.  }
0950: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d  .  return pExpr-
0960: 3e 61 66 66 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a  >affExpr;.}../*.
0970: 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61  ** Set the colla
0980: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
0990: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  r expression pEx
09a0: 70 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c  pr to be the col
09b0: 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
09c0: 63 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b  ce named by pTok
09d0: 65 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70  en.   Return a p
09e0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
09f0: 45 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a  Expr node that.*
0a00: 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
0a10: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
0a20: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  r..**.** If a me
0a30: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
0a40: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
0a50: 61 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72  at fact is recor
0a60: 64 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64  ded in pParse->d
0a70: 62 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78  b.** and the pEx
0a80: 70 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pr parameter is 
0a90: 72 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67  returned unchang
0aa0: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
0ab0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
0ac0: 74 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65  teToken(.  Parse
0ad0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
0ae0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
0af0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
0b00: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
0b10: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
0b20: 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65  "COLLATE" clause
0b30: 20 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73   to this express
0b40: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  ion */.  const T
0b50: 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c  oken *pCollName,
0b60: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c    /* Name of col
0b70: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
0b80: 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65  */.  int dequote
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0ba0: 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65   True to dequote
0bb0: 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b   pCollName */.){
0bc0: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65  .  if( pCollName
0bd0: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70  ->n>0 ){.    Exp
0be0: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
0bf0: 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
0c00: 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54  e->db, TK_COLLAT
0c10: 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65  E, pCollName, de
0c20: 71 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20  quote);.    if( 
0c30: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e  pNew ){.      pN
0c40: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70  ew->pLeft = pExp
0c50: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  r;.      pNew->f
0c60: 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61  lags |= EP_Colla
0c70: 74 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20  te|EP_Skip;.    
0c80: 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
0c90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
0ca0: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72  rn pExpr;.}.Expr
0cb0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64   *sqlite3ExprAdd
0cc0: 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61  CollateString(Pa
0cd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
0ce0: 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20  r *pExpr, const 
0cf0: 63 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b  char *zC){.  Tok
0d00: 65 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20  en s;.  assert( 
0d10: 7a 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  zC!=0 );.  sqlit
0d20: 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20  e3TokenInit(&s, 
0d30: 28 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65  (char*)zC);.  re
0d40: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
0d50: 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28  AddCollateToken(
0d60: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
0d70: 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s, 0);.}../*.** 
0d80: 53 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b  Skip over any TK
0d90: 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f  _COLLATE operato
0da0: 72 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  rs..*/.Expr *sql
0db0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
0dc0: 61 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29  ate(Expr *pExpr)
0dd0: 7b 0a 20 20 77 68 69 6c 65 28 20 70 45 78 70 72  {.  while( pExpr
0de0: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
0df0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b  rty(pExpr, EP_Sk
0e00: 69 70 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ip) ){.    asser
0e10: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
0e20: 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20  _COLLATE );.    
0e30: 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70  pExpr = pExpr->p
0e40: 4c 65 66 74 3b 0a 20 20 7d 20 20 20 0a 20 20 72  Left;.  }   .  r
0e50: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
0e60: 2f 2a 0a 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20  /*.** Skip over 
0e70: 61 6e 79 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f  any TK_COLLATE o
0e80: 70 65 72 61 74 6f 72 73 20 61 6e 64 2f 6f 72 20  perators and/or 
0e90: 61 6e 79 20 75 6e 6c 69 6b 65 6c 79 28 29 0a 2a  any unlikely().*
0ea0: 2a 20 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  * or likelihood(
0eb0: 29 20 6f 72 20 6c 69 6b 65 6c 79 28 29 20 66 75  ) or likely() fu
0ec0: 6e 63 74 69 6f 6e 73 20 61 74 20 74 68 65 20 72  nctions at the r
0ed0: 6f 6f 74 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 70  oot of an.** exp
0ee0: 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72  ression..*/.Expr
0ef0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69   *sqlite3ExprSki
0f00: 70 43 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b 65 6c  pCollateAndLikel
0f10: 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  y(Expr *pExpr){.
0f20: 20 20 77 68 69 6c 65 28 20 70 45 78 70 72 20 26    while( pExpr &
0f30: 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
0f40: 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69 70  y(pExpr, EP_Skip
0f50: 7c 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b  |EP_Unlikely) ){
0f60: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
0f70: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0f80: 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a  EP_Unlikely) ){.
0f90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
0fa0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0fb0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
0fc0: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ct) );.      ass
0fd0: 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ert( pExpr->x.pL
0fe0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
0ff0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1000: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
1010: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45  TION );.      pE
1020: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  xpr = pExpr->x.p
1030: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1040: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1050: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1060: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
1070: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20   );.      pExpr 
1080: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1090: 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72      }.  }   .  r
10a0: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
10b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
10c0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
10d0: 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  nce for the expr
10e0: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66  ession pExpr. If
10f0: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20  .** there is no 
1100: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
1110: 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75  g sequence, retu
1120: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  rn NULL..**.** S
1130: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
1140: 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29 0a  ExprNNCollSeq().
1150: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
1160: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29  3ExprNNCollSeq()
1170: 20 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20   works the same 
1180: 65 78 61 63 74 20 74 68 61 74 20 69 74 20 72 65  exact that it re
1190: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65 66  turns the.** def
11a0: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 69  ault collation i
11b0: 66 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20 64  f pExpr has no d
11c0: 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  efined collation
11d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
11e0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d  ating sequence m
11f0: 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69 6e  ight be determin
1200: 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20  ed by a COLLATE 
1210: 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20 62  operator.** or b
1220: 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  y the presence o
1230: 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  f a column with 
1240: 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74  a defined collat
1250: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
1260: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
1270: 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70 72  rs take first pr
1280: 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74 20  ecedence.  Left 
1290: 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a 2a  operands take.**
12a0: 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72   precedence over
12b0: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73 2e   right operands.
12c0: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
12d0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
12e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
12f0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73  xpr *pExpr){.  s
1300: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1310: 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c 53  rse->db;.  CollS
1320: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
1330: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70 72   Expr *p = pExpr
1340: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
1350: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e      int op = p->
1360: 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66  op;.    if( p->f
1370: 6c 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72 69  lags & EP_Generi
1380: 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  c ) break;.    i
1390: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
13a0: 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32  ER ) op = p->op2
13b0: 3b 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d 54  ;.    if( (op==T
13c0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  K_AGG_COLUMN || 
13d0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
13e0: 20 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52 29   op==TK_TRIGGER)
13f0: 0a 20 20 20 20 20 26 26 20 70 2d 3e 79 2e 70 54  .     && p->y.pT
1400: 61 62 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  ab!=0.    ){.   
1410: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
1420: 49 53 54 45 52 20 26 26 20 70 2d 3e 79 2e 70 54  ISTER && p->y.pT
1430: 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68  ab!=0 happens wh
1440: 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72 69  en pExpr was ori
1450: 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ginally.      **
1460: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74   a TK_COLUMN but
1470: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1480: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61  evaluated and ca
1490: 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74  ched in a regist
14a0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  er */.      int 
14b0: 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  j = p->iColumn;.
14c0: 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29        if( j>=0 )
14d0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
14e0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d  char *zColl = p-
14f0: 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  >y.pTab->aCol[j]
1500: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  .zColl;.        
1510: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
1520: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
1530: 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30  NC(db), zColl, 0
1540: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1550: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1560: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53    if( op==TK_CAS
1570: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55  T || op==TK_UPLU
1580: 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70  S ){.      p = p
1590: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63  ->pLeft;.      c
15a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
15b0: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f     if( op==TK_CO
15c0: 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 70  LLATE ){.      p
15d0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
15e0: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
15f0: 20 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e   ENC(db), 0, p->
1600: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1620: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26    if( p->flags &
1630: 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
1640: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66       if( p->pLef
1650: 74 20 26 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e  t && (p->pLeft->
1660: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
1670: 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  te)!=0 ){.      
1680: 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a    p = p->pLeft;.
1690: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16a0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 78 74       Expr *pNext
16b0: 20 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20    = p->pRight;. 
16c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 45 78         /* The Ex
16d0: 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65  pr.x union is ne
16e0: 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20  ver used at the 
16f0: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70  same time as Exp
1700: 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20  r.pRight */.    
1710: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78      assert( p->x
1720: 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e  .pList==0 || p->
1730: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
1740: 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61 67 73       /* p->flags
1750: 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c 61 74   holds EP_Collat
1760: 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74 2d 3e  e and p->pLeft->
1770: 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74 2e 20  flags does not. 
1780: 20 41 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   And.        ** 
1790: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63 61 6e  p->x.pSelect can
17a0: 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d 3e 78  not.  So if p->x
17b0: 2e 70 4c 65 66 74 20 65 78 69 73 74 73 2c 20 69  .pLeft exists, i
17c0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 0a 20  t must hold at. 
17d0: 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 73 74 20         ** least 
17e0: 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65 2e 20  one EP_Collate. 
17f0: 54 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Thus the followi
1800: 6e 67 20 74 77 6f 20 41 4c 57 41 59 53 2e 20 2a  ng two ALWAYS. *
1810: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  /.        if( p-
1820: 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 41  >x.pList!=0 && A
1830: 4c 57 41 59 53 28 21 45 78 70 72 48 61 73 50 72  LWAYS(!ExprHasPr
1840: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
1850: 53 65 6c 65 63 74 29 29 20 29 7b 0a 20 20 20 20  Select)) ){.    
1860: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1870: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1880: 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e 70 4c  ALWAYS(i<p->x.pL
1890: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69 2b 2b  ist->nExpr); i++
18a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
18b0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
18c0: 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  ty(p->x.pList->a
18d0: 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 43 6f  [i].pExpr, EP_Co
18e0: 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  llate) ){.      
18f0: 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
1900: 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  p->x.pList->a[i]
1910: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
1920: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1930: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1950: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65  .        p = pNe
1960: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
1970: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65  }else{.      bre
1980: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1990: 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b  if( sqlite3Check
19a0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
19b0: 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70  pColl) ){ .    p
19c0: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Coll = 0;.  }.  
19d0: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
19e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
19f0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1a00: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
1a10: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
1a20: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
1a30: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
1a40: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
1a50: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1a60: 20 74 68 65 0a 2a 2a 20 64 65 66 61 75 74 6c 20   the.** defautl 
1a70: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1a80: 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ce..**.** See al
1a90: 73 6f 3a 20 73 71 6c 69 74 65 33 45 78 70 72 43  so: sqlite3ExprC
1aa0: 6f 6c 6c 53 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54  ollSeq().**.** T
1ab0: 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  he sqlite3ExprCo
1ac0: 6c 6c 53 65 71 28 29 20 72 6f 75 74 69 6e 65 20  llSeq() routine 
1ad0: 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 65  works the same e
1ae0: 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a  xcept that it.**
1af0: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
1b00: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
1b10: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a  ined collation..
1b20: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
1b30: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b40: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b50: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1b60: 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 73 71 6c  CollSeq *p = sql
1b70: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1b80: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
1b90: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 70 20 3d    if( p==0 ) p =
1ba0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
1bb0: 6c 74 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  ltColl;.  assert
1bc0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( p!=0 );.  retu
1bd0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
1be0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1bf0: 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  e two expression
1c00: 73 20 68 61 76 65 20 65 71 75 69 76 61 6c 65 6e  s have equivalen
1c10: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
1c20: 65 6e 63 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ences..*/.int sq
1c30: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1c40: 4d 61 74 63 68 28 50 61 72 73 65 20 2a 70 50 61  Match(Parse *pPa
1c50: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20  rse, Expr *pE1, 
1c60: 45 78 70 72 20 2a 70 45 32 29 7b 0a 20 20 43 6f  Expr *pE2){.  Co
1c70: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 31 20 3d 20  llSeq *pColl1 = 
1c80: 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
1c90: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 31  lSeq(pParse, pE1
1ca0: 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  );.  CollSeq *pC
1cb0: 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 45 78  oll2 = sqlite3Ex
1cc0: 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72  prNNCollSeq(pPar
1cd0: 73 65 2c 20 70 45 32 29 3b 0a 20 20 72 65 74 75  se, pE2);.  retu
1ce0: 72 6e 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  rn sqlite3StrICm
1cf0: 70 28 70 43 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c  p(pColl1->zName,
1d00: 20 70 43 6f 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d   pColl2->zName)=
1d10: 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  =0;.}../*.** pEx
1d20: 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64  pr is an operand
1d30: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
1d40: 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32   operator.  aff2
1d50: 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20   is the.** type 
1d60: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
1d70: 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20  other operand.  
1d80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1d90: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  urns the.** type
1da0: 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73   affinity that s
1db0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
1dc0: 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  r the comparison
1dd0: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68   operator..*/.ch
1de0: 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  ar sqlite3Compar
1df0: 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  eAffinity(Expr *
1e00: 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32  pExpr, char aff2
1e10: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d  ){.  char aff1 =
1e20: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1e30: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69  nity(pExpr);.  i
1e40: 66 28 20 61 66 66 31 3e 53 51 4c 49 54 45 5f 41  f( aff1>SQLITE_A
1e50: 46 46 5f 4e 4f 4e 45 20 26 26 20 61 66 66 32 3e  FF_NONE && aff2>
1e60: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
1e70: 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73  ){.    /* Both s
1e80: 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70  ides of the comp
1e90: 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d  arison are colum
1ea0: 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e  ns. If one has n
1eb0: 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66  umeric.    ** af
1ec0: 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74  finity, use that
1ed0: 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  . Otherwise use 
1ee0: 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  no affinity..   
1ef0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
1f00: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
1f10: 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71  nity(aff1) || sq
1f20: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
1f30: 66 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a  finity(aff2) ){.
1f40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f50: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
1f60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f80: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a  AFF_BLOB;.    }.
1f90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1fa0: 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f  One side is a co
1fb0: 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20  lumn, the other 
1fc0: 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20  is not. Use the 
1fd0: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
1fe0: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1ff0: 20 61 66 66 31 3c 3d 53 51 4c 49 54 45 5f 41 46   aff1<=SQLITE_AF
2000: 46 5f 4e 4f 4e 45 20 7c 7c 20 61 66 66 32 3c 3d  F_NONE || aff2<=
2010: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
2020: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61  );.    return (a
2030: 66 66 31 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ff1<=SQLITE_AFF_
2040: 4e 4f 4e 45 20 3f 20 61 66 66 32 20 3a 20 61 66  NONE ? aff2 : af
2050: 66 31 29 20 7c 20 53 51 4c 49 54 45 5f 41 46 46  f1) | SQLITE_AFF
2060: 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _NONE;.  }.}../*
2070: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
2080: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
2090: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
20a0: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
20b0: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
20c0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
20d0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
20e0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
20f0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
2100: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
2110: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
2120: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
2130: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
2140: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
2150: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2160: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
2170: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
2180: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
2190: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
21a0: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
21b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
21c0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
21d0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
21e0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
21f0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2200: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
2210: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
2220: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
2230: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2240: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
2250: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
2260: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
2270: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
2280: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
2290: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
22a0: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
22b0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
22c0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
22d0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
22e0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
22f0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
2300: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
2310: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
2320: 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20 29  lse if( aff==0 )
2330: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
2340: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
2350: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
2360: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
2370: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
2380: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
2390: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
23a0: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
23b0: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
23c0: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
23d0: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
23e0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
23f0: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
2400: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
2410: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
2420: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
2430: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
2440: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
2450: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
2460: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
2470: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
2480: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
2490: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
24a0: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
24b0: 69 66 28 20 61 66 66 3c 53 51 4c 49 54 45 5f 41  if( aff<SQLITE_A
24c0: 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 72  FF_TEXT ){.    r
24d0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
24e0: 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  f( aff==SQLITE_A
24f0: 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 72  FF_TEXT ){.    r
2500: 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69 6e 69  eturn idx_affini
2510: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ty==SQLITE_AFF_T
2520: 45 58 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  EXT;.  }.  retur
2530: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
2540: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
2550: 66 66 69 6e 69 74 79 29 3b 0a 7d 0a 0a 2f 2a 0a  ffinity);.}../*.
2560: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 35  ** Return the P5
2570: 20 76 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75   value that shou
2580: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  ld be used for a
2590: 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73   binary comparis
25a0: 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50  on.** opcode (OP
25b0: 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29  _Eq, OP_Ge etc.)
25c0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
25d0: 20 70 45 78 70 72 31 20 61 6e 64 20 70 45 78 70   pExpr1 and pExp
25e0: 72 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  r2..*/.static u8
25f0: 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35   binaryCompareP5
2600: 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45  (Expr *pExpr1, E
2610: 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74  xpr *pExpr2, int
2620: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
2630: 75 38 20 61 66 66 20 3d 20 28 63 68 61 72 29 73  u8 aff = (char)s
2640: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
2650: 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66  ty(pExpr2);.  af
2660: 66 20 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43  f = (u8)sqlite3C
2670: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
2680: 45 78 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75  Expr1, aff) | (u
2690: 38 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20  8)jumpIfNull;.  
26a0: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
26b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
26c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c  inter to the col
26d0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
26e0: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
26f0: 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61  sed by.** a bina
2700: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  ry comparison op
2710: 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67  erator comparing
2720: 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
2730: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
2740: 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73  left hand expres
2750: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
2760: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79  ting sequence ty
2770: 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a  pe, then it is.*
2780: 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73  * used. Otherwis
2790: 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  e the collation 
27a0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
27b0: 20 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72   right hand expr
27c0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65  ession.** is use
27d0: 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c  d, or the defaul
27e0: 74 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65  t (BINARY) if ne
27f0: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
2800: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
2810: 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20  .** type..**.** 
2820: 41 72 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20  Argument pRight 
2830: 28 62 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20  (but not pLeft) 
2840: 6d 61 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f  may be a null po
2850: 69 6e 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63  inter. In this c
2860: 61 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  ase,.** it is no
2870: 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f  t considered..*/
2880: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
2890: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
28a0: 6c 6c 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a  llSeq(.  Parse *
28b0: 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20  pParse, .  Expr 
28c0: 2a 70 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20  *pLeft, .  Expr 
28d0: 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c  *pRight.){.  Col
28e0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61  lSeq *pColl;.  a
28f0: 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
2900: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61    if( pLeft->fla
2910: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
2920: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
2930: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2940: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  q(pParse, pLeft)
2950: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
2960: 69 67 68 74 20 26 26 20 28 70 52 69 67 68 74 2d  ight && (pRight-
2970: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
2980: 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ate)!=0 ){.    p
2990: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
29a0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
29b0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c  , pRight);.  }el
29c0: 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  se{.    pColl = 
29d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
29e0: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
29f0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c  );.    if( !pCol
2a00: 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  l ){.      pColl
2a10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2a20: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52  llSeq(pParse, pR
2a30: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ight);.    }.  }
2a40: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
2a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
2a60: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  te code for a co
2a70: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2a80: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2a90: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20   codeCompare(.  
2aa0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2ab0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
2ac0: 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72   (and code gener
2ad0: 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a  ating) context *
2ae0: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
2af0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66        /* The lef
2b00: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45  t operand */.  E
2b10: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20  xpr *pRight,    
2b20: 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70   /* The right op
2b30: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  erand */.  int o
2b40: 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20  pcode,       /* 
2b50: 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  The comparison o
2b60: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69  pcode */.  int i
2b70: 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20  n1, int in2, /* 
2b80: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
2b90: 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69   operands */.  i
2ba0: 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
2bb0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
2bc0: 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74   true.  */.  int
2bd0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
2be0: 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20  * If true, jump 
2bf0: 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  if either operan
2c00: 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  d is NULL */.){.
2c10: 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20    int p5;.  int 
2c20: 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  addr;.  CollSeq 
2c30: 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c  *p4;..  p4 = sql
2c40: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
2c50: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
2c60: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
2c70: 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f  .  p5 = binaryCo
2c80: 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70  mpareP5(pLeft, p
2c90: 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c  Right, jumpIfNul
2ca0: 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  l);.  addr = sql
2cb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
2cc0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70  Parse->pVdbe, op
2cd0: 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c  code, in2, dest,
2ce0: 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20   in1,.          
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43   (void*)p4, P4_C
2d10: 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74  OLLSEQ);.  sqlit
2d20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 70  e3VdbeChangeP5(p
2d30: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75  Parse->pVdbe, (u
2d40: 38 29 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20  8)p5);.  return 
2d50: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  addr;.}../*.** R
2d60: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 65 78  eturn true if ex
2d70: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
2d80: 73 20 61 20 76 65 63 74 6f 72 2c 20 6f 72 20 66  s a vector, or f
2d90: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
2da0: 2a 2a 0a 2a 2a 20 41 20 76 65 63 74 6f 72 20 69  **.** A vector i
2db0: 73 20 64 65 66 69 6e 65 64 20 61 73 20 61 6e 79  s defined as any
2dc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
2dd0: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 77 6f 20   results in two 
2de0: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 6f 6c 75 6d  or more.** colum
2df0: 6e 73 20 6f 66 20 72 65 73 75 6c 74 2e 20 20 45  ns of result.  E
2e00: 76 65 72 79 20 54 4b 5f 56 45 43 54 4f 52 20 6e  very TK_VECTOR n
2e10: 6f 64 65 20 69 73 20 61 6e 20 76 65 63 74 6f 72  ode is an vector
2e20: 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
2e30: 70 61 72 73 65 72 20 77 69 6c 6c 20 6e 6f 74 20  parser will not 
2e40: 67 65 6e 65 72 61 74 65 20 61 20 54 4b 5f 56 45  generate a TK_VE
2e50: 43 54 4f 52 20 77 69 74 68 20 66 65 77 65 72 20  CTOR with fewer 
2e60: 74 68 61 6e 20 74 77 6f 20 65 6e 74 72 69 65 73  than two entries
2e70: 2e 0a 2a 2a 20 42 75 74 20 61 20 54 4b 5f 53 45  ..** But a TK_SE
2e80: 4c 45 43 54 20 6d 69 67 68 74 20 62 65 20 65 69  LECT might be ei
2e90: 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72  ther a vector or
2ea0: 20 61 20 73 63 61 6c 61 72 2e 20 49 74 20 69 73   a scalar. It is
2eb0: 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e 73 69 64 65   only.** conside
2ec0: 72 65 64 20 61 20 76 65 63 74 6f 72 20 69 66 20  red a vector if 
2ed0: 69 74 20 68 61 73 20 74 77 6f 20 6f 72 20 6d 6f  it has two or mo
2ee0: 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  re result column
2ef0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2f00: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 45 78  3ExprIsVector(Ex
2f10: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 72 65  pr *pExpr){.  re
2f20: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
2f30: 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
2f40: 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  )>1;.}../*.** If
2f50: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2f60: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
2f70: 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f  ly argument is o
2f80: 66 20 74 79 70 65 20 54 4b 5f 56 45 43 54 4f 52  f type TK_VECTOR
2f90: 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20   .** return the 
2fa0: 6e 75 6d 62 65 72 20 6f 66 20 65 78 70 72 65 73  number of expres
2fb0: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 76 65 63  sions in the vec
2fc0: 74 6f 72 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  tor. Or, if the 
2fd0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
2fe0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 72   a sub-select, r
2ff0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
3000: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
3010: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 46  he sub-select. F
3020: 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20  or.** any other 
3030: 74 79 70 65 20 6f 66 20 65 78 70 72 65 73 73 69  type of expressi
3040: 6f 6e 2c 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f  on, return 1..*/
3050: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
3060: 56 65 63 74 6f 72 53 69 7a 65 28 45 78 70 72 20  VectorSize(Expr 
3070: 2a 70 45 78 70 72 29 7b 0a 20 20 75 38 20 6f 70  *pExpr){.  u8 op
3080: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
3090: 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
30a0: 54 45 52 20 29 20 6f 70 20 3d 20 70 45 78 70 72  TER ) op = pExpr
30b0: 2d 3e 6f 70 32 3b 0a 20 20 69 66 28 20 6f 70 3d  ->op2;.  if( op=
30c0: 3d 54 4b 5f 56 45 43 54 4f 52 20 29 7b 0a 20 20  =TK_VECTOR ){.  
30d0: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
30e0: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  x.pList->nExpr;.
30f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
3100: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
3110: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78   return pExpr->x
3120: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
3130: 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65  ->nExpr;.  }else
3140: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
3150: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
3160: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
3170: 20 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e   a subexpression
3180: 20 6f 66 20 70 56 65 63 74 6f 72 20 74 68 61 74   of pVector that
3190: 20 69 73 20 74 68 65 20 69 2d 74 68 0a 2a 2a 20   is the i-th.** 
31a0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65  column of the ve
31b0: 63 74 6f 72 20 28 6e 75 6d 62 65 72 65 64 20 73  ctor (numbered s
31c0: 74 61 72 74 69 6e 67 20 77 69 74 68 20 30 29 2e  tarting with 0).
31d0: 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73    The caller mus
31e0: 74 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74  t.** ensure that
31f0: 20 69 20 69 73 20 77 69 74 68 69 6e 20 72 61 6e   i is within ran
3200: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65  ge..**.** If pVe
3210: 63 74 6f 72 20 69 73 20 72 65 61 6c 6c 79 20 61  ctor is really a
3220: 20 73 63 61 6c 61 72 20 28 61 6e 64 20 22 73 63   scalar (and "sc
3230: 61 6c 61 72 22 20 68 65 72 65 20 69 6e 63 6c 75  alar" here inclu
3240: 64 65 73 20 73 75 62 71 75 65 72 69 65 73 0a 2a  des subqueries.*
3250: 2a 20 74 68 61 74 20 72 65 74 75 72 6e 20 61 20  * that return a 
3260: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 21 29 20  single column!) 
3270: 74 68 65 6e 20 72 65 74 75 72 6e 20 70 56 65 63  then return pVec
3280: 74 6f 72 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a  tor unmodified..
3290: 2a 2a 0a 2a 2a 20 70 56 65 63 74 6f 72 20 72 65  **.** pVector re
32a0: 74 61 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20  tains ownership 
32b0: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
32c0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  subexpression..*
32d0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76 65 63 74  *.** If the vect
32e0: 6f 72 20 69 73 20 61 20 28 53 45 4c 45 43 54 20  or is a (SELECT 
32f0: 2e 2e 2e 29 20 74 68 65 6e 20 74 68 65 20 65 78  ...) then the ex
3300: 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65  pression returne
3310: 64 20 69 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65  d is.** just the
3320: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   expression for 
3330: 74 68 65 20 69 2d 74 68 20 74 65 72 6d 20 6f 66  the i-th term of
3340: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
3350: 20 61 6e 64 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20   and may.** not 
3360: 62 65 20 72 65 61 64 79 20 66 6f 72 20 65 76 61  be ready for eva
3370: 6c 75 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20  luation because 
3380: 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  the table cursor
3390: 20 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20   has not yet.** 
33a0: 62 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 2e  been positioned.
33b0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
33c0: 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
33d0: 78 70 72 28 45 78 70 72 20 2a 70 56 65 63 74 6f  xpr(Expr *pVecto
33e0: 72 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73  r, int i){.  ass
33f0: 65 72 74 28 20 69 3c 73 71 6c 69 74 65 33 45 78  ert( i<sqlite3Ex
3400: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 56 65  prVectorSize(pVe
3410: 63 74 6f 72 29 20 29 3b 0a 20 20 69 66 28 20 73  ctor) );.  if( s
3420: 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
3430: 6f 72 28 70 56 65 63 74 6f 72 29 20 29 7b 0a 20  or(pVector) ){. 
3440: 20 20 20 61 73 73 65 72 74 28 20 70 56 65 63 74     assert( pVect
3450: 6f 72 2d 3e 6f 70 32 3d 3d 30 20 7c 7c 20 70 56  or->op2==0 || pV
3460: 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  ector->op==TK_RE
3470: 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 69 66  GISTER );.    if
3480: 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  ( pVector->op==T
3490: 4b 5f 53 45 4c 45 43 54 20 7c 7c 20 70 56 65 63  K_SELECT || pVec
34a0: 74 6f 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c  tor->op2==TK_SEL
34b0: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ECT ){.      ret
34c0: 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70  urn pVector->x.p
34d0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
34e0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
34f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
3500: 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70  urn pVector->x.p
3510: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
3520: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
3530: 74 75 72 6e 20 70 56 65 63 74 6f 72 3b 0a 7d 0a  turn pVector;.}.
3540: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
3550: 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20  nd return a new 
3560: 45 78 70 72 20 6f 62 6a 65 63 74 20 77 68 69 63  Expr object whic
3570: 68 20 77 68 65 6e 20 70 61 73 73 65 64 20 74 6f  h when passed to
3580: 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43  .** sqlite3ExprC
3590: 6f 64 65 28 29 20 77 69 6c 6c 20 67 65 6e 65 72  ode() will gener
35a0: 61 74 65 20 61 6c 6c 20 6e 65 63 65 73 73 61 72  ate all necessar
35b0: 79 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74  y code to comput
35c0: 65 0a 2a 2a 20 74 68 65 20 69 46 69 65 6c 64 2d  e.** the iField-
35d0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
35e0: 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69   vector expressi
35f0: 6f 6e 20 70 56 65 63 74 6f 72 2e 0a 2a 2a 0a 2a  on pVector..**.*
3600: 2a 20 49 74 20 69 73 20 6f 6b 20 66 6f 72 20 70  * It is ok for p
3610: 56 65 63 74 6f 72 20 74 6f 20 62 65 20 61 20 73  Vector to be a s
3620: 63 61 6c 61 72 20 28 61 73 20 6c 6f 6e 67 20 61  calar (as long a
3630: 73 20 69 46 69 65 6c 64 3d 3d 30 29 2e 20 20 0a  s iField==0).  .
3640: 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  ** In that case,
3650: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   this routine wo
3660: 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 33  rks like sqlite3
3670: 45 78 70 72 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a  ExprDup()..**.**
3680: 20 54 68 65 20 63 61 6c 6c 65 72 20 6f 77 6e 73   The caller owns
3690: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45 78   the returned Ex
36a0: 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 73  pr object and is
36b0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
36c0: 0a 2a 2a 20 65 6e 73 75 72 69 6e 67 20 74 68 61  .** ensuring tha
36d0: 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  t the returned v
36e0: 61 6c 75 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  alue eventually 
36f0: 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  gets freed..**.*
3700: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 72 65 74  * The caller ret
3710: 61 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f  ains ownership o
3720: 66 20 70 56 65 63 74 6f 72 2e 20 20 49 66 20 70  f pVector.  If p
3730: 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53  Vector is a TK_S
3740: 45 4c 45 43 54 2c 0a 2a 2a 20 74 68 65 6e 20 74  ELECT,.** then t
3750: 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65  he returned obje
3760: 63 74 20 77 69 6c 6c 20 72 65 66 65 72 65 6e 63  ct will referenc
3770: 65 20 70 56 65 63 74 6f 72 20 61 6e 64 20 73 6f  e pVector and so
3780: 20 70 56 65 63 74 6f 72 20 6d 75 73 74 20 72 65   pVector must re
3790: 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69 64 20 66 6f  main.** valid fo
37a0: 72 20 74 68 65 20 6c 69 66 65 20 6f 66 20 74 68  r the life of th
37b0: 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63  e returned objec
37c0: 74 2e 20 20 49 66 20 70 56 65 63 74 6f 72 20 69  t.  If pVector i
37d0: 73 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  s a TK_VECTOR.**
37e0: 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70   or a scalar exp
37f0: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 69 74  ression, then it
3800: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 20   can be deleted 
3810: 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 69 73 20  as soon as this 
3820: 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
3830: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 69 63  ns..**.** A tric
3840: 6b 20 74 6f 20 63 61 75 73 65 20 61 20 54 4b 5f  k to cause a TK_
3850: 53 45 4c 45 43 54 20 70 56 65 63 74 6f 72 20 74  SELECT pVector t
3860: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 74 6f 67  o be deleted tog
3870: 65 74 68 65 72 20 77 69 74 68 0a 2a 2a 20 74 68  ether with.** th
3880: 65 20 72 65 74 75 72 6e 65 64 20 45 78 70 72 20  e returned Expr 
3890: 6f 62 6a 65 63 74 20 69 73 20 74 6f 20 61 74 74  object is to att
38a0: 61 63 68 20 74 68 65 20 70 56 65 63 74 6f 72 20  ach the pVector 
38b0: 74 6f 20 74 68 65 20 70 52 69 67 68 74 20 66 69  to the pRight fi
38c0: 65 6c 64 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65  eld.** of the re
38d0: 74 75 72 6e 65 64 20 54 4b 5f 53 45 4c 45 43 54  turned TK_SELECT
38e0: 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6f 62 6a  _COLUMN Expr obj
38f0: 65 63 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ect..*/.Expr *sq
3900: 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63 74  lite3ExprForVect
3910: 6f 72 46 69 65 6c 64 28 0a 20 20 50 61 72 73 65  orField(.  Parse
3920: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3930: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
3940: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56  xt */.  Expr *pV
3950: 65 63 74 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20  ector,       /* 
3960: 54 68 65 20 76 65 63 74 6f 72 2e 20 20 4c 69 73  The vector.  Lis
3970: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
3980: 20 6f 72 20 61 20 73 75 62 2d 53 45 4c 45 43 54   or a sub-SELECT
3990: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64   */.  int iField
39a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
39b0: 69 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ich column of th
39c0: 65 20 76 65 63 74 6f 72 20 74 6f 20 72 65 74 75  e vector to retu
39d0: 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  rn */.){.  Expr 
39e0: 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 56 65  *pRet;.  if( pVe
39f0: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  ctor->op==TK_SEL
3a00: 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ECT ){.    asser
3a10: 74 28 20 70 56 65 63 74 6f 72 2d 3e 66 6c 61 67  t( pVector->flag
3a20: 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
3a30: 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 54   );.    /* The T
3a40: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
3a50: 45 78 70 72 20 6e 6f 64 65 3a 0a 20 20 20 20 2a  Expr node:.    *
3a60: 2a 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 3a 20  *.    ** pLeft: 
3a70: 20 20 20 20 20 20 20 20 20 20 70 56 65 63 74 6f            pVecto
3a80: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 54 4b 5f  r containing TK_
3a90: 53 45 4c 45 43 54 2e 20 20 4e 6f 74 20 64 65 6c  SELECT.  Not del
3aa0: 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 70 52 69  eted..    ** pRi
3ab0: 67 68 74 3a 20 20 20 20 20 20 20 20 20 20 6e 6f  ght:          no
3ac0: 74 20 75 73 65 64 2e 20 20 42 75 74 20 72 65 63  t used.  But rec
3ad0: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 64  ursively deleted
3ae0: 2e 0a 20 20 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e  ..    ** iColumn
3af0: 3a 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  :         Index 
3b00: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  of a column in p
3b10: 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 69 54  Vector.    ** iT
3b20: 61 62 6c 65 3a 20 20 20 20 20 20 20 20 20 20 30  able:          0
3b30: 20 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   or the number o
3b40: 66 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68 65  f columns on the
3b50: 20 4c 48 53 20 6f 66 20 61 6e 20 61 73 73 69 67   LHS of an assig
3b60: 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 70 4c 65  nment.    ** pLe
3b70: 66 74 2d 3e 69 54 61 62 6c 65 3a 20 20 20 46 69  ft->iTable:   Fi
3b80: 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rst in an array 
3b90: 6f 66 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  of register hold
3ba0: 69 6e 67 20 72 65 73 75 6c 74 2c 20 6f 72 20 30  ing result, or 0
3bb0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
3bc0: 20 20 20 20 20 20 20 20 20 69 66 20 74 68 65 20           if the 
3bd0: 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 79 65  result is not ye
3be0: 74 20 63 6f 6d 70 75 74 65 64 2e 0a 20 20 20 20  t computed..    
3bf0: 2a 2a 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  **.    ** sqlite
3c00: 33 45 78 70 72 44 65 6c 65 74 65 28 29 20 73 70  3ExprDelete() sp
3c10: 65 63 69 66 69 63 61 6c 6c 79 20 73 6b 69 70 73  ecifically skips
3c20: 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 64   the recursive d
3c30: 65 6c 65 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20  elete of.    ** 
3c40: 70 4c 65 66 74 20 6f 6e 20 54 4b 5f 53 45 4c 45  pLeft on TK_SELE
3c50: 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e  CT_COLUMN nodes.
3c60: 20 20 42 75 74 20 70 52 69 67 68 74 20 69 73 20    But pRight is 
3c70: 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f 20 70 56 65  followed, so pVe
3c80: 63 74 6f 72 0a 20 20 20 20 2a 2a 20 63 61 6e 20  ctor.    ** can 
3c90: 62 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 70  be attached to p
3ca0: 52 69 67 68 74 20 74 6f 20 63 61 75 73 65 20 74  Right to cause t
3cb0: 68 69 73 20 6e 6f 64 65 20 74 6f 20 74 61 6b 65  his node to take
3cc0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 0a 20 20   ownership of.  
3cd0: 20 20 2a 2a 20 70 56 65 63 74 6f 72 2e 20 20 54    ** pVector.  T
3ce0: 79 70 69 63 61 6c 6c 79 20 74 68 65 72 65 20 77  ypically there w
3cf0: 69 6c 6c 20 62 65 20 6d 75 6c 74 69 70 6c 65 20  ill be multiple 
3d00: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
3d10: 20 6e 6f 64 65 73 0a 20 20 20 20 2a 2a 20 77 69   nodes.    ** wi
3d20: 74 68 20 74 68 65 20 73 61 6d 65 20 70 4c 65 66  th the same pLef
3d30: 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  t pointer to the
3d40: 20 70 56 65 63 74 6f 72 2c 20 62 75 74 20 6f 6e   pVector, but on
3d50: 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 20  ly one of them. 
3d60: 20 20 20 2a 2a 20 77 69 6c 6c 20 6f 77 6e 20 74     ** will own t
3d70: 68 65 20 70 56 65 63 74 6f 72 2e 0a 20 20 20 20  he pVector..    
3d80: 2a 2f 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  */.    pRet = sq
3d90: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
3da0: 65 2c 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  e, TK_SELECT_COL
3db0: 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  UMN, 0, 0);.    
3dc0: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
3dd0: 20 20 70 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20    pRet->iColumn 
3de0: 3d 20 69 46 69 65 6c 64 3b 0a 20 20 20 20 20 20  = iField;.      
3df0: 70 52 65 74 2d 3e 70 4c 65 66 74 20 3d 20 70 56  pRet->pLeft = pV
3e00: 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  ector;.    }.   
3e10: 20 61 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30   assert( pRet==0
3e20: 20 7c 7c 20 70 52 65 74 2d 3e 69 54 61 62 6c 65   || pRet->iTable
3e30: 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==0 );.  }else{.
3e40: 20 20 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d      if( pVector-
3e50: 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29  >op==TK_VECTOR )
3e60: 20 70 56 65 63 74 6f 72 20 3d 20 70 56 65 63 74   pVector = pVect
3e70: 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  or->x.pList->a[i
3e80: 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20  Field].pExpr;.  
3e90: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
3ea0: 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
3eb0: 64 62 2c 20 70 56 65 63 74 6f 72 2c 20 30 29 3b  db, pVector, 0);
3ec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61  .    sqlite3Rena
3ed0: 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61  meTokenRemap(pPa
3ee0: 72 73 65 2c 20 70 52 65 74 2c 20 70 56 65 63 74  rse, pRet, pVect
3ef0: 6f 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  or);.  }.  retur
3f00: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
3f10: 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   If expression p
3f20: 45 78 70 72 20 69 73 20 6f 66 20 74 79 70 65 20  Expr is of type 
3f30: 54 4b 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65 72  TK_SELECT, gener
3f40: 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
3f50: 75 61 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74 75  uate.** it. Retu
3f60: 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
3f70: 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 73  in which the res
3f80: 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 28 6f  ult is stored (o
3f90: 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75  r, if the .** su
3fa0: 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
3fb0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
3fc0: 6f 6c 75 6d 6e 2c 20 74 68 65 20 66 69 72 73 74  olumn, the first
3fd0: 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20   in an array.** 
3fe0: 6f 66 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  of registers in 
3ff0: 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c 74  which the result
4000: 20 69 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a   is stored)..**.
4010: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 6e  ** If pExpr is n
4020: 6f 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65  ot a TK_SELECT e
4030: 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72  xpression, retur
4040: 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
4050: 6e 74 20 65 78 70 72 43 6f 64 65 53 75 62 73 65  nt exprCodeSubse
4060: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
4070: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
4080: 7b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 30 3b  {.  int reg = 0;
4090: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
40a0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
40b0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
40c0: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
40d0: 72 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  reg = sqlite3Cod
40e0: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
40f0: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 23  e, pExpr);.  }.#
4100: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
4110: 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  eg;.}../*.** Arg
4120: 75 6d 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f  ument pVector po
4130: 69 6e 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72  ints to a vector
4140: 20 65 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69   expression - ei
4150: 74 68 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52  ther a TK_VECTOR
4160: 0a 2a 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54  .** or TK_SELECT
4170: 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f   that returns mo
4180: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75  re than one colu
4190: 6d 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  mn. This functio
41a0: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  n returns.** the
41b0: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
41c0: 20 6f 66 20 61 20 72 65 67 69 73 74 65 72 20 74   of a register t
41d0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
41e0: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65   value of.** ele
41f0: 6d 65 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74  ment iField of t
4200: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  he vector..**.**
4210: 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61   If pVector is a
4220: 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65   TK_SELECT expre
4230: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65  ssion, then code
4240: 20 66 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76   for it must hav
4250: 65 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65  e .** already be
4260: 65 6e 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  en generated usi
4270: 6e 67 20 74 68 65 20 65 78 70 72 43 6f 64 65 53  ng the exprCodeS
4280: 75 62 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69  ubselect() routi
4290: 6e 65 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63  ne. In this.** c
42a0: 61 73 65 20 70 61 72 61 6d 65 74 65 72 20 72 65  ase parameter re
42b0: 67 53 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62  gSelect should b
42c0: 65 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  e the first in a
42d0: 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
42e0: 74 65 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ters.** containi
42f0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
4300: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
4310: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63  . .**.** If pVec
4320: 74 6f 72 20 69 73 20 6f 66 20 74 79 70 65 20 54  tor is of type T
4330: 4b 5f 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63  K_VECTOR, then c
4340: 6f 64 65 20 66 6f 72 20 74 68 65 20 72 65 71 75  ode for the requ
4350: 65 73 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69  ested field.** i
4360: 73 20 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20  s generated. In 
4370: 74 68 69 73 20 63 61 73 65 20 28 2a 70 52 65 67  this case (*pReg
4380: 46 72 65 65 29 20 6d 61 79 20 62 65 20 73 65 74  Free) may be set
4390: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
43a0: 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  f.** a temporary
43b0: 20 72 65 67 69 73 74 65 72 20 74 6f 20 62 65 20   register to be 
43c0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
43d0: 6c 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72  ler before retur
43e0: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  ning..**.** Befo
43f0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75  re returning, ou
4400: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 28  tput parameter (
4410: 2a 70 70 45 78 70 72 29 20 69 73 20 73 65 74 20  *ppExpr) is set 
4420: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a  to point to the.
4430: 2a 2a 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63  ** Expr object c
4440: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
4450: 65 6c 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66  element iElem of
4460: 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a   the vector..*/.
4470: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 56  static int exprV
4480: 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20  ectorRegister(. 
4490: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44b0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
44c0: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65  t */.  Expr *pVe
44d0: 63 74 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  ctor,           
44e0: 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72         /* Vector
44f0: 20 74 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d   to extract elem
4500: 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ent from */.  in
4510: 74 20 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20  t iField,       
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4530: 20 46 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63   Field to extrac
4540: 74 20 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a  t from pVector *
4550: 2f 0a 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63  /.  int regSelec
4560: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
4570: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20      /* First in 
4580: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
4590: 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70  rs */.  Expr **p
45a0: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
45b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
45c0: 45 78 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65  Expression eleme
45d0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nt */.  int *pRe
45e0: 67 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20  gFree           
45f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
4600: 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f  Temp register to
4610: 20 66 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38   free */.){.  u8
4620: 20 6f 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f   op = pVector->o
4630: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  p;.  assert( op=
4640: 3d 54 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70  =TK_VECTOR || op
4650: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c  ==TK_REGISTER ||
4660: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
4670: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
4680: 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a  EGISTER ){.    *
4690: 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ppExpr = sqlite3
46a0: 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
46b0: 70 72 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65  pr(pVector, iFie
46c0: 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ld);.    return 
46d0: 70 56 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b  pVector->iTable+
46e0: 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66  iField;.  }.  if
46f0: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
4700: 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d  ){.    *ppExpr =
4710: 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c   pVector->x.pSel
4720: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  ect->pEList->a[i
4730: 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20  Field].pExpr;.  
4740: 20 20 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c     return regSel
4750: 65 63 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a  ect+iField;.  }.
4760: 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63    *ppExpr = pVec
4770: 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  tor->x.pList->a[
4780: 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20  iField].pExpr;. 
4790: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
47a0: 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
47b0: 73 65 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65  se, *ppExpr, pRe
47c0: 67 46 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gFree);.}../*.**
47d0: 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   Expression pExp
47e0: 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f  r is a compariso
47f0: 6e 20 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65  n between two ve
4800: 63 74 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d  ctor values. Com
4810: 70 75 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75  pute.** the resu
4820: 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  lt of the compar
4830: 69 73 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e  ison (1, 0, or N
4840: 55 4c 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74  ULL) and write t
4850: 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  hat.** result in
4860: 74 6f 20 72 65 67 69 73 74 65 72 20 64 65 73 74  to register dest
4870: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
4880: 65 72 20 6d 75 73 74 20 73 61 74 69 73 66 79 20  er must satisfy 
4890: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  the following pr
48a0: 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a  econditions:.**.
48b0: 2a 2a 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e  **    if pExpr->
48c0: 6f 70 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20  op==TK_IS:      
48d0: 6f 70 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35  op==TK_EQ and p5
48e0: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a  ==SQLITE_NULLEQ.
48f0: 2a 2a 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e  **    if pExpr->
4900: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20  op==TK_ISNOT:   
4910: 6f 70 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35  op==TK_NE and p5
4920: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a  ==SQLITE_NULLEQ.
4930: 2a 2a 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a  **    otherwise:
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4950: 6f 70 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e  op==pExpr->op an
4960: 64 20 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69  d p5==0.*/.stati
4970: 63 20 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f  c void codeVecto
4980: 72 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  rCompare(.  Pars
4990: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
49a0: 20 20 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61    /* Code genera
49b0: 74 6f 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  tor context */. 
49c0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
49d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
49e0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
49f0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
4a00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4a10: 20 57 72 69 74 65 20 72 65 73 75 6c 74 73 20 69   Write results i
4a20: 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65  nto this registe
4a30: 72 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20  r */.  u8 op,   
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4a50: 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  Comparison opera
4a60: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20  tor */.  u8 p5  
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4a80: 2a 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20  * SQLITE_NULLEQ 
4a90: 6f 72 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20  or zero */.){.  
4aa0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
4ab0: 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20  ->pVdbe;.  Expr 
4ac0: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
4ad0: 70 4c 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70  pLeft;.  Expr *p
4ae0: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
4af0: 52 69 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65  Right;.  int nLe
4b00: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
4b10: 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
4b20: 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  );.  int i;.  in
4b30: 74 20 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20  t regLeft = 0;. 
4b40: 20 69 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20   int regRight = 
4b50: 30 3b 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70  0;.  u8 opx = op
4b60: 3b 0a 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65  ;.  int addrDone
4b70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
4b80: 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
4b90: 0a 0a 20 20 69 66 28 20 6e 4c 65 66 74 21 3d 73  ..  if( nLeft!=s
4ba0: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
4bb0: 53 69 7a 65 28 70 52 69 67 68 74 29 20 29 7b 0a  Size(pRight) ){.
4bc0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4bd0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77  Msg(pParse, "row
4be0: 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29   value misused")
4bf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
4c00: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  }.  assert( pExp
4c10: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20  r->op==TK_EQ || 
4c20: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
4c30: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70   .       || pExp
4c40: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20  r->op==TK_IS || 
4c50: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4c60: 4e 4f 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  NOT .       || p
4c70: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
4c80: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4c90: 5f 47 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  _GT .       || p
4ca0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
4cb0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4cc0: 5f 47 45 20 0a 20 20 29 3b 0a 20 20 61 73 73 65  _GE .  );.  asse
4cd0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f  rt( pExpr->op==o
4ce0: 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d  p || (pExpr->op=
4cf0: 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d 3d 54 4b  =TK_IS && op==TK
4d00: 5f 45 51 29 0a 20 20 20 20 20 20 20 20 20 20 20  _EQ).           
4d10: 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d   || (pExpr->op==
4d20: 54 4b 5f 49 53 4e 4f 54 20 26 26 20 6f 70 3d 3d  TK_ISNOT && op==
4d30: 54 4b 5f 4e 45 29 20 29 3b 0a 20 20 61 73 73 65  TK_NE) );.  asse
4d40: 72 74 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78  rt( p5==0 || pEx
4d50: 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20  pr->op!=op );.  
4d60: 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51 4c 49  assert( p5==SQLI
4d70: 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78  TE_NULLEQ || pEx
4d80: 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20  pr->op==op );.. 
4d90: 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 53 54   p5 |= SQLITE_ST
4da0: 4f 52 45 50 32 3b 0a 20 20 69 66 28 20 6f 70 78  OREP2;.  if( opx
4db0: 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70 78 20 3d 20  ==TK_LE ) opx = 
4dc0: 54 4b 5f 4c 54 3b 0a 20 20 69 66 28 20 6f 70 78  TK_LT;.  if( opx
4dd0: 3d 3d 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20  ==TK_GE ) opx = 
4de0: 54 4b 5f 47 54 3b 0a 0a 20 20 72 65 67 4c 65 66  TK_GT;..  regLef
4df0: 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73  t = exprCodeSubs
4e00: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c  elect(pParse, pL
4e10: 65 66 74 29 3b 0a 20 20 72 65 67 52 69 67 68 74  eft);.  regRight
4e20: 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73 65   = exprCodeSubse
4e30: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 52 69  lect(pParse, pRi
4e40: 67 68 74 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  ght);..  for(i=0
4e50: 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65 78 69 74 73  ; 1 /*Loop exits
4e60: 20 62 79 20 22 62 72 65 61 6b 22 2a 2f 3b 20 69   by "break"*/; i
4e70: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  ++){.    int reg
4e80: 46 72 65 65 31 20 3d 20 30 2c 20 72 65 67 46 72  Free1 = 0, regFr
4e90: 65 65 32 20 3d 20 30 3b 0a 20 20 20 20 45 78 70  ee2 = 0;.    Exp
4ea0: 72 20 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20  r *pL, *pR; .   
4eb0: 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20   int r1, r2;.   
4ec0: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
4ed0: 20 69 3c 6e 4c 65 66 74 20 29 3b 0a 20 20 20 20   i<nLeft );.    
4ee0: 72 31 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52  r1 = exprVectorR
4ef0: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
4f00: 70 4c 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66  pLeft, i, regLef
4f10: 74 2c 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65  t, &pL, &regFree
4f20: 31 29 3b 0a 20 20 20 20 72 32 20 3d 20 65 78 70  1);.    r2 = exp
4f30: 72 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28  rVectorRegister(
4f40: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
4f50: 69 2c 20 72 65 67 52 69 67 68 74 2c 20 26 70 52  i, regRight, &pR
4f60: 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
4f70: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
4f80: 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f 70  arse, pL, pR, op
4f90: 78 2c 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c  x, r1, r2, dest,
4fa0: 20 70 35 29 3b 0a 20 20 20 20 74 65 73 74 63 61   p5);.    testca
4fb0: 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
4fc0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4fd0: 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
4fe0: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4ff0: 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
5000: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
5010: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
5020: 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
5030: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
5040: 4f 50 5f 47 74 29 3b 0a 20 20 20 20 74 65 73 74  OP_Gt);.    test
5050: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
5060: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
5070: 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
5080: 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f    testcase(op==O
5090: 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Eq); VdbeCover
50a0: 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45  ageIf(v,op==OP_E
50b0: 71 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  q);.    testcase
50c0: 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
50d0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
50e0: 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71  ==OP_Ne);.    sq
50f0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5100: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
5110: 72 65 65 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ree1);.    sqlit
5120: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
5130: 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
5140: 32 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  2);.    if( i==n
5150: 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20  Left-1 ){.      
5160: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5170: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20   if( opx==TK_EQ 
5180: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5190: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
51a0: 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64  _IfNot, dest, ad
51b0: 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76  drDone); VdbeCov
51c0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
51d0: 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45  p5 |= SQLITE_KEE
51e0: 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  PNULL;.    }else
51f0: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20   if( opx==TK_NE 
5200: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5210: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5220: 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44  _If, dest, addrD
5230: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
5240: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20  ge(v);.      p5 
5250: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
5260: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
5270: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d       assert( op=
5280: 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b  =TK_LT || op==TK
5290: 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45  _GT || op==TK_LE
52a0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b   || op==TK_GE );
52b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
52c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45  beAddOp2(v, OP_E
52d0: 6c 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64  lseNotEq, 0, add
52e0: 72 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  rDone);.      Vd
52f0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
5300: 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20  op==TK_LT);.    
5310: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
5320: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a  (v, op==TK_GT);.
5330: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
5340: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
5350: 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  E);.      VdbeCo
5360: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
5370: 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66  TK_GE);.      if
5380: 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f  ( i==nLeft-2 ) o
5390: 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20  px = op;.    }. 
53a0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
53b0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
53c0: 61 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69  addrDone);.}..#i
53d0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
53e0: 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20  R_DEPTH>0./*.** 
53f0: 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d  Check that argum
5400: 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c  ent nHeight is l
5410: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
5420: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
5430: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
5440: 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66  epth allowed. If
5450: 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76   it is not, leav
5460: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
5470: 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e  ge in.** pParse.
5480: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
5490: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50  xprCheckHeight(P
54a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
54b0: 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e  t nHeight){.  in
54c0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
54d0: 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74  ;.  int mxHeight
54e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
54f0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5500: 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a  IT_EXPR_DEPTH];.
5510: 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78    if( nHeight>mx
5520: 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  Height ){.    sq
5530: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5540: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45  arse, .       "E
5550: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69  xpression tree i
5560: 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78  s too large (max
5570: 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c  imum depth %d)",
5580: 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b   mxHeight.    );
5590: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
55a0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
55b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
55c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
55d0: 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65  ee functions, he
55e0: 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65  ightOfExpr(), he
55f0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29  ightOfExprList()
5600: 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66  .** and heightOf
5610: 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73  Select(), are us
5620: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
5630: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5640: 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70  ht.** of any exp
5650: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5660: 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73  erenced by the s
5670: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
5680: 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  as the.** first 
5690: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
56a0: 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20  If this maximum 
56b0: 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65  height is greate
56c0: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
56d0: 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64  nt value pointed
56e0: 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67  .** to by pnHeig
56f0: 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70  ht, the second p
5700: 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73  arameter, then s
5710: 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20  et *pnHeight to 
5720: 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  that.** value..*
5730: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
5740: 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20  ightOfExpr(Expr 
5750: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
5760: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
5770: 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68     if( p->nHeigh
5780: 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20  t>*pnHeight ){. 
5790: 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d       *pnHeight =
57a0: 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20   p->nHeight;.   
57b0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
57c0: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
57d0: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
57e0: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
57f0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5800: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
5810: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
5820: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65  ; i++){.      he
5830: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b  ightOfExpr(p->a[
5840: 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67  i].pExpr, pnHeig
5850: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ht);.    }.  }.}
5860: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5870: 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65  ghtOfSelect(Sele
5880: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74  ct *pSelect, int
5890: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53   *pnHeight){.  S
58a0: 65 6c 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28  elect *p;.  for(
58b0: 70 3d 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d  p=pSelect; p; p=
58c0: 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
58d0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
58e0: 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74  pWhere, pnHeight
58f0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
5900: 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
5910: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
5920: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5930: 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29  Limit, pnHeight)
5940: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5950: 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
5960: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5970: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5980: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70  t(p->pGroupBy, p
5990: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
59a0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
59b0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65  ->pOrderBy, pnHe
59c0: 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
59d0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
59e0: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
59f0: 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  e in the structu
5a00: 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  re passed as an 
5a10: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e  .** argument. An
5a20: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
5a30: 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78   no children, Ex
5a40: 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20  pr.pList or .** 
5a50: 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d  Expr.pSelect mem
5a60: 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74  ber has a height
5a70: 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72   of 1. Any other
5a80: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68   expression.** h
5a90: 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61  as a height equa
5aa0: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
5ab0: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f   height of any o
5ac0: 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ther .** referen
5ad0: 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e  ced Expr plus on
5ae0: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72  e..**.** Also pr
5af0: 6f 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61  opagate EP_Propa
5b00: 67 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72  gate flags up fr
5b10: 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  om Expr.x.pList 
5b20: 74 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a  to Expr.flags,.*
5b30: 2a 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65  * if appropriate
5b40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5b50: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45   exprSetHeight(E
5b60: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  xpr *p){.  int n
5b70: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
5b80: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5b90: 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  eft, &nHeight);.
5ba0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5bb0: 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67  ->pRight, &nHeig
5bc0: 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ht);.  if( ExprH
5bd0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5be0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
5bf0: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
5c00: 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  t(p->x.pSelect, 
5c10: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c  &nHeight);.  }el
5c20: 73 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73  se if( p->x.pLis
5c30: 74 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f  t ){.    heightO
5c40: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70  fExprList(p->x.p
5c50: 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  List, &nHeight);
5c60: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d  .    p->flags |=
5c70: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
5c80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
5c90: 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29  lags(p->x.pList)
5ca0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67  ;.  }.  p->nHeig
5cb0: 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31  ht = nHeight + 1
5cc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
5cd0: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
5ce0: 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74  variable using t
5cf0: 68 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74  he exprSetHeight
5d00: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a  () function. If.
5d10: 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73  ** the height is
5d20: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
5d30: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
5d40: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  d expression dep
5d50: 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  th,.** leave an 
5d60: 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
5d70: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
5d80: 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f  agate all EP_Pro
5d90: 70 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f  pagate flags fro
5da0: 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69  m the Expr.x.pLi
5db0: 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e  st into.** Expr.
5dc0: 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20  flags. .*/.void 
5dd0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
5de0: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72  ightAndFlags(Par
5df0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
5e00: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72   *p){.  if( pPar
5e10: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
5e20: 6e 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67  n;.  exprSetHeig
5e30: 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ht(p);.  sqlite3
5e40: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
5e50: 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67  pParse, p->nHeig
5e60: 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ht);.}../*.** Re
5e70: 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
5e80: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65   height of any e
5e90: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72  xpression tree r
5ea0: 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20  eferenced.** by 
5eb0: 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  the select state
5ec0: 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61  ment passed as a
5ed0: 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  n argument..*/.i
5ee0: 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
5ef0: 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63  ExprHeight(Selec
5f00: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  t *p){.  int nHe
5f10: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
5f20: 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e  htOfSelect(p, &n
5f30: 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72  Height);.  retur
5f40: 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c  n nHeight;.}.#el
5f50: 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65  se /* ABOVE:  He
5f60: 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74  ight enforcement
5f70: 20 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57   enabled.  BELOW
5f80: 3a 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65  : Height enforce
5f90: 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a  ment off */./*.*
5fa0: 2a 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20  * Propagate all 
5fb0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
5fc0: 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  gs from the Expr
5fd0: 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a  .x.pList into.**
5fe0: 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f   Expr.flags. .*/
5ff0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
6000: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
6010: 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  gs(Parse *pParse
6020: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
6030: 28 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73  ( p && p->x.pLis
6040: 74 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  t && !ExprHasPro
6050: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
6060: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d  elect) ){.    p-
6070: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f  >flags |= EP_Pro
6080: 70 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33  pagate & sqlite3
6090: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d  ExprListFlags(p-
60a0: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  >x.pList);.  }.}
60b0: 0a 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74  .#define exprSet
60c0: 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66  Height(y).#endif
60d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45   /* SQLITE_MAX_E
60e0: 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a  XPR_DEPTH>0 */..
60f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6100: 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61  ne is the core a
6110: 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70  llocator for Exp
6120: 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43  r nodes..**.** C
6130: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
6140: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61  xpression node a
6150: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
6160: 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f  ter to it.  Memo
6170: 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e  ry.** for this n
6180: 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20  ode and for the 
6190: 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20  pToken argument 
61a0: 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  is a single allo
61b0: 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e  cation.** obtain
61c0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
61d0: 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20  bMalloc().  The 
61e0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
61f0: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
6200: 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
6210: 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e  re the node even
6220: 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65  tually gets free
6230: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75  d..**.** If dequ
6240: 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ote is true, the
6250: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20  n the token (if 
6260: 69 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65  it exists) is de
6270: 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65  quoted..** If de
6280: 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20  quote is false, 
6290: 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20  no dequoting is 
62a0: 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20  performed.  The 
62b0: 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d  deQuote.** param
62c0: 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20  eter is ignored 
62d0: 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  if pToken is NUL
62e0: 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65  L or if the toke
62f0: 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70  n does not.** ap
6300: 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65  pear to be quote
6310: 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65  d.  If the quote
6320: 73 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f  s were of the fo
6330: 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65  rm "..." (double
6340: 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e  -quotes).** then
6350: 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65   the EP_DblQuote
6360: 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e  d flag is set on
6370: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6380: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63  node..**.** Spec
6390: 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70  ial case:  If op
63a0: 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64  ==TK_INTEGER and
63b0: 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74   pToken points t
63c0: 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a  o a string that.
63d0: 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c  ** can be transl
63e0: 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62  ated into a 32-b
63f0: 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  it integer, then
6400: 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f   the token is no
6410: 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75  t.** stored in u
6420: 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61  .zToken.  Instea
6430: 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  d, the integer v
6440: 61 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e  alues is written
6450: 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75  .** into u.iValu
6460: 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74  e and the EP_Int
6470: 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65  Value flag is se
6480: 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f  t.  No extra sto
6490: 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63  rage.** is alloc
64a0: 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
64b0: 20 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e   integer text an
64c0: 64 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c  d the dequote fl
64d0: 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ag is ignored..*
64e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
64f0: 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69  xprAlloc(.  sqli
6500: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
6510: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
6520: 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  r sqlite3DbMallo
6530: 63 52 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e  cRawNN() */.  in
6540: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
6550: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6560: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6570: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
6580: 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  ken,    /* Token
6590: 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68   argument.  Migh
65a0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  t be NULL */.  i
65b0: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
65c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
65d0: 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a  o dequote */.){.
65e0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
65f0: 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  int nExtra = 0;.
6600: 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30    int iValue = 0
6610: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
6620: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b  =0 );.  if( pTok
6630: 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70  en ){.    if( op
6640: 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20  !=TK_INTEGER || 
6650: 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20  pToken->z==0.   
6660: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
6670: 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e  3GetInt32(pToken
6680: 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30  ->z, &iValue)==0
6690: 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   ){.      nExtra
66a0: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a   = pToken->n+1;.
66b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 56        assert( iV
66c0: 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d  alue>=0 );.    }
66d0: 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71  .  }.  pNew = sq
66e0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
66f0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  NN(db, sizeof(Ex
6700: 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69  pr)+nExtra);.  i
6710: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d  f( pNew ){.    m
6720: 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
6730: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
6740: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38    pNew->op = (u8
6750: 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  )op;.    pNew->i
6760: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66  Agg = -1;.    if
6770: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
6780: 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20    if( nExtra==0 
6790: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
67a0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
67b0: 56 61 6c 75 65 7c 45 50 5f 4c 65 61 66 7c 28 69  Value|EP_Leaf|(i
67c0: 56 61 6c 75 65 3f 45 50 5f 49 73 54 72 75 65 3a  Value?EP_IsTrue:
67d0: 45 50 5f 49 73 46 61 6c 73 65 29 3b 0a 20 20 20  EP_IsFalse);.   
67e0: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61       pNew->u.iVa
67f0: 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20  lue = iValue;.  
6800: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6810: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
6820: 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  n = (char*)&pNew
6830: 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  [1];.        ass
6840: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d  ert( pToken->z!=
6850: 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d  0 || pToken->n==
6860: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
6870: 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d   pToken->n ) mem
6880: 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  cpy(pNew->u.zTok
6890: 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  en, pToken->z, p
68a0: 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20  Token->n);.     
68b0: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
68c0: 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30  n[pToken->n] = 0
68d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
68e0: 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33  quote && sqlite3
68f0: 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e  Isquote(pNew->u.
6900: 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20  zToken[0]) ){.  
6910: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
6920: 65 71 75 6f 74 65 45 78 70 72 28 70 4e 65 77 29  equoteExpr(pNew)
6930: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6940: 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53 51    }.    }.#if SQ
6950: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
6960: 50 54 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e  PTH>0.    pNew->
6970: 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e  nHeight = 1;.#en
6980: 64 69 66 20 20 0a 20 20 7d 0a 20 20 72 65 74 75  dif  .  }.  retu
6990: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
69a0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
69b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
69c0: 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72   from a zero-ter
69d0: 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74 68  minated token th
69e0: 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64  at has.** alread
69f0: 79 20 62 65 65 6e 20 64 65 71 75 6f 74 65 64 2e  y been dequoted.
6a00: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
6a10: 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  3Expr(.  sqlite3
6a20: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
6a30: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73   /* Handle for s
6a40: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
6a50: 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c  ro() (may be nul
6a60: 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  l) */.  int op, 
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a80: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70  /* Expression op
6a90: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
6aa0: 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20  char *zToken    
6ab0: 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d    /* Token argum
6ac0: 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e  ent.  Might be N
6ad0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65  ULL */.){.  Toke
6ae0: 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f  n x;.  x.z = zTo
6af0: 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 73 71 6c  ken;.  x.n = sql
6b00: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f  ite3Strlen30(zTo
6b10: 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  ken);.  return s
6b20: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
6b30: 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a  db, op, &x, 0);.
6b40: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20  }../*.** Attach 
6b50: 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61  subtrees pLeft a
6b60: 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65  nd pRight to the
6b70: 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74   Expr node pRoot
6b80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74  ..**.** If pRoot
6b90: 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
6ba0: 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20  s that a memory 
6bb0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
6bc0: 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a   has occurred..*
6bd0: 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  * In that case, 
6be0: 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72  delete the subtr
6bf0: 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ees pLeft and pR
6c00: 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ight..*/.void sq
6c10: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
6c20: 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74  ubtrees(.  sqlit
6c30: 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a  e3 *db,.  Expr *
6c40: 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70  pRoot,.  Expr *p
6c50: 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52  Left,.  Expr *pR
6c60: 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52  ight.){.  if( pR
6c70: 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  oot==0 ){.    as
6c80: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
6c90: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
6ca0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6cb0: 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  db, pLeft);.    
6cc0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6cd0: 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  e(db, pRight);. 
6ce0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
6cf0: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
6d00: 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20  pRoot->pRight = 
6d10: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52  pRight;.      pR
6d20: 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  oot->flags |= EP
6d30: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 52 69  _Propagate & pRi
6d40: 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  ght->flags;.    
6d50: 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20  }.    if( pLeft 
6d60: 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  ){.      pRoot->
6d70: 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20  pLeft = pLeft;. 
6d80: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67       pRoot->flag
6d90: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
6da0: 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  e & pLeft->flags
6db0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72  ;.    }.    expr
6dc0: 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29  SetHeight(pRoot)
6dd0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
6de0: 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20  llocate an Expr 
6df0: 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73  node which joins
6e00: 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20   as many as two 
6e10: 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20  subtrees..**.** 
6e20: 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  One or both of t
6e30: 68 65 20 73 75 62 74 72 65 65 73 20 63 61 6e 20  he subtrees can 
6e40: 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e  be NULL.  Return
6e50: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
6e60: 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f  e new.** Expr no
6e70: 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f  de.  Or, if an O
6e80: 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
6e90: 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d   set pParse->db-
6ea0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a  >mallocFailed,.*
6eb0: 2a 20 66 72 65 65 20 74 68 65 20 73 75 62 74 72  * free the subtr
6ec0: 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ees and return N
6ed0: 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ULL..*/.Expr *sq
6ee0: 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61  lite3PExpr(.  Pa
6ef0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
6f00: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
6f10: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
6f20: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
6f30: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6f40: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6f50: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
6f60: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20          /* Left 
6f70: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
6f80: 72 20 2a 70 52 69 67 68 74 20 20 20 20 20 20 20  r *pRight       
6f90: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70       /* Right op
6fa0: 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78  erand */.){.  Ex
6fb0: 70 72 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  pr *p;.  p = sql
6fc0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
6fd0: 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  N(pParse->db, si
6fe0: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 69  zeof(Expr));.  i
6ff0: 66 28 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73  f( p ){.    mems
7000: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
7010: 45 78 70 72 29 29 3b 0a 20 20 20 20 70 2d 3e 6f  Expr));.    p->o
7020: 70 20 3d 20 6f 70 20 26 20 30 78 66 66 3b 0a 20  p = op & 0xff;. 
7030: 20 20 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b     p->iAgg = -1;
7040: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7050: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70  AttachSubtrees(p
7060: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c  Parse->db, p, pL
7070: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
7080: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
7090: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
70a0: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20   p->nHeight);.  
70b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
70c0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
70d0: 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74 29 3b  rse->db, pLeft);
70e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
70f0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
7100: 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  b, pRight);.  }.
7110: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
7120: 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74  *.** Add pSelect
7130: 20 74 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70   to the Expr.x.p
7140: 53 65 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f  Select field.  O
7150: 72 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 4e  r, if pExpr is N
7160: 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61  ULL (due.** do a
7170: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
7180: 6f 6e 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e  on failure) then
7190: 20 64 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c   delete the pSel
71a0: 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76  ect object..*/.v
71b0: 6f 69 64 20 73 71 6c 69 74 65 33 50 45 78 70 72  oid sqlite3PExpr
71c0: 41 64 64 53 65 6c 65 63 74 28 50 61 72 73 65 20  AddSelect(Parse 
71d0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
71e0: 45 78 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  Expr, Select *pS
71f0: 65 6c 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45  elect){.  if( pE
7200: 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72  xpr ){.    pExpr
7210: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53  ->x.pSelect = pS
7220: 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53  elect;.    ExprS
7230: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
7240: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45  , EP_xIsSelect|E
7250: 50 5f 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20  P_Subquery);.   
7260: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
7270: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50  eightAndFlags(pP
7280: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
7290: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
72a0: 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
72b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
72c0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
72d0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
72e0: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  b, pSelect);.  }
72f0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  .}.../*.** Join 
7300: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
7310: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
7320: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
7330: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
7340: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
7350: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
7360: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
7370: 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64  **.** If one sid
7380: 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
7390: 66 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f  f the AND is kno
73a0: 77 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20  wn to be false, 
73b0: 74 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20  then instead.** 
73c0: 6f 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  of returning an 
73d0: 41 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  AND expression, 
73e0: 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f  just return a co
73f0: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
7400: 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75  n with.** a valu
7410: 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45  e of false..*/.E
7420: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
7430: 41 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  And(Parse *pPars
7440: 65 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  e, Expr *pLeft, 
7450: 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20  Expr *pRight){. 
7460: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7470: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
7480: 20 70 4c 65 66 74 3d 3d 30 20 20 29 7b 0a 20 20   pLeft==0  ){.  
7490: 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b    return pRight;
74a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
74b0: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ght==0 ){.    re
74c0: 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65  turn pLeft;.  }e
74d0: 6c 73 65 20 69 66 28 20 45 78 70 72 41 6c 77 61  lse if( ExprAlwa
74e0: 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c  ysFalse(pLeft) |
74f0: 7c 20 45 78 70 72 41 6c 77 61 79 73 46 61 6c 73  | ExprAlwaysFals
7500: 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  e(pRight) ){.   
7510: 20 73 71 6c 69 74 65 33 45 78 70 72 55 6e 6d 61   sqlite3ExprUnma
7520: 70 41 6e 64 44 65 6c 65 74 65 28 70 50 61 72 73  pAndDelete(pPars
7530: 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  e, pLeft);.    s
7540: 71 6c 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41  qlite3ExprUnmapA
7550: 6e 64 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c  ndDelete(pParse,
7560: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
7570: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
7580: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
7590: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
75a0: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
75b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
75c0: 75 72 6e 20 73 71 6c 69 74 65 33 50 45 78 70 72  urn sqlite3PExpr
75d0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c  (pParse, TK_AND,
75e0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
75f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
7600: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
7610: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f  pression node fo
7620: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  r a function wit
7630: 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72  h multiple.** ar
7640: 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72  guments..*/.Expr
7650: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e   *sqlite3ExprFun
7660: 63 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a  ction(.  Parse *
7670: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
7680: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
7690: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
76a0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pList,      /* 
76b0: 41 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f  Argument list */
76c0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  .  Token *pToken
76d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
76e0: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
76f0: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 69 73 74 69   */.  int eDisti
7700: 6e 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53  nct         /* S
7710: 46 5f 44 69 73 74 69 6e 63 74 20 6f 72 20 53 46  F_Distinct or SF
7720: 5f 41 4c 4c 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a  _ALL or 0 */.){.
7730: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
7740: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7750: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
7760: 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20  rt( pToken );.  
7770: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
7780: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46  prAlloc(db, TK_F
7790: 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c  UNCTION, pToken,
77a0: 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d   1);.  if( pNew=
77b0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
77c0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
77d0: 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41  db, pList); /* A
77e0: 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  void memory leak
77f0: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
7800: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
7810: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   0;.  }.  if( pL
7820: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 45  ist && pList->nE
7830: 78 70 72 20 3e 20 70 50 61 72 73 65 2d 3e 64 62  xpr > pParse->db
7840: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
7850: 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
7860: 52 47 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  RG] ){.    sqlit
7870: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7880: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67  e, "too many arg
7890: 75 6d 65 6e 74 73 20 6f 6e 20 66 75 6e 63 74 69  uments on functi
78a0: 6f 6e 20 25 54 22 2c 20 70 54 6f 6b 65 6e 29 3b  on %T", pToken);
78b0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70  .  }.  pNew->x.p
78c0: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
78d0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
78e0: 70 4e 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63  pNew, EP_HasFunc
78f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  );.  assert( !Ex
7900: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
7910: 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  ew, EP_xIsSelect
7920: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ) );.  sqlite3Ex
7930: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
7940: 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ags(pParse, pNew
7950: 29 3b 0a 20 20 69 66 28 20 65 44 69 73 74 69 6e  );.  if( eDistin
7960: 63 74 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ct==SF_Distinct 
7970: 29 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74  ) ExprSetPropert
7980: 79 28 70 4e 65 77 2c 20 45 50 5f 44 69 73 74 69  y(pNew, EP_Disti
7990: 6e 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  nct);.  return p
79a0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  New;.}../*.** As
79b0: 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20  sign a variable 
79c0: 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70  number to an exp
79d0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63  ression that enc
79e0: 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a  odes a wildcard.
79f0: 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ** in the origin
7a00: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
7a10: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  .  .**.** Wildca
7a20: 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  rds consisting o
7a30: 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61  f a single "?" a
7a40: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
7a50: 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a  next sequential.
7a60: 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  ** variable numb
7a70: 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  er..**.** Wildca
7a80: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
7a90: 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67  "?nnn" are assig
7aa0: 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22  ned the number "
7ab0: 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a  nnn".  We make.*
7ac0: 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20  * sure "nnn" is 
7ad0: 6e 6f 74 20 74 6f 6f 20 62 69 67 20 74 6f 20 61  not too big to a
7ae0: 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66  void a denial of
7af0: 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20   service attack 
7b00: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  when.** the SQL 
7b10: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20  statement comes 
7b20: 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c  from an external
7b30: 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57   source..**.** W
7b40: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
7b50: 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61  form ":aaa", "@a
7b60: 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61  aa", or "$aaa" a
7b70: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
7b80: 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  same number.** a
7b90: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69  s the previous i
7ba0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73  nstance of the s
7bb0: 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f  ame wildcard.  O
7bc0: 72 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  r if this is the
7bd0: 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e   first.** instan
7be0: 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61  ce of the wildca
7bf0: 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71  rd, the next seq
7c00: 75 65 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65  uential variable
7c10: 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73   number is.** as
7c20: 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  signed..*/.void 
7c30: 73 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67  sqlite3ExprAssig
7c40: 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65  nVarNumber(Parse
7c50: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
7c60: 70 45 78 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20  pExpr, u32 n){. 
7c70: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7c80: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e  Parse->db;.  con
7c90: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e  st char *z;.  yn
7ca0: 56 61 72 20 78 3b 0a 0a 20 20 69 66 28 20 70 45  Var x;..  if( pE
7cb0: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
7cc0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
7cd0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
7ce0: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
7cf0: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
7d00: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
7d10: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
7d20: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
7d30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
7d40: 30 5d 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  0]!=0 );.  asser
7d50: 74 28 20 6e 3d 3d 28 75 33 32 29 73 71 6c 69 74  t( n==(u32)sqlit
7d60: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b  e3Strlen30(z) );
7d70: 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29  .  if( z[1]==0 )
7d80: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
7d90: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
7da0: 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e  ".  Assign the n
7db0: 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ext variable num
7dc0: 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ber */.    asser
7dd0: 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a  t( z[0]=='?' );.
7de0: 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28      x = (ynVar)(
7df0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b  ++pParse->nVar);
7e00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
7e10: 74 20 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20  t doAdd = 0;.   
7e20: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29   if( z[0]=='?' )
7e30: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
7e40: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
7e50: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
7e60: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
7e70: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a  eger and.      *
7e80: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
7e90: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7ea0: 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a  */.      i64 i;.
7eb0: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20        int bOk;. 
7ec0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b       if( n==2 ){
7ed0: 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d   /*OPTIMIZATION-
7ee0: 49 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20  IF-TRUE*/.      
7ef0: 20 20 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20    i = z[1]-'0'; 
7f00: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
7f10: 61 73 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20  ase of ?N for a 
7f20: 73 69 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a  single digit N *
7f30: 2f 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20  /.        bOk = 
7f40: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
7f50: 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d          bOk = 0=
7f60: 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26  =sqlite3Atoi64(&
7f70: 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53  z[1], &i, n-1, S
7f80: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
7f90: 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
7fa0: 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ase( i==0 );.   
7fb0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
7fc0: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
7fd0: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
7fe0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7ff0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
8000: 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
8010: 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69  case( i==db->aLi
8020: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8030: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
8040: 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ] );.      if( b
8050: 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20  Ok==0 || i<1 || 
8060: 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  i>db->aLimit[SQL
8070: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
8080: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
8090: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
80a0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
80b0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d  ariable number m
80c0: 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f  ust be between ?
80d0: 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20  1 and ?%d",.    
80e0: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d          db->aLim
80f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8100: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
8110: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
8120: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
8130: 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20   x = (ynVar)i;. 
8140: 20 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73       if( x>pPars
8150: 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20  e->nVar ){.     
8160: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20     pParse->nVar 
8170: 3d 20 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20  = (int)x;.      
8180: 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20    doAdd = 1;.   
8190: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
81a0: 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61  ite3VListNumToNa
81b0: 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  me(pParse->pVLis
81c0: 74 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, x)==0 ){.    
81d0: 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20      doAdd = 1;. 
81e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
81f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
8200: 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22  ards like ":aaa"
8210: 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61  , "$aaa" or "@aa
8220: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
8230: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
8240: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
8250: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
8260: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
8270: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
8280: 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68   name.      ** h
8290: 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65  as never appeare
82a0: 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20  d before, reuse 
82b0: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
82c0: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
82d0: 2f 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56  /.      x = (ynV
82e0: 61 72 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e  ar)sqlite3VListN
82f0: 61 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d  ameToNum(pParse-
8300: 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a  >pVList, z, n);.
8310: 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29        if( x==0 )
8320: 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 79  {.        x = (y
8330: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
8340: 6e 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64  nVar);.        d
8350: 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  oAdd = 1;.      
8360: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
8370: 64 6f 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70  doAdd ){.      p
8380: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20  Parse->pVList = 
8390: 73 71 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28  sqlite3VListAdd(
83a0: 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69  db, pParse->pVLi
83b0: 73 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20  st, z, n, x);.  
83c0: 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d    }.  }.  pExpr-
83d0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20  >iColumn = x;.  
83e0: 69 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74  if( x>db->aLimit
83f0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
8400: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
8410: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8420: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
8430: 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69  oo many SQL vari
8440: 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  ables");.  }.}..
8450: 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c  /*.** Recursivel
8460: 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72  y delete an expr
8470: 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
8480: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
8490: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69  INLINE void sqli
84a0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
84b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
84c0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
84d0: 20 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61   p!=0 );.  /* Sa
84e0: 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65  nity check: Asse
84f0: 72 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56  rt that the IntV
8500: 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  alue is non-nega
8510: 74 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74  tive if it exist
8520: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  s */.  assert( !
8530: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8540: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
8550: 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d  || p->u.iValue>=
8560: 30 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  0 );..  assert( 
8570: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
8580: 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20  (p, EP_WinFunc) 
8590: 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e 21 3d 30 20  || p->y.pWin!=0 
85a0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
85b0: 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  led );.  assert(
85c0: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54   p->op!=TK_FUNCT
85d0: 49 4f 4e 20 7c 7c 20 45 78 70 72 48 61 73 50 72  ION || ExprHasPr
85e0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
85f0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
8600: 64 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  d).          || 
8610: 70 2d 3e 79 2e 70 57 69 6e 3d 3d 30 20 7c 7c 20  p->y.pWin==0 || 
8620: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8630: 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  p, EP_WinFunc) )
8640: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
8650: 44 45 42 55 47 0a 20 20 69 66 28 20 45 78 70 72  DEBUG.  if( Expr
8660: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8670: 50 5f 4c 65 61 66 29 20 26 26 20 21 45 78 70 72  P_Leaf) && !Expr
8680: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8690: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
86a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
86b0: 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Left==0 );.    a
86c0: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
86d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
86e0: 74 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d  t( p->x.pSelect=
86f0: 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  =0 );.  }.#endif
8700: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
8710: 72 6f 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54  roperty(p, (EP_T
8720: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66  okenOnly|EP_Leaf
8730: 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  )) ){.    /* The
8740: 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73   Expr.x union is
8750: 20 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74   never used at t
8760: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
8770: 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20  Expr.pRight */. 
8780: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e     assert( p->x.
8790: 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pList==0 || p->p
87a0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
87b0: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20  if( p->pLeft && 
87c0: 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54  p->op!=TK_SELECT
87d0: 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65  _COLUMN ) sqlite
87e0: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62  3ExprDeleteNN(db
87f0: 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  , p->pLeft);.   
8800: 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29   if( p->pRight )
8810: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
8820: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
8830: 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20  (p, EP_WinFunc) 
8840: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8850: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8860: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20   p->pRight);.   
8870: 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48   }else if( ExprH
8880: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8890: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
88a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
88b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
88c0: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a   EP_WinFunc) );.
88d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
88e0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
88f0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
8900: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
8910: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8920: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  ete(db, p->x.pLi
8930: 73 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  st);.#ifndef SQL
8940: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
8950: 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45 78  UNC.      if( Ex
8960: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8970: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a   EP_WinFunc) ){.
8980: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
8990: 69 6e 64 6f 77 44 65 6c 65 74 65 28 64 62 2c 20  indowDelete(db, 
89a0: 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20 20  p->y.pWin);.    
89b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
89c0: 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48  .  }.  if( ExprH
89d0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
89e0: 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c  _MemToken) ) sql
89f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8a00: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69  ->u.zToken);.  i
8a10: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
8a20: 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63  rty(p, EP_Static
8a30: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
8a40: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
8a50: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
8a60: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71  te3ExprDelete(sq
8a70: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
8a80: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73  *p){.  if( p ) s
8a90: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8aa0: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  NN(db, p);.}../*
8ab0: 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 52   Invoke sqlite3R
8ac0: 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 29  enameExprUnmap()
8ad0: 20 61 6e 64 20 73 71 6c 69 74 65 33 45 78 70 72   and sqlite3Expr
8ae0: 44 65 6c 65 74 65 28 29 20 6f 6e 20 74 68 65 0a  Delete() on the.
8af0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ** expression..*
8b00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
8b10: 70 72 55 6e 6d 61 70 41 6e 64 44 65 6c 65 74 65  prUnmapAndDelete
8b20: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8b30: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
8b40: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f  p ){.    if( IN_
8b50: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
8b60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
8b70: 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50  nameExprUnmap(pP
8b80: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  arse, p);.    }.
8b90: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
8ba0: 65 6c 65 74 65 4e 4e 28 70 50 61 72 73 65 2d 3e  eleteNN(pParse->
8bb0: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  db, p);.  }.}../
8bc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
8bd0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
8be0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
8bf0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72  e expression str
8c00: 75 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65  ucture .** passe
8c10: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
8c20: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  rgument. This is
8c30: 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45   always one of E
8c40: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a  XPR_FULLSIZE,.**
8c50: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
8c60: 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  E or EXPR_TOKENO
8c70: 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74  NLYSIZE..*/.stat
8c80: 69 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63  ic int exprStruc
8c90: 74 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a  tSize(Expr *p){.
8ca0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
8cb0: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
8cc0: 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20  nOnly) ) return 
8cd0: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
8ce0: 5a 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  ZE;.  if( ExprHa
8cf0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8d00: 52 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72  Reduced) ) retur
8d10: 6e 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  n EXPR_REDUCEDSI
8d20: 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50  ZE;.  return EXP
8d30: 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f  R_FULLSIZE;.}../
8d40: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
8d50: 70 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e  pr*Size() routin
8d60: 65 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74  es each return t
8d70: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
8d80: 65 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74  es required.** t
8d90: 6f 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f  o store a copy o
8da0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
8db0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  or expression tr
8dc0: 65 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72  ee.  They differ
8dd0: 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20   in.** how much 
8de0: 6f 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d  of the tree is m
8df0: 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  easured..**.**  
8e00: 20 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75     dupedExprStru
8e10: 63 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a  ctSize()     Siz
8e20: 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78  e of only the Ex
8e30: 70 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  pr structure .**
8e40: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f       dupedExprNo
8e50: 64 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53  deSize()       S
8e60: 69 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70  ize of Expr + sp
8e70: 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a  ace for token.**
8e80: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69       dupedExprSi
8e90: 7a 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45  ze()           E
8ea0: 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75  xpr + token + su
8eb0: 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73  btree components
8ec0: 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
8ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
8f10: 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45  **.** The dupedE
8f20: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
8f30: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
8f40: 20 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65   two values OR-e
8f50: 64 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a  d together:  .**
8f60: 20 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72   (1) the space r
8f70: 65 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f  equired for a co
8f80: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
8f90: 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e  tructure only an
8fa0: 64 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50  d .** (2) the EP
8fb0: 5f 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20  _xxx flags that 
8fc0: 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68  indicate what th
8fd0: 65 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65  e structure size
8fe0: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54   should be..** T
8ff0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  he return values
9000: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
9010: 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58  f:.**.**      EX
9020: 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20  PR_FULLSIZE.**  
9030: 20 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44      EXPR_REDUCED
9040: 53 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75  SIZE   | EP_Redu
9050: 63 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  ced.**      EXPR
9060: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
9070: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a   EP_TokenOnly.**
9080: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
9090: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61  the structure ca
90a0: 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61  n be found by ma
90b0: 73 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e  sking the return
90c0: 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69   value.** of thi
90d0: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30  s routine with 0
90e0: 78 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73  xfff.  The flags
90f0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
9100: 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20   masking the.** 
9110: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74  return value wit
9120: 68 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  h EP_Reduced|EP_
9130: 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  TokenOnly..**.**
9140: 20 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20   Note that with 
9150: 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  flags==EXPRDUP_R
9160: 45 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74  EDUCE, this rout
9170: 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75  ines works on fu
9180: 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65  ll-size.** (unre
9190: 64 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65  duced) Expr obje
91a0: 63 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f  cts as they or o
91b0: 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72  riginally constr
91c0: 75 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72  ucted by the par
91d0: 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65  ser..** During e
91e0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
91f0: 69 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  is, extra inform
9200: 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65  ation is compute
9210: 64 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f  d and moved into
9220: 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20  .** later parts 
9230: 6f 66 20 74 68 65 20 45 78 70 72 20 6f 62 6a 65  of the Expr obje
9240: 63 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72  ct and that extr
9250: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69  a information mi
9260: 67 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a  ght get chopped.
9270: 2a 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78  ** off if the ex
9280: 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75  pression is redu
9290: 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ced.  Note also 
92a0: 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
92b0: 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65   work to.** make
92c0: 20 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55   an EXPRDUP_REDU
92d0: 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64  CE copy of a red
92e0: 75 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e  uced expression.
92f0: 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67    It is only leg
9300: 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20  al.** to reduce 
9310: 61 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65  a pristine expre
9320: 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20  ssion tree from 
9330: 74 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65  the parser.  The
9340: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a   implementation.
9350: 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53  ** of dupedExprS
9360: 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74  tructSize() cont
9370: 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73  ain multiple ass
9380: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
9390: 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a   that attempt.**
93a0: 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73   to enforce this
93b0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a   constraint..*/.
93c0: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
93d0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45  ExprStructSize(E
93e0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
93f0: 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b  s){.  int nSize;
9400: 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
9410: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
9420: 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20   || flags==0 ); 
9430: 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67  /* Only one flag
9440: 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a   value allowed *
9450: 2f 0a 20 20 61 73 73 65 72 74 28 20 45 58 50 52  /.  assert( EXPR
9460: 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66  _FULLSIZE<=0xfff
9470: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30   );.  assert( (0
9480: 78 66 66 66 20 26 20 28 45 50 5f 52 65 64 75 63  xfff & (EP_Reduc
9490: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
94a0: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d  )==0 );.  if( 0=
94b0: 3d 66 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d  =flags || p->op=
94c0: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
94d0: 4e 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  N .#ifndef SQLIT
94e0: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
94f0: 43 0a 20 20 20 7c 7c 20 45 78 70 72 48 61 73 50  C.   || ExprHasP
9500: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69  roperty(p, EP_Wi
9510: 6e 46 75 6e 63 29 0a 23 65 6e 64 69 66 0a 20 20  nFunc).#endif.  
9520: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  ){.    nSize = E
9530: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20  XPR_FULLSIZE;.  
9540: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
9550: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
9560: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
9570: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
9580: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
9590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
95a0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  p, EP_FromJoin) 
95b0: 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  ); .    assert( 
95c0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
95d0: 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  (p, EP_MemToken)
95e0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
95f0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
9600: 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  (p, EP_NoReduce)
9610: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   );.    if( p->p
9620: 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69  Left || p->x.pLi
9630: 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  st ){.      nSiz
9640: 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44  e = EXPR_REDUCED
9650: 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65  SIZE | EP_Reduce
9660: 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
9670: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
9680: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
9690: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 54    nSize = EXPR_T
96a0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
96b0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20  P_TokenOnly;.   
96c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
96d0: 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nSize;.}../*.** 
96e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
96f0: 74 75 72 6e 73 20 74 68 65 20 73 70 61 63 65 20  turns the space 
9700: 69 6e 20 62 79 74 65 73 20 72 65 71 75 69 72 65  in bytes require
9710: 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  d to store the c
9720: 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45  opy .** of the E
9730: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  xpr structure an
9740: 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  d a copy of the 
9750: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74  Expr.u.zToken st
9760: 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a 2a 2a  ring (if that.**
9770: 20 73 74 72 69 6e 67 20 69 73 20 64 65 66 69 6e   string is defin
9780: 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ed.).*/.static i
9790: 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65  nt dupedExprNode
97a0: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
97b0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
97c0: 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70  nByte = dupedExp
97d0: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66  rStructSize(p, f
97e0: 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b 0a 20  lags) & 0xfff;. 
97f0: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
9800: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
9810: 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54  alue) && p->u.zT
9820: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74  oken ){.    nByt
9830: 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
9840: 65 6e 33 30 4e 4e 28 70 2d 3e 75 2e 7a 54 6f 6b  en30NN(p->u.zTok
9850: 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74  en)+1;.  }.  ret
9860: 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  urn ROUND8(nByte
9870: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
9880: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
9890: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
98a0: 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c  to create a dupl
98b0: 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a  icate of the .**
98c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
98d0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
98e0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65  argument. The se
98f0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
9900: 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61   a.** mask conta
9910: 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58  ining EXPRDUP_XX
9920: 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  X flags..**.** T
9930: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
9940: 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65  d includes space
9950: 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70   to create a cop
9960: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
9970: 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61  ruct.** itself a
9980: 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65  nd the buffer re
9990: 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70  ferred to by Exp
99a0: 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61  r.u.zToken, if a
99b0: 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ny..**.** If the
99c0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
99d0: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
99e0: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
99f0: 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20  ue includes .** 
9a00: 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61  space to duplica
9a10: 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65  te all Expr node
9a20: 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f  s in the tree fo
9a30: 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65  rmed by Expr.pLe
9a40: 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e  ft .** and Expr.
9a50: 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73  pRight variables
9a60: 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e   (but not for an
9a70: 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69  y structures poi
9a80: 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64  nted to or .** d
9a90: 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68  escended from th
9aa0: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f  e Expr.x.pList o
9ab0: 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74  r Expr.x.pSelect
9ac0: 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a   variables)..*/.
9ad0: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
9ae0: 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70  ExprSize(Expr *p
9af0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
9b00: 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20  int nByte = 0;. 
9b10: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42   if( p ){.    nB
9b20: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e  yte = dupedExprN
9b30: 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  odeSize(p, flags
9b40: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
9b50: 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  &EXPRDUP_REDUCE 
9b60: 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
9b70: 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  = dupedExprSize(
9b80: 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29  p->pLeft, flags)
9b90: 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65   + dupedExprSize
9ba0: 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67  (p->pRight, flag
9bb0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  s);.    }.  }.  
9bc0: 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a  return nByte;.}.
9bd0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
9be0: 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
9bf0: 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  to sqlite3ExprDu
9c00: 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  p(), except that
9c10: 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a   if pzBuffer .**
9c20: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
9c30: 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61  n *pzBuffer is a
9c40: 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20  ssumed to point 
9c50: 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67  to a buffer larg
9c60: 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20  e enough .** to 
9c70: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f  store the copy o
9c80: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20  f expression p, 
9c90: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d  the copies of p-
9ca0: 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66  >u.zToken.** (if
9cb0: 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e   applicable), an
9cc0: 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  d the copies of 
9cd0: 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64  the p->pLeft and
9ce0: 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65   p->pRight expre
9cf0: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e  ssions,.** if an
9d00: 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  y. Before return
9d10: 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69  ing, *pzBuffer i
9d20: 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  s set to the fir
9d30: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
9d40: 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  .** portion of t
9d50: 68 65 20 62 75 66 66 65 72 20 63 6f 70 69 65 64  he buffer copied
9d60: 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75   into by this fu
9d70: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
9d80: 63 20 45 78 70 72 20 2a 65 78 70 72 44 75 70 28  c Expr *exprDup(
9d90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
9da0: 72 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61  r *p, int dupFla
9db0: 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65  gs, u8 **pzBuffe
9dc0: 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  r){.  Expr *pNew
9dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
9de0: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
9df0: 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20  /.  u8 *zAlloc; 
9e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
9e10: 6f 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77  ory space from w
9e20: 68 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78  hich to build Ex
9e30: 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  pr object */.  u
9e40: 33 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20  32 staticFlag;  
9e50: 20 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69       /* EP_Stati
9e60: 63 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f  c if space not o
9e70: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
9e80: 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  loc */..  assert
9e90: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
9ea0: 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65  ert( p );.  asse
9eb0: 72 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20  rt( dupFlags==0 
9ec0: 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50  || dupFlags==EXP
9ed0: 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20  RDUP_REDUCE );. 
9ee0: 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65   assert( pzBuffe
9ef0: 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73  r==0 || dupFlags
9f00: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
9f10: 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   );..  /* Figure
9f20: 20 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72   out where to wr
9f30: 69 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72  ite the new Expr
9f40: 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
9f50: 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b   if( pzBuffer ){
9f60: 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70  .    zAlloc = *p
9f70: 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61  zBuffer;.    sta
9f80: 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61  ticFlag = EP_Sta
9f90: 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tic;.  }else{.  
9fa0: 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74    zAlloc = sqlit
9fb0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
9fc0: 64 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a  db, dupedExprSiz
9fd0: 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b  e(p, dupFlags));
9fe0: 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20  .    staticFlag 
9ff0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20  = 0;.  }.  pNew 
a000: 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63  = (Expr *)zAlloc
a010: 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  ;..  if( pNew ){
a020: 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77  .    /* Set nNew
a030: 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
a040: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
a050: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  he structure poi
a060: 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  nted to.    ** b
a070: 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20  y pNew. This is 
a080: 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c  either EXPR_FULL
a090: 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43  SIZE, EXPR_REDUC
a0a0: 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a  EDSIZE or.    **
a0b0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
a0c0: 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73  IZE. nToken is s
a0d0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
a0e0: 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d   of bytes consum
a0f0: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
a100: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e   copy of the p->
a110: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
a120: 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f  (if any)..    */
a130: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
a140: 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20  ned nStructSize 
a150: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
a160: 74 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67  tSize(p, dupFlag
a170: 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  s);.    const in
a180: 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74  t nNewSize = nSt
a190: 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66  ructSize & 0xfff
a1a0: 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e  ;.    int nToken
a1b0: 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48  ;.    if( !ExprH
a1c0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
a1d0: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
a1e0: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
a1f0: 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69     nToken = sqli
a200: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75  te3Strlen30(p->u
a210: 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20  .zToken) + 1;.  
a220: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
a230: 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  Token = 0;.    }
a240: 0a 20 20 20 20 69 66 28 20 64 75 70 46 6c 61 67  .    if( dupFlag
a250: 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  s ){.      asser
a260: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
a270: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
a280: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65  )==0 );.      me
a290: 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20  mcpy(zAlloc, p, 
a2a0: 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d  nNewSize);.    }
a2b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20  else{.      u32 
a2c0: 6e 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70  nSize = (u32)exp
a2d0: 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a  rStructSize(p);.
a2e0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
a2f0: 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a  loc, p, nSize);.
a300: 20 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c        if( nSize<
a310: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b  EXPR_FULLSIZE ){
a320: 20 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74   .        memset
a330: 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c  (&zAlloc[nSize],
a340: 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   0, EXPR_FULLSIZ
a350: 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  E-nSize);.      
a360: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
a370: 53 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63  Set the EP_Reduc
a380: 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ed, EP_TokenOnly
a390: 2c 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20  , and EP_Static 
a3a0: 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74  flags appropriat
a3b0: 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77  ely. */.    pNew
a3c0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f  ->flags &= ~(EP_
a3d0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a3e0: 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45  Only|EP_Static|E
a3f0: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20  P_MemToken);.   
a400: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
a410: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45  nStructSize & (E
a420: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
a430: 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65  enOnly);.    pNe
a440: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74  w->flags |= stat
a450: 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20  icFlag;..    /* 
a460: 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54  Copy the p->u.zT
a470: 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20  oken string, if 
a480: 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
a490: 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  nToken ){.      
a4a0: 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70  char *zToken = p
a4b0: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  New->u.zToken = 
a4c0: 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e  (char*)&zAlloc[n
a4d0: 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20  NewSize];.      
a4e0: 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70  memcpy(zToken, p
a4f0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  ->u.zToken, nTok
a500: 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  en);.    }..    
a510: 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67  if( 0==((p->flag
a520: 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26  s|pNew->flags) &
a530: 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45   (EP_TokenOnly|E
a540: 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20  P_Leaf)) ){.    
a550: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
a560: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
a570: 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73   or pNew->x.pLis
a580: 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  t member. */.   
a590: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
a5a0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
a5b0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
a5c0: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65     pNew->x.pSele
a5d0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
a5e0: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70  ctDup(db, p->x.p
a5f0: 53 65 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73  Select, dupFlags
a600: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a610: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
a620: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
a630: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
a640: 2d 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c  ->x.pList, dupFl
a650: 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ags);.      }.  
a660: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c    }..    /* Fill
a670: 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20   in pNew->pLeft 
a680: 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  and pNew->pRight
a690: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70  . */.    if( Exp
a6a0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
a6b0: 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50  w, EP_Reduced|EP
a6c0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 57 69  _TokenOnly|EP_Wi
a6d0: 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  nFunc) ){.      
a6e0: 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45  zAlloc += dupedE
a6f0: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64  xprNodeSize(p, d
a700: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
a710: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
a720: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f  erty(pNew, EP_To
a730: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
a740: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
a750: 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65  ->pLeft = p->pLe
a760: 66 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  ft ?.           
a770: 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44             exprD
a780: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c  up(db, p->pLeft,
a790: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c   EXPRDUP_REDUCE,
a7a0: 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20   &zAlloc) : 0;. 
a7b0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
a7c0: 67 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20  ght = p->pRight 
a7d0: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
a7e0: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a7f0: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
a800: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
a810: 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20  &zAlloc) : 0;.  
a820: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
a830: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
a840: 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45  FUNC.      if( E
a850: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a860: 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b  , EP_WinFunc) ){
a870: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 79  .        pNew->y
a880: 2e 70 57 69 6e 20 3d 20 73 71 6c 69 74 65 33 57  .pWin = sqlite3W
a890: 69 6e 64 6f 77 44 75 70 28 64 62 2c 20 70 4e 65  indowDup(db, pNe
a8a0: 77 2c 20 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20  w, p->y.pWin);. 
a8b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45         assert( E
a8c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a8d0: 4e 65 77 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  New, EP_WinFunc)
a8e0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
a8f0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
a900: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a  T_WINDOWFUNC */.
a910: 20 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66        if( pzBuff
a920: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  er ){.        *p
a930: 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63  zBuffer = zAlloc
a940: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
a950: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
a960: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a970: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
a980: 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  EP_Leaf) ){.    
a990: 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70      if( pNew->op
a9a0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  ==TK_SELECT_COLU
a9b0: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
a9c0: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d  pNew->pLeft = p-
a9d0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  >pLeft;.        
a9e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 43 6f    assert( p->iCo
a9f0: 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  lumn==0 || p->pR
aa00: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
aa10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
aa20: 70 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d  pRight==0  || p-
aa30: 3e 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66  >pRight==p->pLef
aa40: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t );.        }el
aa50: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
aa60: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
aa70: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
aa80: 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  ->pLeft, 0);.   
aa90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
aaa0: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71  New->pRight = sq
aab0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
aac0: 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a   p->pRight, 0);.
aad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
aae0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
aaf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
ab00: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65   and return a de
ab10: 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f  ep copy of the o
ab20: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
ab30: 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61  the second .** a
ab40: 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f  rgument. If an O
ab50: 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  OM condition is 
ab60: 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c  encountered, NUL
ab70: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  L is returned.**
ab80: 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c   and the db->mal
ab90: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73  locFailed flag s
aba0: 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  et..*/.#ifndef S
abb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73  QLITE_OMIT_CTE.s
abc0: 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74 68  tatic With *with
abd0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
abe0: 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74   With *p){.  Wit
abf0: 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  h *pRet = 0;.  i
ac00: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
ac10: 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20  te3_int64 nByte 
ac20: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73  = sizeof(*p) + s
ac30: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
ac40: 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20   (p->nCte-1);.  
ac50: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
ac60: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
ac70: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
ac80: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69   pRet ){.      i
ac90: 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74  nt i;.      pRet
aca0: 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65  ->nCte = p->nCte
acb0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
acc0: 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
acd0: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  {.        pRet->
ace0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73  a[i].pSelect = s
acf0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
ad00: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c  db, p->a[i].pSel
ad10: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
ad20: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c   pRet->a[i].pCol
ad30: 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  s = sqlite3ExprL
ad40: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  istDup(db, p->a[
ad50: 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20  i].pCols, 0);.  
ad60: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
ad70: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
ad80: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e  DbStrDup(db, p->
ad90: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
ada0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
adb0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
adc0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
add0: 69 74 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65  ithDup(x,y) 0.#e
ade0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
adf0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
ae00: 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67  FUNC./*.** The g
ae10: 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f  atherSelectWindo
ae20: 77 73 28 29 20 70 72 6f 63 65 64 75 72 65 20 61  ws() procedure a
ae30: 6e 64 20 69 74 73 20 68 65 6c 70 65 72 20 72 6f  nd its helper ro
ae40: 75 74 69 6e 65 0a 2a 2a 20 67 61 74 68 65 72 53  utine.** gatherS
ae50: 65 6c 65 63 74 57 69 6e 64 6f 77 73 43 61 6c 6c  electWindowsCall
ae60: 62 61 63 6b 28 29 20 61 72 65 20 75 73 65 64 20  back() are used 
ae70: 74 6f 20 73 63 61 6e 20 61 6c 6c 20 74 68 65 20  to scan all the 
ae80: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61  expressions.** a
ae90: 6e 20 61 20 6e 65 77 6c 79 20 64 75 70 6c 69 63  n a newly duplic
aea0: 61 74 65 64 20 53 45 4c 45 43 54 20 73 74 61 74  ated SELECT stat
aeb0: 65 6d 65 6e 74 20 61 6e 64 20 67 61 74 68 65 72  ement and gather
aec0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 69 6e 64   all of the Wind
aed0: 6f 77 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 66 6f  ow.** objects fo
aee0: 75 6e 64 20 74 68 65 72 65 2c 20 61 73 73 65 6d  und there, assem
aef0: 62 6c 69 6e 67 20 74 68 65 6d 20 6f 6e 74 6f 20  bling them onto 
af00: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
af10: 61 74 20 53 65 6c 65 63 74 2d 3e 70 57 69 6e 2e  at Select->pWin.
af20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
af30: 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f  atherSelectWindo
af40: 77 73 43 61 6c 6c 62 61 63 6b 28 57 61 6c 6b 65  wsCallback(Walke
af50: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
af60: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20   *pExpr){.  if( 
af70: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55  pExpr->op==TK_FU
af80: 4e 43 54 49 4f 4e 20 26 26 20 45 78 70 72 48 61  NCTION && ExprHa
af90: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
afa0: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a   EP_WinFunc) ){.
afb0: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
afc0: 65 63 74 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  ect = pWalker->u
afd0: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 57 69  .pSelect;.    Wi
afe0: 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 70 45 78  ndow *pWin = pEx
aff0: 70 72 2d 3e 79 2e 70 57 69 6e 3b 0a 20 20 20 20  pr->y.pWin;.    
b000: 61 73 73 65 72 74 28 20 70 57 69 6e 20 29 3b 0a  assert( pWin );.
b010: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 57 69      assert( IsWi
b020: 6e 64 6f 77 46 75 6e 63 28 70 45 78 70 72 29 20  ndowFunc(pExpr) 
b030: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
b040: 57 69 6e 2d 3e 70 70 54 68 69 73 3d 3d 30 20 29  Win->ppThis==0 )
b050: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e  ;.    sqlite3Win
b060: 64 6f 77 4c 69 6e 6b 28 70 53 65 6c 65 63 74 2c  dowLink(pSelect,
b070: 20 70 57 69 6e 29 3b 0a 20 20 7d 0a 20 20 72 65   pWin);.  }.  re
b080: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
b090: 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  e;.}.static int 
b0a0: 67 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64  gatherSelectWind
b0b0: 6f 77 73 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  owsSelectCallbac
b0c0: 6b 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  k(Walker *pWalke
b0d0: 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
b0e0: 20 72 65 74 75 72 6e 20 70 3d 3d 70 57 61 6c 6b   return p==pWalk
b0f0: 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 20 3f 20  er->u.pSelect ? 
b100: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 3a 20 57  WRC_Continue : W
b110: 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 73 74 61 74  RC_Prune;.}.stat
b120: 69 63 20 76 6f 69 64 20 67 61 74 68 65 72 53 65  ic void gatherSe
b130: 6c 65 63 74 57 69 6e 64 6f 77 73 28 53 65 6c 65  lectWindows(Sele
b140: 63 74 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72  ct *p){.  Walker
b150: 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
b160: 6c 62 61 63 6b 20 3d 20 67 61 74 68 65 72 53 65  lback = gatherSe
b170: 6c 65 63 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62  lectWindowsCallb
b180: 61 63 6b 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ack;.  w.xSelect
b190: 43 61 6c 6c 62 61 63 6b 20 3d 20 67 61 74 68 65  Callback = gathe
b1a0: 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 53 65  rSelectWindowsSe
b1b0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 3b 0a 20 20  lectCallback;.  
b1c0: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
b1d0: 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 70 50 61 72  k2 = 0;.  w.pPar
b1e0: 73 65 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53  se = 0;.  w.u.pS
b1f0: 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c  elect = p;.  sql
b200: 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
b210: 77 2c 20 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  w, p);.}.#endif.
b220: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
b230: 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72  owing group of r
b240: 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65  outines make dee
b250: 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72  p copies of expr
b260: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72  essions,.** expr
b270: 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44  ession lists, ID
b280: 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65   lists, and sele
b290: 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
b2a0: 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a  The copies can.*
b2b0: 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79  * be deleted (by
b2c0: 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f   being passed to
b2d0: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
b2e0: 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f  e ...Delete() ro
b2f0: 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f  utines).** witho
b300: 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65  ut effecting the
b310: 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a   originals..**.*
b320: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
b330: 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73   list, ID, and s
b340: 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75  ource lists retu
b350: 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  rn by sqlite3Exp
b360: 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73  rListDup(),.** s
b370: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
b380: 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72  ), and sqlite3Sr
b390: 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e  cListDup() can n
b3a0: 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78  ot be further ex
b3b0: 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75  panded .** by su
b3c0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
b3d0: 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70  o sqlite*ListApp
b3e0: 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a  end() routines..
b3f0: 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73  **.** Any tables
b400: 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73   that the SrcLis
b410: 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  t might point to
b420: 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61   are not duplica
b430: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ted..**.** The f
b440: 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63  lags parameter c
b450: 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e  ontains a combin
b460: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50  ation of the EXP
b470: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
b480: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
b490: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
b4a0: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73   set, then the s
b4b0: 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
b4c0: 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61  d is a.** trunca
b4d0: 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ted version of t
b4e0: 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74  he usual Expr st
b4f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
b500: 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a  l be stored as.*
b510: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  * part of the in
b520: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
b530: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
b540: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
b550: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
b560: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
b570: 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  db, Expr *p, int
b580: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
b590: 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
b5a0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
b5b0: 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  DUCE );.  return
b5c0: 20 70 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c   p ? exprDup(db,
b5d0: 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20   p, flags, 0) : 
b5e0: 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73  0;.}.ExprList *s
b5f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
b600: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
b610: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
b620: 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69  flags){.  ExprLi
b630: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75  st *pNew;.  stru
b640: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
b650: 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74   *pItem, *pOldIt
b660: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  em;.  int i;.  E
b670: 78 70 72 20 2a 70 50 72 69 6f 72 53 65 6c 65 63  xpr *pPriorSelec
b680: 74 43 6f 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65  tCol = 0;.  asse
b690: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
b6a0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
b6b0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
b6c0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
b6d0: 4e 28 64 62 2c 20 73 71 6c 69 74 65 33 44 62 4d  N(db, sqlite3DbM
b6e0: 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 29  allocSize(db, p)
b6f0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
b700: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b710: 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e  New->nExpr = p->
b720: 6e 45 78 70 72 3b 0a 20 20 70 49 74 65 6d 20 3d  nExpr;.  pItem =
b730: 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64   pNew->a;.  pOld
b740: 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66  Item = p->a;.  f
b750: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
b760: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
b770: 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20  , pOldItem++){. 
b780: 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70     Expr *pOldExp
b790: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45  r = pOldItem->pE
b7a0: 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
b7b0: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 70 49 74  NewExpr;.    pIt
b7c0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  em->pExpr = sqli
b7d0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b7e0: 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b  OldExpr, flags);
b7f0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70  .    if( pOldExp
b800: 72 20 0a 20 20 20 20 20 26 26 20 70 4f 6c 64 45  r .     && pOldE
b810: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
b820: 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26  CT_COLUMN.     &
b830: 26 20 28 70 4e 65 77 45 78 70 72 20 3d 20 70 49  & (pNewExpr = pI
b840: 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d 30 20 0a  tem->pExpr)!=0 .
b850: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
b860: 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69  ert( pNewExpr->i
b870: 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30  Column==0 || i>0
b880: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e   );.      if( pN
b890: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
b8a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
b8b0: 73 65 72 74 28 20 70 4f 6c 64 45 78 70 72 2d 3e  sert( pOldExpr->
b8c0: 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78 70 72 2d  pLeft==pOldExpr-
b8d0: 3e 70 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20  >pRight );.     
b8e0: 20 20 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43     pPriorSelectC
b8f0: 6f 6c 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70  ol = pNewExpr->p
b900: 4c 65 66 74 20 3d 20 70 4e 65 77 45 78 70 72 2d  Left = pNewExpr-
b910: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 7d  >pRight;.      }
b920: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
b930: 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
b940: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
b950: 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 21 3d 30 20  em[-1].pExpr!=0 
b960: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
b970: 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f  t( pNewExpr->iCo
b980: 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e  lumn==pItem[-1].
b990: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31  pExpr->iColumn+1
b9a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
b9b0: 72 74 28 20 70 50 72 69 6f 72 53 65 6c 65 63 74  rt( pPriorSelect
b9c0: 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70  Col==pItem[-1].p
b9d0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  Expr->pLeft );. 
b9e0: 20 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 2d         pNewExpr-
b9f0: 3e 70 4c 65 66 74 20 3d 20 70 50 72 69 6f 72 53  >pLeft = pPriorS
ba00: 65 6c 65 63 74 43 6f 6c 3b 0a 20 20 20 20 20 20  electCol;.      
ba10: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65  }.    }.    pIte
ba20: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
ba30: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
ba40: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
ba50: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
ba60: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
ba70: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
ba80: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
ba90: 74 65 6d 2d 3e 73 6f 72 74 46 6c 61 67 73 20 3d  tem->sortFlags =
baa0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 46   pOldItem->sortF
bab0: 6c 61 67 73 3b 0a 20 20 20 20 70 49 74 65 6d 2d  lags;.    pItem-
bac0: 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70  >done = 0;.    p
bad0: 49 74 65 6d 2d 3e 62 4e 75 6c 6c 73 20 3d 20 70  Item->bNulls = p
bae0: 4f 6c 64 49 74 65 6d 2d 3e 62 4e 75 6c 6c 73 3b  OldItem->bNulls;
baf0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
bb00: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
bb10: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
bb20: 20 20 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65     pItem->bSorte
bb30: 72 52 65 66 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rRef = pOldItem-
bb40: 3e 62 53 6f 72 74 65 72 52 65 66 3b 0a 20 20 20  >bSorterRef;.   
bb50: 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64   pItem->u = pOld
bb60: 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72  Item->u;.  }.  r
bb70: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
bb80: 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c  *.** If cursors,
bb90: 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73   triggers, views
bba0: 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
bbb0: 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20  are all omitted 
bbc0: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c  from.** the buil
bbd0: 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20  d, then none of 
bbe0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
bbf0: 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66  utines, except f
bc00: 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65  or .** sqlite3Se
bc10: 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62  lectDup(), can b
bc20: 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65  e called. sqlite
bc30: 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20  3SelectDup() is 
bc40: 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c  sometimes.** cal
bc50: 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  led with a NULL 
bc60: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  argument..*/.#if
bc70: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
bc80: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
bc90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
bca0: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20  MIT_TRIGGER) \. 
bcb0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
bcc0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
bcd0: 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  ).SrcList *sqlit
bce0: 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c  e3SrcListDup(sql
bcf0: 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
bd00: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
bd10: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  {.  SrcList *pNe
bd20: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  w;.  int i;.  in
bd30: 74 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72  t nByte;.  asser
bd40: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
bd50: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
bd60: 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  0;.  nByte = siz
bd70: 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53  eof(*p) + (p->nS
bd80: 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d  rc>0 ? sizeof(p-
bd90: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72  >a[0]) * (p->nSr
bda0: 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65  c-1) : 0);.  pNe
bdb0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
bdc0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79  locRawNN(db, nBy
bdd0: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  te );.  if( pNew
bde0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
bdf0: 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70    pNew->nSrc = p
be00: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
be10: 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >nSrc;.  for(i=0
be20: 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b  ; i<p->nSrc; i++
be30: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
be40: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  cList_item *pNew
be50: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
be60: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
be70: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
be80: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
be90: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
bea0: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
beb0: 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49  >pSchema = pOldI
bec0: 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  tem->pSchema;.  
bed0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74    pNewItem->zDat
bee0: 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44  abase = sqlite3D
bef0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
bf00: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
bf10: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
bf20: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
bf30: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
bf40: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
bf50: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69    pNewItem->zAli
bf60: 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  as = sqlite3DbSt
bf70: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
bf80: 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
bf90: 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70  pNewItem->fg = p
bfa0: 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20  OldItem->fg;.   
bfb0: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73   pNewItem->iCurs
bfc0: 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  or = pOldItem->i
bfd0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77  Cursor;.    pNew
bfe0: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
bff0: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64  b = pOldItem->ad
c000: 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70  drFillSub;.    p
c010: 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  NewItem->regRetu
c020: 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72  rn = pOldItem->r
c030: 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  egReturn;.    if
c040: 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69  ( pNewItem->fg.i
c050: 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20  sIndexedBy ){.  
c060: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
c070: 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71  .zIndexedBy = sq
c080: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
c090: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a  , pOldItem->u1.z
c0a0: 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20  IndexedBy);.    
c0b0: 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  }.    pNewItem->
c0c0: 70 49 42 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49  pIBIndex = pOldI
c0d0: 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20  tem->pIBIndex;. 
c0e0: 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d     if( pNewItem-
c0f0: 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
c100: 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  .      pNewItem-
c110: 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a  >u1.pFuncArg = .
c120: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c130: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
c140: 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46   pOldItem->u1.pF
c150: 75 6e 63 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a  uncArg, flags);.
c160: 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
c170: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
c180: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
c190: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
c1a0: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54  {.      pTab->nT
c1b0: 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20  abRef++;.    }. 
c1c0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65     pNewItem->pSe
c1d0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
c1e0: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  lectDup(db, pOld
c1f0: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66  Item->pSelect, f
c200: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lags);.    pNewI
c210: 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74  tem->pOn = sqlit
c220: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
c230: 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61  ldItem->pOn, fla
c240: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  gs);.    pNewIte
c250: 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69  m->pUsing = sqli
c260: 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c  te3IdListDup(db,
c270: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e   pOldItem->pUsin
c280: 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  g);.    pNewItem
c290: 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64  ->colUsed = pOld
c2a0: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
c2b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
c2c0: 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  ;.}.IdList *sqli
c2d0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c  te3IdListDup(sql
c2e0: 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
c2f0: 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a   *p){.  IdList *
c300: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
c310: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
c320: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
c330: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
c340: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c350: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
c360: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
c370: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
c380: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49  rn 0;.  pNew->nI
c390: 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e  d = p->nId;.  pN
c3a0: 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  ew->a = sqlite3D
c3b0: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
c3c0: 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70   p->nId*sizeof(p
c3d0: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
c3e0: 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20   pNew->a==0 ){. 
c3f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c400: 4e 4e 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  NN(db, pNew);.  
c410: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
c420: 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    /* Note that b
c430: 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65 20  ecause the size 
c440: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  of the allocatio
c450: 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20  n for p->a[] is 
c460: 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61  not.  ** necessa
c470: 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66 20  rily a power of 
c480: 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c 69  two, sqlite3IdLi
c490: 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20 6e  stAppend() may n
c4a0: 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a  ot be called.  *
c4b0: 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63 61  * on the duplica
c4c0: 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  te created by th
c4d0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a  is function. */.
c4e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
c4f0: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
c500: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
c510: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
c520: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
c530: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
c540: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
c550: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
c560: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
c570: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
c580: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
c590: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
c5a0: 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d  ->idx = pOldItem
c5b0: 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ->idx;.  }.  ret
c5c0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
c5d0: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
c5e0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
c5f0: 2c 20 53 65 6c 65 63 74 20 2a 70 44 75 70 2c 20  , Select *pDup, 
c600: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65  int flags){.  Se
c610: 6c 65 63 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a  lect *pRet = 0;.
c620: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 78 74 20    Select *pNext 
c630: 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 2a  = 0;.  Select **
c640: 70 70 20 3d 20 26 70 52 65 74 3b 0a 20 20 53 65  pp = &pRet;.  Se
c650: 6c 65 63 74 20 2a 70 3b 0a 0a 20 20 61 73 73 65  lect *p;..  asse
c660: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 66  rt( db!=0 );.  f
c670: 6f 72 28 70 3d 70 44 75 70 3b 20 70 3b 20 70 3d  or(p=pDup; p; p=
c680: 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
c690: 53 65 6c 65 63 74 20 2a 70 4e 65 77 20 3d 20 73  Select *pNew = s
c6a0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c6b0: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  wNN(db, sizeof(*
c6c0: 70 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  p) );.    if( pN
c6d0: 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ew==0 ) break;. 
c6e0: 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20     pNew->pEList 
c6f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
c700: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
c710: 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  st, flags);.    
c720: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
c730: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64  ite3SrcListDup(d
c740: 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67  b, p->pSrc, flag
c750: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57  s);.    pNew->pW
c760: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
c770: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68  prDup(db, p->pWh
c780: 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ere, flags);.   
c790: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
c7a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
c7b0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f  tDup(db, p->pGro
c7c0: 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  upBy, flags);.  
c7d0: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
c7e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c7f0: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
c800: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c810: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
c820: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c830: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
c840: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c850: 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  ew->op = p->op;.
c860: 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
c870: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 70 4e 65  = pNext;.    pNe
c880: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  w->pPrior = 0;. 
c890: 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20     pNew->pLimit 
c8a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c8b0: 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  (db, p->pLimit, 
c8c0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c8d0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
c8e0: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
c8f0: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73  = 0;.    pNew->s
c900: 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
c910: 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73  Flags & ~SF_Uses
c920: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 70  Ephemeral;.    p
c930: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
c940: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70  m[0] = -1;.    p
c950: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
c960: 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70  m[1] = -1;.    p
c970: 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  New->nSelectRow 
c980: 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  = p->nSelectRow;
c990: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  .    pNew->pWith
c9a0: 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c 20 70   = withDup(db, p
c9b0: 2d 3e 70 57 69 74 68 29 3b 0a 23 69 66 6e 64 65  ->pWith);.#ifnde
c9c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
c9d0: 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 70 4e 65  NDOWFUNC.    pNe
c9e0: 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20  w->pWin = 0;.   
c9f0: 20 70 4e 65 77 2d 3e 70 57 69 6e 44 65 66 6e 20   pNew->pWinDefn 
ca00: 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c  = sqlite3WindowL
ca10: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  istDup(db, p->pW
ca20: 69 6e 44 65 66 6e 29 3b 0a 20 20 20 20 69 66 28  inDefn);.    if(
ca30: 20 70 2d 3e 70 57 69 6e 20 26 26 20 64 62 2d 3e   p->pWin && db->
ca40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
ca50: 29 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69  ) gatherSelectWi
ca60: 6e 64 6f 77 73 28 70 4e 65 77 29 3b 0a 23 65 6e  ndows(pNew);.#en
ca70: 64 69 66 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65  dif.    pNew->se
ca80: 6c 49 64 20 3d 20 70 2d 3e 73 65 6c 49 64 3b 0a  lId = p->selId;.
ca90: 20 20 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a      *pp = pNew;.
caa0: 20 20 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e      pp = &pNew->
cab0: 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78  pPrior;.    pNex
cac0: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20  t = pNew;.  }.. 
cad0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
cae0: 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71  #else.Select *sq
caf0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
cb00: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
cb10: 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  ct *p, int flags
cb20: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
cb30: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  0 );.  return 0;
cb40: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
cb50: 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
cb60: 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ent to the end o
cb70: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
cb80: 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20  list.  If pList 
cb90: 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20  is.** initially 
cba0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74  NULL, then creat
cbb0: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
cbc0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  on list..**.** T
cbd0: 68 65 20 70 4c 69 73 74 20 61 72 67 75 6d 65 6e  he pList argumen
cbe0: 74 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  t must be either
cbf0: 20 4e 55 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74   NULL or a point
cc00: 65 72 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73  er to an ExprLis
cc10: 74 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  t.** obtained fr
cc20: 6f 6d 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  om a prior call 
cc30: 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  to sqlite3ExprLi
cc40: 73 74 41 70 70 65 6e 64 28 29 2e 20 20 54 68 69  stAppend().  Thi
cc50: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79  s routine.** may
cc60: 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74   not be used wit
cc70: 68 20 61 6e 20 45 78 70 72 4c 69 73 74 20 6f 62  h an ExprList ob
cc80: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
cc90: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29  te3ExprListDup()
cca0: 2e 0a 2a 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68  ..** Reason:  Th
ccb0: 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d  is routine assum
ccc0: 65 73 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  es that the numb
ccd0: 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70  er of slots in p
cce0: 4c 69 73 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20  List->a[].** is 
ccf0: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20  a power of two. 
cd00: 20 54 68 61 74 20 69 73 20 74 72 75 65 20 66 6f   That is true fo
cd10: 72 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  r sqlite3ExprLis
cd20: 74 41 70 70 65 6e 64 28 29 20 72 65 74 75 72 6e  tAppend() return
cd30: 73 0a 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20  s.** but is not 
cd40: 6e 65 63 65 73 73 61 72 69 6c 79 20 74 72 75 65  necessarily true
cd50: 20 66 72 6f 6d 20 74 68 65 20 72 65 74 75 72 6e   from the return
cd60: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
cd70: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a  3ExprListDup()..
cd80: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
cd90: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
cda0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65  or occurs, the e
cdb0: 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72  ntire list is fr
cdc0: 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20  eed and.** NULL 
cdd0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
cde0: 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74   non-NULL is ret
cdf0: 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69  urned, then it i
ce00: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
ce10: 74 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74  that the new ent
ce20: 72 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ry was successfu
ce30: 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f  lly appended..*/
ce40: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
ce50: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
ce60: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
ce70: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
ce80: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
ce90: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
cea0: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
ceb0: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
cec0: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
ced0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
cee0: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
cef0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
cf00: 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e   to be appended.
cf10: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
cf20: 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  /.){.  struct Ex
cf30: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
cf40: 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
cf50: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
cf60: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
cf70: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  );.  if( pList==
cf80: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
cf90: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
cfa0: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
cfb0: 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20  (ExprList) );.  
cfc0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
cfd0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
cfe0: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
cff0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b  List->nExpr = 0;
d000: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c  .  }else if( (pL
d010: 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c  ist->nExpr & (pL
d020: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d  ist->nExpr-1))==
d030: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  0 ){.    ExprLis
d040: 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65  t *pNew;.    pNe
d050: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
d060: 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 20  lloc(db, pList, 
d070: 0a 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66  .         sizeof
d080: 28 2a 70 4c 69 73 74 29 2b 28 32 2a 28 73 71 6c  (*pList)+(2*(sql
d090: 69 74 65 33 5f 69 6e 74 36 34 29 70 4c 69 73 74  ite3_int64)pList
d0a0: 2d 3e 6e 45 78 70 72 2d 31 29 2a 73 69 7a 65 6f  ->nExpr-1)*sizeo
d0b0: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
d0c0: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
d0d0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
d0e0: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
d0f0: 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20   pList = pNew;. 
d100: 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c   }.  pItem = &pL
d110: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
d120: 78 70 72 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74  xpr++];.  assert
d130: 28 20 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63  ( offsetof(struc
d140: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c  t ExprList_item,
d150: 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65 6f 66 28 70  zName)==sizeof(p
d160: 49 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 3b 0a  Item->pExpr) );.
d170: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
d180: 6f 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69  of(struct ExprLi
d190: 73 74 5f 69 74 65 6d 2c 70 45 78 70 72 29 3d 3d  st_item,pExpr)==
d1a0: 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  0 );.  memset(&p
d1b0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69  Item->zName,0,si
d1c0: 7a 65 6f 66 28 2a 70 49 74 65 6d 29 2d 6f 66 66  zeof(*pItem)-off
d1d0: 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70  setof(struct Exp
d1e0: 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65  rList_item,zName
d1f0: 29 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78  ));.  pItem->pEx
d200: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 72 65  pr = pExpr;.  re
d210: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f  turn pList;..no_
d220: 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41  mem:     .  /* A
d230: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
d240: 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61  ory if malloc ha
d250: 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73  s failed. */.  s
d260: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
d270: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73  (db, pExpr);.  s
d280: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
d290: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
d2a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
d2b0: 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61  /*.** pColumns a
d2c0: 6e 64 20 70 45 78 70 72 20 66 6f 72 6d 20 61 20  nd pExpr form a 
d2d0: 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e  vector assignmen
d2e0: 74 20 77 68 69 63 68 20 69 73 20 70 61 72 74 20  t which is part 
d2f0: 6f 66 20 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c  of the SET.** cl
d300: 61 75 73 65 20 6f 66 20 61 6e 20 55 50 44 41 54  ause of an UPDAT
d310: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69  E statement.  Li
d320: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
d330: 20 20 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20        (a,b,c) = 
d340: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
d350: 72 33 29 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61  r3).** Or:    (a
d360: 2c 62 2c 63 29 20 3d 20 28 53 45 4c 45 43 54 20  ,b,c) = (SELECT 
d370: 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29  x,y,z FROM ....)
d380: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  .**.** For each 
d390: 74 65 72 6d 20 6f 66 20 74 68 65 20 76 65 63 74  term of the vect
d3a0: 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61  or assignment, a
d3b0: 70 70 65 6e 64 20 6e 65 77 20 65 6e 74 72 69 65  ppend new entrie
d3c0: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72  s to the.** expr
d3d0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73  ession list pLis
d3e0: 74 2e 20 20 49 6e 20 74 68 65 20 63 61 73 65 20  t.  In the case 
d3f0: 6f 66 20 61 20 73 75 62 71 75 65 72 79 20 6f 6e  of a subquery on
d400: 20 74 68 65 20 52 48 53 2c 20 61 70 70 65 6e 64   the RHS, append
d410: 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  .** TK_SELECT_CO
d420: 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 73  LUMN expressions
d430: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
d440: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
d450: 70 65 6e 64 56 65 63 74 6f 72 28 0a 20 20 50 61  pendVector(.  Pa
d460: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
d470: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
d480: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
d490: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
d4a0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
d4b0: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
d4c0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
d4d0: 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75  .  IdList *pColu
d4e0: 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73  mns,      /* Lis
d4f0: 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48  t of names of LH
d500: 53 20 6f 66 20 74 68 65 20 61 73 73 69 67 6e 6d  S of the assignm
d510: 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ent */.  Expr *p
d520: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
d530: 2f 2a 20 56 65 63 74 6f 72 20 65 78 70 72 65 73  /* Vector expres
d540: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
d550: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
d560: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
d570: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d580: 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  >db;.  int n;.  
d590: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 46 69  int i;.  int iFi
d5a0: 72 73 74 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  rst = pList ? pL
d5b0: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  ist->nExpr : 0;.
d5c0: 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61    /* pColumns ca
d5d0: 6e 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64  n only be NULL d
d5e0: 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74  ue to an OOM but
d5f0: 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75   an OOM will cau
d600: 73 65 20 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20  se an.  ** exit 
d610: 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f  prior to this ro
d620: 75 74 69 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f  utine being invo
d630: 6b 65 64 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ked */.  if( NEV
d640: 45 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20  ER(pColumns==0) 
d650: 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70  ) goto vector_ap
d660: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66  pend_error;.  if
d670: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 67 6f 74  ( pExpr==0 ) got
d680: 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f  o vector_append_
d690: 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20  error;..  /* If 
d6a0: 74 68 65 20 52 48 53 20 69 73 20 61 20 76 65 63  the RHS is a vec
d6b0: 74 6f 72 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  tor, then we can
d6c0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 63 68 65   immediately che
d6d0: 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 0a  ck to see that .
d6e0: 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66    ** the size of
d6f0: 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53   the RHS and LHS
d700: 20 6d 61 74 63 68 2e 20 20 42 75 74 20 69 66 20   match.  But if 
d710: 74 68 65 20 52 48 53 20 69 73 20 61 20 53 45 4c  the RHS is a SEL
d720: 45 43 54 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63  ECT, .  ** wildc
d730: 61 72 64 73 20 28 22 2a 22 29 20 69 6e 20 74 68  ards ("*") in th
d740: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
d750: 74 68 65 20 53 45 4c 45 43 54 20 6d 75 73 74 20  the SELECT must 
d760: 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
d770: 72 65 0a 20 20 2a 2a 20 77 65 20 63 61 6e 20 64  re.  ** we can d
d780: 6f 20 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b  o the size check
d790: 2c 20 73 6f 20 64 65 66 65 72 20 74 68 65 20 73  , so defer the s
d7a0: 69 7a 65 20 63 68 65 63 6b 20 75 6e 74 69 6c 20  ize check until 
d7b0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e  code generation.
d7c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
d7d0: 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54  r->op!=TK_SELECT
d7e0: 20 26 26 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49   && pColumns->nI
d7f0: 64 21 3d 28 6e 3d 73 71 6c 69 74 65 33 45 78 70  d!=(n=sqlite3Exp
d800: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
d810: 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r)) ){.    sqlit
d820: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d830: 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61  e, "%d columns a
d840: 73 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65  ssigned %d value
d850: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
d860: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73          pColumns
d870: 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67  ->nId, n);.    g
d880: 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e  oto vector_appen
d890: 64 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  d_error;.  }..  
d8a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75  for(i=0; i<pColu
d8b0: 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  mns->nId; i++){.
d8c0: 20 20 20 20 45 78 70 72 20 2a 70 53 75 62 45 78      Expr *pSubEx
d8d0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
d8e0: 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70  ForVectorField(p
d8f0: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 69 29  Parse, pExpr, i)
d900: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
d910: 75 62 45 78 70 72 21 3d 30 20 7c 7c 20 64 62 2d  ubExpr!=0 || db-
d920: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
d930: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75  .    assert( pSu
d940: 62 45 78 70 72 3d 3d 30 20 7c 7c 20 70 53 75 62  bExpr==0 || pSub
d950: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  Expr->iTable==0 
d960: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 45  );.    if( pSubE
d970: 78 70 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  xpr==0 ) continu
d980: 65 3b 0a 20 20 20 20 70 53 75 62 45 78 70 72 2d  e;.    pSubExpr-
d990: 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f 6c 75 6d  >iTable = pColum
d9a0: 6e 73 2d 3e 6e 49 64 3b 0a 20 20 20 20 70 4c 69  ns->nId;.    pLi
d9b0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
d9c0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
d9d0: 65 2c 20 70 4c 69 73 74 2c 20 70 53 75 62 45 78  e, pList, pSubEx
d9e0: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  pr);.    if( pLi
d9f0: 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  st ){.      asse
da00: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
da10: 3d 3d 69 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a  ==iFirst+i+1 );.
da20: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70        pList->a[p
da30: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  List->nExpr-1].z
da40: 4e 61 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d  Name = pColumns-
da50: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
da60: 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69     pColumns->a[i
da70: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
da80: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 64   }.  }..  if( !d
da90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
daa0: 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  && pExpr->op==TK
dab0: 5f 53 45 4c 45 43 54 20 26 26 20 41 4c 57 41 59  _SELECT && ALWAY
dac0: 53 28 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  S(pList!=0) ){. 
dad0: 20 20 20 45 78 70 72 20 2a 70 46 69 72 73 74 20     Expr *pFirst 
dae0: 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73  = pList->a[iFirs
daf0: 74 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  t].pExpr;.    as
db00: 73 65 72 74 28 20 70 46 69 72 73 74 21 3d 30 20  sert( pFirst!=0 
db10: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
db20: 46 69 72 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  First->op==TK_SE
db30: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  LECT_COLUMN );. 
db40: 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 74 6f 72      .    /* Stor
db50: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
db60: 74 65 6d 65 6e 74 20 69 6e 20 70 52 69 67 68 74  tement in pRight
db70: 20 73 6f 20 69 74 20 77 69 6c 6c 20 62 65 20 64   so it will be d
db80: 65 6c 65 74 65 64 20 77 68 65 6e 0a 20 20 20 20  eleted when.    
db90: 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  ** sqlite3ExprLi
dba0: 73 74 44 65 6c 65 74 65 28 29 20 69 73 20 63 61  stDelete() is ca
dbb0: 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 70 46 69 72  lled */.    pFir
dbc0: 73 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 45 78  st->pRight = pEx
dbd0: 70 72 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20  pr;.    pExpr = 
dbe0: 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d  0;..    /* Remem
dbf0: 62 65 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ber the size of 
dc00: 74 68 65 20 4c 48 53 20 69 6e 20 69 54 61 62 6c  the LHS in iTabl
dc10: 65 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  e so that we can
dc20: 20 63 68 65 63 6b 20 74 68 61 74 0a 20 20 20 20   check that.    
dc30: 2a 2a 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c  ** the RHS and L
dc40: 48 53 20 73 69 7a 65 73 20 6d 61 74 63 68 20 64  HS sizes match d
dc50: 75 72 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72  uring code gener
dc60: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 46  ation. */.    pF
dc70: 69 72 73 74 2d 3e 69 54 61 62 6c 65 20 3d 20 70  irst->iTable = p
dc80: 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20  Columns->nId;.  
dc90: 7d 0a 0a 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  }..vector_append
dca0: 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65  _error:.  sqlite
dcb0: 33 45 78 70 72 55 6e 6d 61 70 41 6e 64 44 65 6c  3ExprUnmapAndDel
dcc0: 65 74 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ete(pParse, pExp
dcd0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  r);.  sqlite3IdL
dce0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
dcf0: 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72  olumns);.  retur
dd00: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
dd10: 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f  * Set the sort o
dd20: 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73  rder for the las
dd30: 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65  t element on the
dd40: 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e   given ExprList.
dd50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
dd60: 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f  ExprListSetSortO
dd70: 72 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70  rder(ExprList *p
dd80: 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72  , int iSortOrder
dd90: 2c 20 69 6e 74 20 65 4e 75 6c 6c 73 29 7b 0a 20  , int eNulls){. 
dda0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
ddb0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
ddc0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
ddd0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  n;.  assert( p->
dde0: 6e 45 78 70 72 3e 30 20 29 3b 0a 0a 20 20 61 73  nExpr>0 );..  as
ddf0: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f  sert( SQLITE_SO_
de00: 55 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53  UNDEFINED<0 && S
de10: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3d 3d 30 20  QLITE_SO_ASC==0 
de20: 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  && SQLITE_SO_DES
de30: 43 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  C>0 );.  assert(
de40: 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c   iSortOrder==SQL
de50: 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44  ITE_SO_UNDEFINED
de60: 20 0a 20 20 20 20 20 20 20 7c 7c 20 69 53 6f 72   .       || iSor
de70: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
de80: 4f 5f 41 53 43 20 0a 20 20 20 20 20 20 20 7c 7c  O_ASC .       ||
de90: 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c   iSortOrder==SQL
dea0: 49 54 45 5f 53 4f 5f 44 45 53 43 20 0a 20 20 29  ITE_SO_DESC .  )
deb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4e 75 6c  ;.  assert( eNul
dec0: 6c 73 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 55 4e  ls==SQLITE_SO_UN
ded0: 44 45 46 49 4e 45 44 20 0a 20 20 20 20 20 20 20  DEFINED .       
dee0: 7c 7c 20 65 4e 75 6c 6c 73 3d 3d 53 51 4c 49 54  || eNulls==SQLIT
def0: 45 5f 53 4f 5f 41 53 43 20 0a 20 20 20 20 20 20  E_SO_ASC .      
df00: 20 7c 7c 20 65 4e 75 6c 6c 73 3d 3d 53 51 4c 49   || eNulls==SQLI
df10: 54 45 5f 53 4f 5f 44 45 53 43 20 0a 20 20 29 3b  TE_SO_DESC .  );
df20: 0a 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e  ..  pItem = &p->
df30: 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  a[p->nExpr-1];. 
df40: 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
df50: 62 4e 75 6c 6c 73 3d 3d 30 20 29 3b 0a 20 20 69  bNulls==0 );.  i
df60: 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 53  f( iSortOrder==S
df70: 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e  QLITE_SO_UNDEFIN
df80: 45 44 20 29 7b 0a 20 20 20 20 69 53 6f 72 74 4f  ED ){.    iSortO
df90: 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f  rder = SQLITE_SO
dfa0: 5f 41 53 43 3b 0a 20 20 7d 0a 20 20 70 49 74 65  _ASC;.  }.  pIte
dfb0: 6d 2d 3e 73 6f 72 74 46 6c 61 67 73 20 3d 20 28  m->sortFlags = (
dfc0: 75 38 29 69 53 6f 72 74 4f 72 64 65 72 3b 0a 0a  u8)iSortOrder;..
dfd0: 20 20 69 66 28 20 65 4e 75 6c 6c 73 21 3d 53 51    if( eNulls!=SQ
dfe0: 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45  LITE_SO_UNDEFINE
dff0: 44 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  D ){.    pItem->
e000: 62 4e 75 6c 6c 73 20 3d 20 31 3b 0a 20 20 20 20  bNulls = 1;.    
e010: 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 21 3d  if( iSortOrder!=
e020: 65 4e 75 6c 6c 73 20 29 7b 0a 20 20 20 20 20 20  eNulls ){.      
e030: 70 49 74 65 6d 2d 3e 73 6f 72 74 46 6c 61 67 73  pItem->sortFlags
e040: 20 7c 3d 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45   |= KEYINFO_ORDE
e050: 52 5f 42 49 47 4e 55 4c 4c 3b 0a 20 20 20 20 7d  R_BIGNULL;.    }
e060: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
e070: 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  t the ExprList.a
e080: 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74  [].zName element
e090: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
e0a0: 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d  ently added item
e0b0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65  .** on the expre
e0c0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
e0d0: 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65  * pList might be
e0e0: 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20   NULL following 
e0f0: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
e100: 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20  ut pName should 
e110: 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c  never be.** NULL
e120: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
e130: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
e140: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d   the pParse->db-
e150: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
e160: 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f  ag.** is set..*/
e170: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
e180: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20  rListSetName(.  
e190: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e1a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e1b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e1c0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
e1d0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
e1e0: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20  to which to add 
e1f0: 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54  the span. */.  T
e200: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
e210: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74         /* Name t
e220: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20  o be added */.  
e230: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
e240: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
e250: 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d  to cause the nam
e260: 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64  e to be dequoted
e270: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
e280: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61   pList!=0 || pPa
e290: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
e2a0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
e2b0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
e2c0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
e2d0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
e2e0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
e2f0: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49  Expr>0 );.    pI
e300: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
e310: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
e320: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
e330: 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a  em->zName==0 );.
e340: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
e350: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
e360: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
e370: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
e380: 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71  >n);.    if( deq
e390: 75 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44 65  uote ) sqlite3De
e3a0: 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  quote(pItem->zNa
e3b0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 49 4e 5f  me);.    if( IN_
e3c0: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
e3d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
e3e0: 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61  nameTokenMap(pPa
e3f0: 72 73 65 2c 20 28 76 6f 69 64 2a 29 70 49 74 65  rse, (void*)pIte
e400: 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29  m->zName, pName)
e410: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
e420: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
e430: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20  rList.a[].zSpan 
e440: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
e450: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
e460: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
e470: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
e480: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
e490: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
e4a0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
e4b0: 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20  ror.  But pSpan 
e4c0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
e4d0: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
e4e0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
e4f0: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
e500: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
e510: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
e520: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
e530: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
e540: 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pan(.  Parse *pP
e550: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
e560: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
e570: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
e580: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
e590: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
e5a0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
e5b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e5c0: 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *zStart,     /*
e5d0: 20 53 74 61 72 74 20 6f 66 20 74 68 65 20 73 70   Start of the sp
e5e0: 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  an */.  const ch
e5f0: 61 72 20 2a 7a 45 6e 64 20 20 20 20 20 20 20 20  ar *zEnd        
e600: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70  /* End of the sp
e610: 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  an */.){.  sqlit
e620: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
e630: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
e640: 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  List!=0 || db->m
e650: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
e660: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
e670: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
e680: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
e690: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
e6a0: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
e6b0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
e6c0: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
e6d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e6e0: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
e6f0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
e700: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 70 61  n = sqlite3DbSpa
e710: 6e 44 75 70 28 64 62 2c 20 7a 53 74 61 72 74 2c  nDup(db, zStart,
e720: 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   zEnd);.  }.}../
e730: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
e740: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69  ession list pELi
e750: 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  st contains more
e760: 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65   than iLimit ele
e770: 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20  ments,.** leave 
e780: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
e790: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
e7a0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
e7b0: 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a  istCheckLength(.
e7c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e7d0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
e7e0: 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ist,.  const cha
e7f0: 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20  r *zObject.){.  
e800: 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d  int mx = pParse-
e810: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
e820: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
e830: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
e840: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
e850: 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74  nExpr==mx );.  t
e860: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
e870: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
e880: 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20  ==mx+1 );.  if( 
e890: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
e8a0: 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20  ->nExpr>mx ){.  
e8b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
e8c0: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
e8d0: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25  any columns in %
e8e0: 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20  s", zObject);.  
e8f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
e900: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
e910: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
e920: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
e930: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70 72  INLINE void expr
e940: 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c  ListDeleteNN(sql
e950: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
e960: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
e970: 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  t i = pList->nEx
e980: 70 72 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  pr;.  struct Exp
e990: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
e9a0: 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61 3b 0a 20  m =  pList->a;. 
e9b0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
e9c0: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 64 6f 7b  nExpr>0 );.  do{
e9d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
e9e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
e9f0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
ea00: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
ea10: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
ea20: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
ea30: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
ea40: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2b 2b 3b  n);.    pItem++;
ea50: 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d 69 3e 30  .  }while( --i>0
ea60: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   );.  sqlite3DbF
ea70: 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29  reeNN(db, pList)
ea80: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
ea90: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73  ExprListDelete(s
eaa0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
eab0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
eac0: 69 66 28 20 70 4c 69 73 74 20 29 20 65 78 70 72  if( pList ) expr
ead0: 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ListDeleteNN(db,
eae0: 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
eaf0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
eb00: 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45  wise-OR of all E
eb10: 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 73  xpr.flags fields
eb20: 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   in the given.**
eb30: 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33   ExprList..*/.u3
eb40: 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  2 sqlite3ExprLis
eb50: 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78 70  tFlags(const Exp
eb60: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
eb70: 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d 20   int i;.  u32 m 
eb80: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
eb90: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 66 6f 72  List!=0 );.  for
eba0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
ebb0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
ebc0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
ebd0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
ebe0: 3b 0a 20 20 20 20 20 61 73 73 65 72 74 28 20 70  ;.     assert( p
ebf0: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
ec00: 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67  m |= pExpr->flag
ec10: 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  s;.  }.  return 
ec20: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  m;.}../*.** This
ec30: 20 69 73 20 61 20 53 45 4c 45 43 54 2d 6e 6f 64   is a SELECT-nod
ec40: 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  e callback for t
ec50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61  he expression wa
ec60: 6c 6b 65 72 20 74 68 61 74 0a 2a 2a 20 61 6c 77  lker that.** alw
ec70: 61 79 73 20 22 66 61 69 6c 73 22 2e 20 20 42 79  ays "fails".  By
ec80: 20 22 66 61 69 6c 22 20 69 6e 20 74 68 69 73 20   "fail" in this 
ec90: 63 61 73 65 2c 20 77 65 20 6d 65 61 6e 20 73 65  case, we mean se
eca0: 74 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 65 43  t.** pWalker->eC
ecb0: 6f 64 65 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20  ode to zero and 
ecc0: 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abort..**.** Thi
ecd0: 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 75 73  s callback is us
ece0: 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 65  ed by multiple e
ecf0: 78 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72  xpression walker
ed00: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
ed10: 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28  3SelectWalkFail(
ed20: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
ed30: 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
ed40: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
ed50: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
ed60: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
ed70: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
ed80: 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 0a 2f 2a 0a  RC_Abort;.}../*.
ed90: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
eda0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
edb0: 20 49 44 20 77 69 74 68 20 74 68 65 20 6e 61 6d   ID with the nam
edc0: 65 20 22 74 72 75 65 22 20 6f 72 20 22 66 61 6c  e "true" or "fal
edd0: 73 65 22 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 76  se".** then conv
ede0: 65 72 74 20 69 74 20 69 6e 74 6f 20 61 6e 20 54  ert it into an T
edf0: 4b 5f 54 52 55 45 46 41 4c 53 45 20 74 65 72 6d  K_TRUEFALSE term
ee00: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
ee10: 72 6f 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e  ro if.** the con
ee20: 76 65 72 73 69 6f 6e 20 68 61 70 70 65 6e 65 64  version happened
ee30: 2c 20 61 6e 64 20 7a 65 72 6f 20 69 66 20 74 68  , and zero if th
ee40: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ee50: 75 6e 61 6c 74 65 72 65 64 2e 0a 2a 2f 0a 69 6e  unaltered..*/.in
ee60: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 64 54  t sqlite3ExprIdT
ee70: 6f 54 72 75 65 46 61 6c 73 65 28 45 78 70 72 20  oTrueFalse(Expr 
ee80: 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65 72  *pExpr){.  asser
ee90: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
eea0: 5f 49 44 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _ID || pExpr->op
eeb0: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20  ==TK_STRING );. 
eec0: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
eed0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
eee0: 51 75 6f 74 65 64 29 0a 20 20 20 26 26 20 28 73  Quoted).   && (s
eef0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
ef00: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22  xpr->u.zToken, "
ef10: 74 72 75 65 22 29 3d 3d 30 0a 20 20 20 20 20 20  true")==0.      
ef20: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
ef30: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
ef40: 65 6e 2c 20 22 66 61 6c 73 65 22 29 3d 3d 30 29  en, "false")==0)
ef50: 0a 20 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d  .  ){.    pExpr-
ef60: 3e 6f 70 20 3d 20 54 4b 5f 54 52 55 45 46 41 4c  >op = TK_TRUEFAL
ef70: 53 45 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50  SE;.    ExprSetP
ef80: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 70  roperty(pExpr, p
ef90: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34  Expr->u.zToken[4
efa0: 5d 3d 3d 30 20 3f 20 45 50 5f 49 73 54 72 75 65  ]==0 ? EP_IsTrue
efb0: 20 3a 20 45 50 5f 49 73 46 61 6c 73 65 29 3b 0a   : EP_IsFalse);.
efc0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
efd0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
efe0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
eff0: 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20 54 4b  ent must be a TK
f000: 5f 54 52 55 45 46 41 4c 53 45 20 45 78 70 72 20  _TRUEFALSE Expr 
f010: 6e 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 31 20  node.  Return 1 
f020: 69 66 20 69 74 20 69 73 20 54 52 55 45 0a 2a 2a  if it is TRUE.**
f030: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 73 20   and 0 if it is 
f040: 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71  FALSE..*/.int sq
f050: 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61  lite3ExprTruthVa
f060: 6c 75 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  lue(const Expr *
f070: 70 45 78 70 72 29 7b 0a 20 20 70 45 78 70 72 20  pExpr){.  pExpr 
f080: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
f090: 70 43 6f 6c 6c 61 74 65 28 28 45 78 70 72 2a 29  pCollate((Expr*)
f0a0: 70 45 78 70 72 29 3b 0a 20 20 61 73 73 65 72 74  pExpr);.  assert
f0b0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f0c0: 54 52 55 45 46 41 4c 53 45 20 29 3b 0a 20 20 61  TRUEFALSE );.  a
f0d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74  ssert( sqlite3St
f0e0: 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
f0f0: 54 6f 6b 65 6e 2c 22 74 72 75 65 22 29 3d 3d 30  Token,"true")==0
f100: 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
f110: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
f120: 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 66 61 6c 73 65  >u.zToken,"false
f130: 22 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  ")==0 );.  retur
f140: 6e 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  n pExpr->u.zToke
f150: 6e 5b 34 5d 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  n[4]==0;.}../*.*
f160: 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 6e  * If pExpr is an
f170: 20 41 4e 44 20 6f 72 20 4f 52 20 65 78 70 72 65   AND or OR expre
f180: 73 73 69 6f 6e 2c 20 74 72 79 20 74 6f 20 73 69  ssion, try to si
f190: 6d 70 6c 69 66 79 20 69 74 20 62 79 20 65 6c 69  mplify it by eli
f1a0: 6d 69 6e 61 74 69 6e 67 0a 2a 2a 20 74 65 72 6d  minating.** term
f1b0: 73 20 74 68 61 74 20 61 72 65 20 61 6c 77 61 79  s that are alway
f1c0: 73 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 2e  s true or false.
f1d0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 6d    Return the sim
f1e0: 70 6c 69 66 69 65 64 20 65 78 70 72 65 73 73 69  plified expressi
f1f0: 6f 6e 2e 0a 2a 2a 20 4f 72 20 72 65 74 75 72 6e  on..** Or return
f200: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78   the original ex
f210: 70 72 65 73 73 69 6f 6e 20 69 66 20 6e 6f 20 73  pression if no s
f220: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 69 73  implification is
f230: 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a   possible..**.**
f240: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
f250: 20 20 20 20 20 28 78 3c 31 30 29 20 41 4e 44 20       (x<10) AND 
f260: 74 72 75 65 20 20 20 20 20 20 20 20 20 20 20 20  true            
f270: 20 20 20 20 3d 3e 20 20 20 28 78 3c 31 30 29 0a      =>   (x<10).
f280: 2a 2a 20 20 20 20 20 28 78 3c 31 30 29 20 41 4e  **     (x<10) AN
f290: 44 20 66 61 6c 73 65 20 20 20 20 20 20 20 20 20  D false         
f2a0: 20 20 20 20 20 20 3d 3e 20 20 20 66 61 6c 73 65        =>   false
f2b0: 0a 2a 2a 20 20 20 20 20 28 78 3c 31 30 29 20 41  .**     (x<10) A
f2c0: 4e 44 20 28 79 3d 32 32 20 4f 52 20 66 61 6c 73  ND (y=22 OR fals
f2d0: 65 29 20 20 20 20 20 3d 3e 20 20 20 28 78 3c 31  e)     =>   (x<1
f2e0: 30 29 20 41 4e 44 20 28 79 3d 32 32 29 0a 2a 2a  0) AND (y=22).**
f2f0: 20 20 20 20 20 28 78 3c 31 30 29 20 41 4e 44 20       (x<10) AND 
f300: 28 79 3d 32 32 20 4f 52 20 74 72 75 65 29 20 20  (y=22 OR true)  
f310: 20 20 20 20 3d 3e 20 20 20 28 78 3c 31 30 29 0a      =>   (x<10).
f320: 2a 2a 20 20 20 20 20 28 79 3d 32 32 29 20 4f 52  **     (y=22) OR
f330: 20 74 72 75 65 20 20 20 20 20 20 20 20 20 20 20   true           
f340: 20 20 20 20 20 20 3d 3e 20 20 20 74 72 75 65 0a        =>   true.
f350: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
f360: 45 78 70 72 53 69 6d 70 6c 69 66 69 65 64 41 6e  ExprSimplifiedAn
f370: 64 4f 72 28 45 78 70 72 20 2a 70 45 78 70 72 29  dOr(Expr *pExpr)
f380: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  {.  assert( pExp
f390: 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45  r!=0 );.  if( pE
f3a0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  xpr->op==TK_AND 
f3b0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
f3c0: 5f 4f 52 20 29 7b 0a 20 20 20 20 45 78 70 72 20  _OR ){.    Expr 
f3d0: 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  *pRight = sqlite
f3e0: 33 45 78 70 72 53 69 6d 70 6c 69 66 69 65 64 41  3ExprSimplifiedA
f3f0: 6e 64 4f 72 28 70 45 78 70 72 2d 3e 70 52 69 67  ndOr(pExpr->pRig
f400: 68 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  ht);.    Expr *p
f410: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
f420: 70 72 53 69 6d 70 6c 69 66 69 65 64 41 6e 64 4f  prSimplifiedAndO
f430: 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  r(pExpr->pLeft);
f440: 0a 20 20 20 20 69 66 28 20 45 78 70 72 41 6c 77  .    if( ExprAlw
f450: 61 79 73 54 72 75 65 28 70 4c 65 66 74 29 20 7c  aysTrue(pLeft) |
f460: 7c 20 45 78 70 72 41 6c 77 61 79 73 46 61 6c 73  | ExprAlwaysFals
f470: 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  e(pRight) ){.   
f480: 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
f490: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 3f 20 70  ->op==TK_AND ? p
f4a0: 52 69 67 68 74 20 3a 20 70 4c 65 66 74 3b 0a 20  Right : pLeft;. 
f4b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70     }else if( Exp
f4c0: 72 41 6c 77 61 79 73 54 72 75 65 28 70 52 69 67  rAlwaysTrue(pRig
f4d0: 68 74 29 20 7c 7c 20 45 78 70 72 41 6c 77 61 79  ht) || ExprAlway
f4e0: 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 29 7b  sFalse(pLeft) ){
f4f0: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
f500: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  Expr->op==TK_AND
f510: 20 3f 20 70 4c 65 66 74 20 3a 20 70 52 69 67 68   ? pLeft : pRigh
f520: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
f530: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
f540: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  ./*.** These rou
f550: 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72  tines are Walker
f560: 20 63 61 6c 6c 62 61 63 6b 73 20 75 73 65 64 20   callbacks used 
f570: 74 6f 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  to check express
f580: 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69  ions to.** see i
f590: 66 20 74 68 65 79 20 61 72 65 20 22 63 6f 6e 73  f they are "cons
f5a0: 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20 64  tant" for some d
f5b0: 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e  efinition of con
f5c0: 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57  stant.  The.** W
f5d0: 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75  alker.eCode valu
f5e0: 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65  e determines the
f5f0: 20 74 79 70 65 20 6f 66 20 22 63 6f 6e 73 74 61   type of "consta
f600: 6e 74 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  nt" we are looki
f610: 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a  ng.** for..**.**
f620: 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20   These callback 
f630: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
f640: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
f650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
f660: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
f670: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20  xprIsConstant() 
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f690: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f6a0: 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =1.**     sqlite
f6b0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
f6c0: 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20  otJoin()        
f6d0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
f6e0: 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==2.**     sqli
f6f0: 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
f700: 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20  nstant()        
f710: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f720: 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71  ode==3.**     sq
f730: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
f740: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20  antOrFunction() 
f750: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
f760: 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a  eCode==4 or 5.**
f770: 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  .** In all cases
f780: 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 20  , the callbacks 
f790: 73 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  set Walker.eCode
f7a0: 3d 30 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20  =0 and abort if 
f7b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
f7c0: 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f  * is found to no
f7d0: 74 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e  t be a constant.
f7e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
f7f0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
f800: 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 69 73 20  OrFunction() is 
f810: 75 73 65 64 20 66 6f 72 20 65 76 61 6c 75 61 74  used for evaluat
f820: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ing expressions.
f830: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
f840: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
f850: 20 54 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64   The Walker.eCod
f860: 65 20 76 61 6c 75 65 20 69 73 20 35 20 77 68 65  e value is 5 whe
f870: 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20  n parsing.** an 
f880: 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 20  existing schema 
f890: 61 6e 64 20 34 20 77 68 65 6e 20 70 72 6f 63 65  and 4 when proce
f8a0: 73 73 69 6e 67 20 61 20 6e 65 77 20 73 74 61 74  ssing a new stat
f8b0: 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a  ement.  A bound.
f8c0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 72 61 69  ** parameter rai
f8d0: 73 65 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72  ses an error for
f8e0: 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 73 2c   new statements,
f8f0: 20 62 75 74 20 69 73 20 73 69 6c 65 6e 74 6c 79   but is silently
f900: 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f   converted.** to
f910: 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73 74 69   NULL for existi
f920: 6e 67 20 73 63 68 65 6d 61 73 2e 20 20 54 68 69  ng schemas.  Thi
f930: 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f  s allows sqlite_
f940: 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 74 68  master tables th
f950: 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61  at .** contain a
f960: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
f970: 20 62 65 63 61 75 73 65 20 74 68 65 79 20 77 65   because they we
f980: 72 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  re generated by 
f990: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a  older versions.*
f9a0: 2a 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 62  * of SQLite to b
f9b0: 65 20 70 61 72 73 65 64 20 62 79 20 6e 65 77 65  e parsed by newe
f9c0: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
f9d0: 4c 69 74 65 20 77 69 74 68 6f 75 74 20 72 61 69  Lite without rai
f9e0: 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72  sing a.** malfor
f9f0: 6d 65 64 20 73 63 68 65 6d 61 20 65 72 72 6f 72  med schema error
fa00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fa10: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
fa20: 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
fa30: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
fa40: 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b  {..  /* If pWalk
fa50: 65 72 2d 3e 65 43 6f 64 65 20 69 73 20 32 20 74  er->eCode is 2 t
fa60: 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20  hen any term of 
fa70: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
fa80: 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20  hat comes from. 
fa90: 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   ** the ON or US
faa0: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
fab0: 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73 71 75   left join disqu
fac0: 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72  alifies the expr
fad0: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d  ession.  ** from
fae0: 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
faf0: 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20  d constant. */. 
fb00: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43   if( pWalker->eC
fb10: 6f 64 65 3d 3d 32 20 26 26 20 45 78 70 72 48 61  ode==2 && ExprHa
fb20: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
fb30: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
fb40: 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  .    pWalker->eC
fb50: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ode = 0;.    ret
fb60: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
fb70: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
fb80: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
fb90: 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74  * Consider funct
fba0: 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74  ions to be const
fbb0: 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72  ant if all their
fbc0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63   arguments are c
fbd0: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61  onstant.    ** a
fbe0: 6e 64 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65  nd either pWalke
fbf0: 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35  r->eCode==4 or 5
fc00: 20 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   or the function
fc10: 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20   has the.    ** 
fc20: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53  SQLITE_FUNC_CONS
fc30: 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63  T flag. */.    c
fc40: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
fc50: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
fc60: 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20  er->eCode>=4 || 
fc70: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
fc80: 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75  pExpr,EP_ConstFu
fc90: 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nc) ){.        r
fca0: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
fcb0: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ue;.      }else{
fcc0: 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  .        pWalker
fcd0: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
fce0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
fcf0: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
fd00: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20     case TK_ID:. 
fd10: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
fd20: 22 74 72 75 65 22 20 6f 72 20 22 66 61 6c 73 65  "true" or "false
fd30: 22 20 69 6e 20 61 20 44 45 46 41 55 4c 54 20 63  " in a DEFAULT c
fd40: 6c 61 75 73 65 20 69 6e 74 6f 20 74 68 65 0a 20  lause into the. 
fd50: 20 20 20 20 20 2a 2a 20 61 70 70 72 6f 70 72 69       ** appropri
fd60: 61 74 65 20 54 4b 5f 54 52 55 45 46 41 4c 53 45  ate TK_TRUEFALSE
fd70: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
fd80: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
fd90: 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28  prIdToTrueFalse(
fda0: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
fdb0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
fdc0: 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
fdd0: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a    /* Fall thru *
fde0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  /.    case TK_CO
fdf0: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
fe00: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
fe10: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
fe20: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65  COLUMN:.      te
fe30: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
fe40: 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20  p==TK_ID );.    
fe50: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
fe60: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
fe70: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
fe80: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
fe90: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
fea0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
feb0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
fec0: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
fed0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
fee0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
fef0: 50 5f 46 69 78 65 64 43 6f 6c 29 20 26 26 20 70  P_FixedCol) && p
ff00: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 21 3d 32  Walker->eCode!=2
ff10: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
ff20: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
ff30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ff40: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
ff50: 65 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69  e==3 && pExpr->i
ff60: 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Table==pWalker->
ff70: 75 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20  u.iCur ){.      
ff80: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
ff90: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
ffa0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
ffb0: 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
ffc0: 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a   TK_IF_NULL_ROW:
ffd0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
ffe0: 49 53 54 45 52 3a 0a 20 20 20 20 20 20 74 65 73  ISTER:.      tes
fff0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
10000 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
10010 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10020 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
10030 46 5f 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20  F_NULL_ROW );.  
10040 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
10050 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  de = 0;.      re
10060 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
10070 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
10080 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  ABLE:.      if( 
10090 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
100a0 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  5 ){.        /* 
100b0 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  Silently convert
100c0 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
100d0 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
100e0 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20  side of CREATE. 
100f0 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d         ** statem
10100 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c  ents into a NULL
10110 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68   when parsing th
10120 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
10130 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20  nt text out.    
10140 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71      ** of the sq
10150 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
10160 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78  e */.        pEx
10170 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
10180 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
10190 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
101a0 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==4 ){.        /
101b0 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  * A bound parame
101c0 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20  ter in a CREATE 
101d0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f  statement that o
101e0 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20  riginates from. 
101f0 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65         ** sqlite
10200 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73  3_prepare() caus
10210 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  es an error */. 
10220 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
10230 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
10240 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
10250 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
10260 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
10270 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c  gh */.    defaul
10280 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t:.      testcas
10290 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
102a0 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 71  _SELECT ); /* sq
102b0 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
102c0 61 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20  ail() disallows 
102d0 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
102e0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
102f0 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 71  _EXISTS ); /* sq
10300 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
10310 61 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20  ail() disallows 
10320 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10330 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
10340 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65  }.}.static int e
10350 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20  xprIsConst(Expr 
10360 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67  *p, int initFlag
10370 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57  , int iCur){.  W
10380 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f  alker w;.  w.eCo
10390 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20  de = initFlag;. 
103a0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
103b0 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e   = exprNodeIsCon
103c0 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65  stant;.  w.xSele
103d0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  ctCallback = sql
103e0 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61  ite3SelectWalkFa
103f0 69 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  il;.#ifdef SQLIT
10400 45 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c  E_DEBUG.  w.xSel
10410 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
10420 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
10430 41 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a  Assert2;.#endif.
10440 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 43 75    w.u.iCur = iCu
10450 72 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  r;.  sqlite3Walk
10460 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
10470 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d  eturn w.eCode;.}
10480 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
10490 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
104a0 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
104b0 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
104c0 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
104d0 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
104e0 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
104f0 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
10500 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  lls..**.** For t
10510 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
10520 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
10530 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
10540 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
10550 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
10560 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
10570 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
10580 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
10590 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
105a0 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
105b0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
105c0 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  nt(Expr *p){.  r
105d0 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
105e0 74 28 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f  t(p, 1, 0);.}../
105f0 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
10600 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
10610 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
10620 66 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 74 68  f.**.**   (1) th
10630 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10640 63 6f 6e 73 74 61 6e 74 2c 20 61 6e 64 0a 2a 2a  constant, and.**
10650 20 20 20 28 32 29 20 74 68 65 20 65 78 70 72 65     (2) the expre
10660 73 73 69 6f 6e 20 64 6f 65 73 20 6f 72 69 67 69  ssion does origi
10670 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 20 6f  nate in the ON o
10680 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a  r USING clause.*
10690 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46  *       of a LEF
106a0 54 20 4a 4f 49 4e 2c 20 61 6e 64 0a 2a 2a 20 20  T JOIN, and.**  
106b0 20 28 33 29 20 74 68 65 20 65 78 70 72 65 73 73   (3) the express
106c0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ion does not con
106d0 74 61 69 6e 20 61 6e 79 20 45 50 5f 46 69 78 65  tain any EP_Fixe
106e0 64 43 6f 6c 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a  dCol TK_COLUMN.*
106f0 2a 20 20 20 20 20 20 20 6f 70 65 72 61 6e 64 73  *       operands
10700 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
10710 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61  constant propaga
10720 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tion optimizatio
10730 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  n..**.** When th
10740 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
10750 6e 73 20 74 72 75 65 2c 20 69 74 20 69 6e 64 69  ns true, it indi
10760 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 65  cates that the e
10770 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 61 6e  xpression.** can
10780 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
10790 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
107a0 78 70 72 20 6c 69 73 74 20 61 6e 64 20 65 76 61  xpr list and eva
107b0 6c 75 61 74 65 64 20 6f 6e 63 65 20 77 68 65 6e  luated once when
107c0 0a 2a 2a 20 74 68 65 20 70 72 65 70 61 72 65 64  .** the prepared
107d0 20 73 74 61 74 65 6d 65 6e 74 20 73 74 61 72 74   statement start
107e0 73 20 75 70 2e 20 20 53 65 65 20 73 71 6c 69 74  s up.  See sqlit
107f0 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
10800 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
10810 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
10820 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29  NotJoin(Expr *p)
10830 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
10840 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b  sConst(p, 2, 0);
10850 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
10860 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
10870 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
10880 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
10890 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
108a0 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e  t.** for any sin
108b0 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74  gle row of the t
108c0 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
108d0 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72   iCur.  In other
108e0 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65   words, the.** e
108f0 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e  xpression must n
10900 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20  ot refer to any 
10910 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
10920 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61  c function nor a
10930 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65  ny.** table othe
10940 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a  r than iCur..*/.
10950 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
10960 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45  sTableConstant(E
10970 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72  xpr *p, int iCur
10980 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
10990 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43  IsConst(p, 3, iC
109a0 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73  ur);.}.../*.** s
109b0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29  qlite3WalkExpr()
109c0 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62   callback used b
109d0 79 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  y sqlite3ExprIsC
109e0 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79  onstantOrGroupBy
109f0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
10a00 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  t exprNodeIsCons
10a10 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 57 61  tantOrGroupBy(Wa
10a20 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
10a30 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45  xpr *pExpr){.  E
10a40 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
10a50 79 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  y = pWalker->u.p
10a60 47 72 6f 75 70 42 79 3b 0a 20 20 69 6e 74 20 69  GroupBy;.  int i
10a70 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
10a80 20 70 45 78 70 72 20 69 73 20 69 64 65 6e 74 69   pExpr is identi
10a90 63 61 6c 20 74 6f 20 61 6e 79 20 47 52 4f 55 50  cal to any GROUP
10aa0 20 42 59 20 74 65 72 6d 2e 20 49 66 20 73 6f 2c   BY term. If so,
10ab0 20 63 6f 6e 73 69 64 65 72 0a 20 20 2a 2a 20 69   consider.  ** i
10ac0 74 20 63 6f 6e 73 74 61 6e 74 2e 20 20 2a 2f 0a  t constant.  */.
10ad0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72    for(i=0; i<pGr
10ae0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
10af0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
10b00 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  = pGroupBy->a[i]
10b10 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
10b20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
10b30 72 65 28 30 2c 20 70 45 78 70 72 2c 20 70 2c 20  re(0, pExpr, p, 
10b40 2d 31 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 43  -1)<2 ){.      C
10b50 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
10b60 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
10b70 6c 53 65 71 28 70 57 61 6c 6b 65 72 2d 3e 70 50  lSeq(pWalker->pP
10b80 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
10b90 69 66 28 20 73 71 6c 69 74 65 33 49 73 42 69 6e  if( sqlite3IsBin
10ba0 61 72 79 28 70 43 6f 6c 6c 29 20 29 7b 0a 20 20  ary(pColl) ){.  
10bb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
10bc0 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  _Prune;.      }.
10bd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10be0 43 68 65 63 6b 20 69 66 20 70 45 78 70 72 20 69  Check if pExpr i
10bf0 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  s a sub-select. 
10c00 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 20  If so, consider 
10c10 69 74 20 76 61 72 69 61 62 6c 65 2e 20 2a 2f 0a  it variable. */.
10c20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
10c30 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
10c40 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
10c50 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
10c60 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
10c70 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
10c80 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 4e 6f  .  return exprNo
10c90 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 70 57 61  deIsConstant(pWa
10ca0 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  lker, pExpr);.}.
10cb0 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68 65 20  ./*.** Walk the 
10cc0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
10cd0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
10ce0 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65  rst argument. Re
10cf0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  turn non-zero.**
10d00 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
10d10 6f 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  on consists enti
10d20 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74  rely of constant
10d30 73 20 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 74  s or copies of t
10d40 65 72 6d 73 20 0a 2a 2a 20 69 6e 20 70 47 72 6f  erms .** in pGro
10d50 75 70 42 79 20 74 68 61 74 20 73 6f 72 74 20 77  upBy that sort w
10d60 69 74 68 20 74 68 65 20 42 49 4e 41 52 59 20 63  ith the BINARY c
10d70 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
10d80 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
10d90 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
10da0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20   determine if a 
10db0 74 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49  term of the HAVI
10dc0 4e 47 20 63 6c 61 75 73 65 20 63 61 6e 0a 2a 2a  NG clause can.**
10dd0 20 62 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 74   be promoted int
10de0 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
10df0 73 65 2e 20 20 49 6e 20 6f 72 64 65 72 20 66 6f  se.  In order fo
10e00 72 20 73 75 63 68 20 61 20 70 72 6f 6d 6f 74 69  r such a promoti
10e10 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74  on to work,.** t
10e20 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
10e30 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 74 65  HAVING clause te
10e40 72 6d 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  rm must be the s
10e50 61 6d 65 20 66 6f 72 20 61 6c 6c 20 6d 65 6d 62  ame for all memb
10e60 65 72 73 20 6f 66 0a 2a 2a 20 61 20 22 67 72 6f  ers of.** a "gro
10e70 75 70 22 2e 20 20 54 68 65 20 72 65 71 75 69 72  up".  The requir
10e80 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 47  ement that the G
10e90 52 4f 55 50 20 42 59 20 74 65 72 6d 20 6d 75 73  ROUP BY term mus
10ea0 74 20 62 65 20 42 49 4e 41 52 59 0a 2a 2a 20 61  t be BINARY.** a
10eb0 73 73 75 6d 65 73 20 74 68 61 74 20 6e 6f 20 6f  ssumes that no o
10ec0 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ther collating s
10ed0 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 68 61 76  equence will hav
10ee0 65 20 61 20 66 69 6e 65 72 2d 67 72 61 69 6e 65  e a finer-graine
10ef0 64 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 20 74 68  d.** grouping th
10f00 61 6e 20 62 69 6e 61 72 79 2e 20 20 49 6e 20 6f  an binary.  In o
10f10 74 68 65 72 20 77 6f 72 64 73 20 28 41 3d 42 20  ther words (A=B 
10f20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 29 20  COLLATE binary) 
10f30 69 6d 70 6c 69 65 73 0a 2a 2a 20 41 3d 42 20 69  implies.** A=B i
10f40 6e 20 65 76 65 72 79 20 6f 74 68 65 72 20 63 6f  n every other co
10f50 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10f60 2e 20 20 54 68 65 20 72 65 71 75 69 72 65 6d 65  .  The requireme
10f70 6e 74 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 47  nt that the.** G
10f80 52 4f 55 50 20 42 59 20 62 65 20 42 49 4e 41 52  ROUP BY be BINAR
10f90 59 20 69 73 20 73 74 72 69 63 74 65 72 20 74 68  Y is stricter th
10fa0 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 20 49  an necessary.  I
10fb0 74 20 77 6f 75 6c 64 20 61 6c 73 6f 20 77 6f 72  t would also wor
10fc0 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d 6f 74 65 20  k.** to promote 
10fd0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 74  HAVING clauses t
10fe0 68 61 74 20 75 73 65 20 74 68 65 20 73 61 6d 65  hat use the same
10ff0 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
11000 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
11010 63 65 20 61 73 20 74 68 65 20 47 52 4f 55 50 20  ce as the GROUP 
11020 42 59 20 74 65 72 6d 2c 20 62 75 74 20 74 68 61  BY term, but tha
11030 74 20 69 73 20 6d 75 63 68 20 68 61 72 64 65 72  t is much harder
11040 20 74 6f 20 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c   to check,.** al
11050 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74  ternative collat
11060 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61 72  ing sequences ar
11070 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20  e uncommon, and 
11080 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 61 6e 0a  this is only an.
11090 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ** optimization,
110a0 20 73 6f 20 77 65 20 74 61 6b 65 20 74 68 65 20   so we take the 
110b0 65 61 73 79 20 77 61 79 20 6f 75 74 20 61 6e 64  easy way out and
110c0 20 73 69 6d 70 6c 79 20 72 65 71 75 69 72 65 20   simply require 
110d0 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20  the.** GROUP BY 
110e0 74 6f 20 75 73 65 20 74 68 65 20 42 49 4e 41 52  to use the BINAR
110f0 59 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  Y collating sequ
11100 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ence..*/.int sql
11110 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
11120 6e 74 4f 72 47 72 6f 75 70 42 79 28 50 61 72 73  ntOrGroupBy(Pars
11130 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
11140 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 47  *p, ExprList *pG
11150 72 6f 75 70 42 79 29 7b 0a 20 20 57 61 6c 6b 65  roupBy){.  Walke
11160 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  r w;.  w.eCode =
11170 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   1;.  w.xExprCal
11180 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
11190 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75  IsConstantOrGrou
111a0 70 42 79 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  pBy;.  w.xSelect
111b0 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Callback = 0;.  
111c0 77 2e 75 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  w.u.pGroupBy = p
111d0 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 70 50 61  GroupBy;.  w.pPa
111e0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
111f0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
11200 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
11210 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   w.eCode;.}../*.
11220 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
11230 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
11240 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
11250 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
11260 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72  s constant.** or
11270 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
11280 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61   with constant a
11290 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72  rguments.  Retur
112a0 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72 65  n and 0 if there
112b0 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69  .** are any vari
112c0 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ables..**.** For
112d0 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
112e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
112f0 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  a double-quoted 
11300 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63  string (ex: "abc
11310 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  ").** is conside
11320 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62  red a variable b
11330 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74  ut a single-quot
11340 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27  ed string (ex: '
11350 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f  abc') is.** a co
11360 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  nstant..*/.int s
11370 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
11380 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45  tantOrFunction(E
11390 78 70 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69  xpr *p, u8 isIni
113a0 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  t){.  assert( is
113b0 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69  Init==0 || isIni
113c0 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==1 );.  return
113d0 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
113e0 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a  4+isInit, 0);.}.
113f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11400 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
11410 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  TS./*.** Walk an
11420 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
11430 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
11440 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  he expression co
11450 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71  ntains a.** subq
11460 75 65 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e  uery of some kin
11470 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
11480 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73 75 62  there are no sub
11490 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20  queries..*/.int 
114a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61  sqlite3ExprConta
114b0 69 6e 73 53 75 62 71 75 65 72 79 28 45 78 70 72  insSubquery(Expr
114c0 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77   *p){.  Walker w
114d0 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b  ;.  w.eCode = 1;
114e0 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
114f0 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
11500 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53  WalkNoop;.  w.xS
11510 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
11520 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
11530 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66 20 53 51  kFail;.#ifdef SQ
11540 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77 2e 78  LITE_DEBUG.  w.x
11550 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
11560 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  = sqlite3SelectW
11570 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e 64  alkAssert2;.#end
11580 69 66 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  if.  sqlite3Walk
11590 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
115a0 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30  eturn w.eCode==0
115b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
115c0 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
115d0 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f  ion p codes a co
115e0 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
115f0 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
11600 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
11610 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
11620 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
11630 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
11640 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
11650 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
11660 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
11670 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
11680 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
11690 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
116a0 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
116b0 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
116c0 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
116d0 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
116e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
116f0 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70  xprIsInteger(Exp
11700 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75  r *p, int *pValu
11710 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  e){.  int rc = 0
11720 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ;.  if( NEVER(p=
11730 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  =0) ) return 0; 
11740 20 2f 2a 20 55 73 65 64 20 74 6f 20 6f 6e 6c 79   /* Used to only
11750 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e   happen followin
11760 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f  g on OOM */..  /
11770 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69  * If an expressi
11780 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  on is an integer
11790 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69   literal that fi
117a0 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  ts in a signed 3
117b0 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67  2-bit.  ** integ
117c0 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f  er, then the EP_
117d0 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69  IntValue flag wi
117e0 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
117f0 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73  been set */.  as
11800 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
11810 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66  INTEGER || (p->f
11820 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
11830 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ue)!=0.         
11840 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49    || sqlite3GetI
11850 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  nt32(p->u.zToken
11860 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20  , &rc)==0 );..  
11870 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
11880 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
11890 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75    *pValue = p->u
118a0 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74  .iValue;.    ret
118b0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69  urn 1;.  }.  swi
118c0 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
118d0 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
118e0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
118f0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
11900 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61  er(p->pLeft, pVa
11910 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
11920 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11930 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
11940 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20       int v;.    
11950 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
11960 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
11970 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  eft, &v) ){.    
11980 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28      assert( v!=(
11990 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29 20 29  -2147483647-1) )
119a0 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75  ;.        *pValu
119b0 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20  e = -v;.        
119c0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
119d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
119e0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
119f0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
11a00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11a10 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
11a20 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
11a30 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70  nce that the exp
11a40 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e  ression can be N
11a50 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ULL..**.** If th
11a60 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67  e expression mig
11a70 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66  ht be NULL or if
11a80 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
11a90 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a  is too complex.*
11aa0 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e  * to tell return
11ab0 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54   TRUE.  .**.** T
11ac0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
11ad0 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69  sed as an optimi
11ae0 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20  zation, to skip 
11af0 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65  OP_IsNull opcode
11b00 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f  s.** when we kno
11b10 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63  w that a value c
11b20 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20  annot be NULL.  
11b30 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70  Hence, a false p
11b40 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75  ositive.** (retu
11b50 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20  rning TRUE when 
11b60 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72  in fact the expr
11b70 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72  ession can never
11b80 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a   be NULL) might.
11b90 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65  ** be a small pe
11ba0 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75  rformance hit bu
11bb0 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68  t is otherwise h
11bc0 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65  armless.  On the
11bd0 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20   other.** hand, 
11be0 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  a false negative
11bf0 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53   (returning FALS
11c00 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  E when the resul
11c10 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29  t could be NULL)
11c20 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  .** will likely 
11c30 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
11c40 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20  orrect answer.  
11c50 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74  So when in doubt
11c60 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45  , return.** TRUE
11c70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11c80 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f  ExprCanBeNull(co
11c90 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  nst Expr *p){.  
11ca0 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20  u8 op;.  while( 
11cb0 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
11cc0 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
11cd0 4e 55 53 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  NUS ){.    p = p
11ce0 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 6f  ->pLeft;.  }.  o
11cf0 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
11d00 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
11d10 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
11d20 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
11d30 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
11d40 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
11d50 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73  _STRING:.    cas
11d60 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
11d70 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20  case TK_BLOB:.  
11d80 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
11d90 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
11da0 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 45  :.      return E
11db0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
11dc0 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20  , EP_CanBeNull) 
11dd0 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
11de0 70 2d 3e 79 2e 70 54 61 62 3d 3d 30 20 7c 7c 20  p->y.pTab==0 || 
11df0 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f   /* Reference to
11e00 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
11e10 20 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a   on expression *
11e20 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  /.             (
11e30 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26  p->iColumn>=0 &&
11e40 20 70 2d 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c   p->y.pTab->aCol
11e50 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  [p->iColumn].not
11e60 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65  Null==0);.    de
11e70 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
11e80 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
11e90 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
11ea0 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
11eb0 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e  ression is a con
11ec0 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c  stant which woul
11ed0 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  d be.** unchange
11ee0 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79  d by OP_Affinity
11ef0 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e 69   with the affini
11f00 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ty given in the 
11f10 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
11f20 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
11f30 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
11f40 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
11f50 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  he OP_Affinity o
11f60 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  peration.** can 
11f70 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65  be omitted.  Whe
11f80 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72  n in doubt retur
11f90 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73  n FALSE.  A fals
11fa0 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73  e negative.** is
11fb0 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61   harmless.  A fa
11fc0 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f  lse positive, ho
11fd0 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c  wever, can resul
11fe0 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a  t in the wrong.*
11ff0 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74  * answer..*/.int
12000 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
12010 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
12020 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c  e(const Expr *p,
12030 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38   char aff){.  u8
12040 20 6f 70 3b 0a 20 20 69 6e 74 20 75 6e 61 72 79   op;.  int unary
12050 4d 69 6e 75 73 20 3d 20 30 3b 0a 20 20 69 66 28  Minus = 0;.  if(
12060 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
12070 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31  _BLOB ) return 1
12080 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
12090 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
120a0 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
120b0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  {.    if( p->op=
120c0 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 20 75 6e 61  =TK_UMINUS ) una
120d0 72 79 4d 69 6e 75 73 20 3d 20 31 3b 0a 20 20 20  ryMinus = 1;.   
120e0 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
120f0 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
12100 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
12110 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
12120 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
12130 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
12140 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
12150 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
12160 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
12170 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
12180 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
12190 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
121a0 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72  FLOAT: {.      r
121b0 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
121c0 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66  E_AFF_REAL || af
121d0 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
121e0 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
121f0 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
12200 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
12210 21 75 6e 61 72 79 4d 69 6e 75 73 20 26 26 20 61  !unaryMinus && a
12220 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
12230 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  EXT;.    }.    c
12240 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
12250 20 20 20 20 20 72 65 74 75 72 6e 20 21 75 6e 61       return !una
12260 72 79 4d 69 6e 75 73 3b 0a 20 20 20 20 7d 0a 20  ryMinus;.    }. 
12270 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
12280 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  N: {.      asser
12290 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20  t( p->iTable>=0 
122a0 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20  );  /* p cannot 
122b0 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48 45  be part of a CHE
122c0 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  CK constraint */
122d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
122e0 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20  >iColumn<0.     
122f0 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
12300 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
12310 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
12320 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20  AFF_NUMERIC);.  
12330 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
12340 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
12350 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
12360 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
12370 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
12380 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
12390 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
123a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52  /.int sqlite3IsR
123b0 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20  owid(const char 
123c0 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
123d0 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  e3StrICmp(z, "_R
123e0 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
123f0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
12400 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
12410 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
12420 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
12430 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
12440 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
12450 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
12460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20  .}../*.** pX is 
12470 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e  the RHS of an IN
12480 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 70   operator.  If p
12490 58 20 69 73 20 61 20 53 45 4c 45 43 54 20 73 74  X is a SELECT st
124a0 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  atement .** that
124b0 20 63 61 6e 20 62 65 20 73 69 6d 70 6c 69 66 69   can be simplifi
124c0 65 64 20 74 6f 20 61 20 64 69 72 65 63 74 20 74  ed to a direct t
124d0 61 62 6c 65 20 61 63 63 65 73 73 2c 20 74 68 65  able access, the
124e0 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  n return.** a po
124f0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53 45 4c  inter to the SEL
12500 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
12510 49 66 20 70 58 20 69 73 20 6e 6f 74 20 61 20 53  If pX is not a S
12520 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
12530 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 53 45  .** or if the SE
12540 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6e  LECT statement n
12550 65 65 64 73 20 74 6f 20 62 65 20 6d 61 6e 69 66  eeds to be manif
12560 65 73 74 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ested into a tra
12570 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c  nsient.** table,
12580 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c   then return NUL
12590 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  L..*/.#ifndef SQ
125a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
125b0 52 59 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74  RY.static Select
125c0 20 2a 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72   *isCandidateFor
125d0 49 6e 4f 70 74 28 45 78 70 72 20 2a 70 58 29 7b  InOpt(Expr *pX){
125e0 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20  .  Select *p;.  
125f0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
12600 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
12610 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
12620 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
12630 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
12640 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
12650 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ct) ) return 0; 
12660 20 2f 2a 20 4e 6f 74 20 61 20 73 75 62 71 75 65   /* Not a subque
12670 72 79 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72  ry */.  if( Expr
12680 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
12690 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 20 29  EP_VarSelect)  )
126a0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
126b0 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 20 2a  orrelated subq *
126c0 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 78 2e 70 53  /.  p = pX->x.pS
126d0 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 2d 3e  elect;.  if( p->
126e0 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
126f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12700 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  /* Not a compoun
12710 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  d SELECT */.  if
12720 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
12730 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
12740 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20  Aggregate) ){.  
12750 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
12760 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
12770 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
12780 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
12790 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  nct );.    testc
127a0 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
127b0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
127c0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
127d0 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
127e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
127f0 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65  * No DISTINCT ke
12800 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67  yword and no agg
12810 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
12820 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
12830 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
12840 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
12850 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50   /* Has no GROUP
12860 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
12870 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20  if( p->pLimit ) 
12880 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
12890 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
128a0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f   LIMIT clause */
128b0 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
128c0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
128d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
128e0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
128f0 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   */.  pSrc = p->
12900 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
12910 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSrc!=0 );.  if(
12920 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
12930 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
12940 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65      /* Single te
12950 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  rm in FROM claus
12960 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d  e */.  if( pSrc-
12970 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20  >a[0].pSelect ) 
12980 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
12990 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73   FROM is not a s
129a0 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20  ubquery or view 
129b0 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  */.  pTab = pSrc
129c0 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61  ->a[0].pTab;.  a
129d0 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
129e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
129f0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20  ->pSelect==0 ); 
12a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
12a10 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  OM clause is not
12a20 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28   a view */.  if(
12a30 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
12a40 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
12a50 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
12a60 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  se not a virtual
12a70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69   table */.  pELi
12a80 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
12a90 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
12aa0 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20  !=0 );.  /* All 
12ab0 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d  SELECT results m
12ac0 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20  ust be columns. 
12ad0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
12ae0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
12af0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
12b00 52 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  Res = pEList->a[
12b10 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
12b20 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43  ( pRes->op!=TK_C
12b30 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
12b40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
12b50 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  es->iTable==pSrc
12b60 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[0].iCursor )
12b70 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72  ;  /* Not a corr
12b80 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20  elated subquery 
12b90 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
12ba0 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  p;.}.#endif /* S
12bb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
12bc0 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
12bd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
12be0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
12bf0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 68  ate code that ch
12c00 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  ecks the left-mo
12c10 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  st column of ind
12c20 65 78 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f  ex table iCur to
12c30 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f   see if.** it co
12c40 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20  ntains any NULL 
12c50 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65 20  entries.  Cause 
12c60 74 68 65 20 72 65 67 69 73 74 65 72 20 61 74 20  the register at 
12c70 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65  regHasNull to be
12c80 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e   set.** to a non
12c90 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69  -NULL value if i
12ca0 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  Cur contains no 
12cb0 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65  NULLs.  Cause re
12cc0 67 69 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c  gister regHasNul
12cd0 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74  l.** to be set t
12ce0 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63  o NULL if iCur c
12cf0 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
12d00 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
12d10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12d20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
12d30 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69  lFlag(Vdbe *v, i
12d40 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67  nt iCur, int reg
12d50 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20  HasNull){.  int 
12d60 61 64 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33  addr1;.  sqlite3
12d70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12d80 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
12d90 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72  HasNull);.  addr
12da0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
12db0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
12dc0 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43  nd, iCur); VdbeC
12dd0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
12de0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
12df0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43  v, OP_Column, iC
12e00 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  ur, 0, regHasNul
12e10 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l);.  sqlite3Vdb
12e20 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
12e30 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a  LAG_TYPEOFARG);.
12e40 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
12e50 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69  , "first_entry_i
12e60 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a  n(%d)", iCur));.
12e70 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
12e80 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
12e90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
12ea0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12eb0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
12ec0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
12ed0 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
12ee0 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  th a list (not a
12ef0 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68   subquery) on th
12f00 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64  e .** right-hand
12f10 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54   side.  Return T
12f20 52 55 45 20 69 66 20 74 68 61 74 20 6c 69 73 74  RUE if that list
12f30 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f   is constant..*/
12f40 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
12f50 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61  te3InRhsIsConsta
12f60 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  nt(Expr *pIn){. 
12f70 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69   Expr *pLHS;.  i
12f80 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
12f90 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
12fa0 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65  ty(pIn, EP_xIsSe
12fb0 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20  lect) );.  pLHS 
12fc0 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20  = pIn->pLeft;.  
12fd0 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  pIn->pLeft = 0;.
12fe0 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45    res = sqlite3E
12ff0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49  xprIsConstant(pI
13000 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  n);.  pIn->pLeft
13010 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72   = pLHS;.  retur
13020 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n res;.}.#endif.
13030 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
13040 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
13050 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
13060 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e  on of the IN (..
13070 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .) operator..** 
13080 54 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72  The pX parameter
13090 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69   is the expressi
130a0 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  on on the RHS of
130b0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
130c0 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  , which.** might
130d0 20 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73   be either a lis
130e0 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
130f0 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
13100 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
13110 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
13120 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61   to find or crea
13130 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65  te a b-tree obje
13140 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62  ct that can.** b
13150 65 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f  e used either to
13160 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72   test for member
13170 73 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20  ship in the RHS 
13180 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74  set or to iterat
13190 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c  e through.** all
131a0 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20   members of the 
131b0 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e  RHS set, skippin
131c0 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
131d0 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20  .** A cursor is 
131e0 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d  opened on the b-
131f0 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
13200 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74   is the RHS of t
13210 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
13220 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65  * and pX->iTable
13230 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
13240 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72  ndex of that cur
13250 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  sor..**.** The r
13260 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66  eturned value of
13270 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
13280 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74  ndicates the b-t
13290 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c  ree type, as fol
132a0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e  lows:.**.**   IN
132b0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20  _INDEX_ROWID    
132c0 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
132d0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
132e0 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
132f0 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
13300 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75  EX_ASC  - The cu
13310 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
13320 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
13330 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
13340 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
13350 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
13360 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73   opened on a des
13370 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
13380 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
13390 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75          - The cu
133a0 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
133b0 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63  on a specially c
133c0 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20  reated and.**   
133d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133e0 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
133f0 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
13400 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e  .**   IN_INDEX_N
13410 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63  OOP       - No c
13420 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61  ursor was alloca
13430 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65  ted.  The IN ope
13440 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  rator must be.**
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13460 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65           impleme
13470 6e 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e  nted as a sequen
13480 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
13490 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  s..**.** An exis
134a0 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68  ting b-tree migh
134b0 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  t be used if the
134c0 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   RHS expression 
134d0 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a  pX is a simple.*
134e0 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20  * subquery such 
134f0 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  as:.**.**     SE
13500 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20  LECT <column1>, 
13510 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f  <column2>... FRO
13520 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20  M <table>.**.** 
13530 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
13540 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
13550 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72   a list or a mor
13560 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65  e complex subque
13570 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65  ry, then.** an e
13580 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d  phemeral table m
13590 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20  ight need to be 
135a0 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
135b0 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a  he RHS and then.
135c0 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61  ** pX->iTable ma
135d0 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
135e0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
135f0 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e  le instead of an
13600 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62  .** existing tab
13610 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  le..**.** The in
13620 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
13630 6d 75 73 74 20 63 6f 6e 74 61 69 6e 2c 20 61 74  must contain, at
13640 20 61 20 6d 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20   a minimum, one 
13650 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49  of the bits.** I
13660 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
13670 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c  IP or IN_INDEX_L
13680 4f 4f 50 20 62 75 74 20 6e 6f 74 20 62 6f 74 68  OOP but not both
13690 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f  .  If inFlags co
136a0 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44  ntains.** IN_IND
136b0 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74  EX_MEMBERSHIP, t
136c0 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65  hen the generate
136d0 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  d table will be 
136e0 75 73 65 64 20 66 6f 72 20 61 20 66 61 73 74 0a  used for a fast.
136f0 2a 2a 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  ** membership te
13700 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e  st.  When the IN
13710 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20  _INDEX_LOOP bit 
13720 69 73 20 73 65 74 2c 20 74 68 65 20 49 4e 20 69  is set, the IN i
13730 6e 64 65 78 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  ndex will.** be 
13740 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65  used to loop ove
13750 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
13760 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
13770 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
13780 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f  * When IN_INDEX_
13790 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e  LOOP is used (an
137a0 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c  d the b-tree wil
137b0 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
137c0 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20  rate.** through 
137d0 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29  the set members)
137e0 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   then the b-tree
137f0 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69   must not contai
13800 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  n duplicates..**
13810 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61   An epheremal ta
13820 62 6c 65 20 77 69 6c 6c 20 62 65 20 63 72 65 61  ble will be crea
13830 74 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73  ted unless the s
13840 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20  elected columns 
13850 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 2a  are guaranteed.*
13860 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d  * to be unique -
13870 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
13880 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  it is an INTEGER
13890 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
138a0 64 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51  due to.** a UNIQ
138b0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72  UE constraint or
138c0 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68   index..**.** Wh
138d0 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  en IN_INDEX_MEMB
138e0 45 52 53 48 49 50 20 69 73 20 75 73 65 64 20 28  ERSHIP is used (
138f0 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77  and the b-tree w
13900 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  ill be used .** 
13910 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d  for fast set mem
13920 62 65 72 73 68 69 70 20 74 65 73 74 73 29 20 74  bership tests) t
13930 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61 6c  hen an epheremal
13940 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20   table must .** 
13950 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c  be used unless <
13960 63 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73 69  columns> is a si
13970 6e 67 6c 65 20 49 4e 54 45 47 45 52 20 50 52 49  ngle INTEGER PRI
13980 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
13990 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20  or an .** index 
139a0 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 77 69 74  can be found wit
139b0 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
139c0 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73  <columns> as its
139d0 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a   left-most..**.*
139e0 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45  * If the IN_INDE
139f0 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e  X_NOOP_OK and IN
13a00 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
13a10 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20 61  P are both set a
13a20 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53  nd.** if the RHS
13a30 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
13a40 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e  tor is a list (n
13a50 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 74  ot a subquery) t
13a60 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
13a70 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64 65  ine might decide
13a80 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20 61   that creating a
13a90 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72  n ephemeral b-tr
13aa0 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ee for membershi
13ab0 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20  p.** testing is 
13ac0 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e  too expensive an
13ad0 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45  d return IN_INDE
13ae0 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74  X_NOOP.  In that
13af0 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61   case, the.** ca
13b00 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68  lling routine sh
13b10 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ould implement t
13b20 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75  he IN operator u
13b30 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a  sing a sequence.
13b40 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63  ** of Eq or Ne c
13b50 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
13b60 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ions..**.** When
13b70 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
13b80 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
13b90 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
13ba0 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
13bb0 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65  tion.** might ne
13bc0 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68  ed to know wheth
13bd0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48  er or not the RH
13be0 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  S side of the IN
13bf0 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e   operator.** con
13c00 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49  tains a NULL.  I
13c10 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69  f prRhsHasNull i
13c20 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69  s not a NULL poi
13c30 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20  nter and .** if 
13c40 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61  there is any cha
13c50 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
13c60 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  .) might contain
13c70 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74   a NULL value at
13c80 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65  .** runtime, the
13c90 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  n a register is 
13ca0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
13cb0 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
13cc0 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  r written.** to 
13cd0 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49  *prRhsHasNull. I
13ce0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
13cf0 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
13d00 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ..) contains a.*
13d10 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68  * NULL value, th
13d20 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  en *prRhsHasNull
13d30 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
13d40 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
13d50 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
13d60 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63  ated and its loc
13d70 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20  ation stored in 
13d80 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74  *prRhsHasNull, t
13d90 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  hen.** the value
13da0 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65   in that registe
13db0 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  r will be NULL i
13dc0 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
13dd0 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
13de0 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e.** NULL values
13df0 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65  , and it will be
13e00 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   some non-NULL v
13e10 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74 72  alue if the b-tr
13e20 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a  ee contains no.*
13e30 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  * NULL values..*
13e40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 69 4d 61  *.** If the aiMa
13e50 70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  p parameter is n
13e60 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74  ot NULL, it must
13e70 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72   point to an arr
13e80 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  ay containing.**
13e90 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72   one element for
13ea0 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74   each column ret
13eb0 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
13ec0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
13ed0 20 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74   the RHS.** of t
13ee0 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  he IN(...) opera
13ef0 74 6f 72 2e 20 54 68 65 20 69 27 74 68 20 65 6e  tor. The i'th en
13f00 74 72 79 20 6f 66 20 74 68 65 20 61 72 72 61 79  try of the array
13f10 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
13f20 74 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74  th the.** offset
13f30 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f   of the index co
13f40 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74 63 68 65  lumn that matche
13f50 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d  s the i'th colum
13f60 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  n returned by th
13f70 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72  e.** SELECT. For
13f80 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
13f90 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
13fa0 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78 20 61  selected index a
13fb0 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f  re:.**.**   (?,?
13fc0 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61  ,?) IN (SELECT a
13fd0 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a  , b, c FROM t1).
13fe0 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
13ff0 58 20 69 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c  X i1 ON t1(b, c,
14000 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   a);.**.** then 
14010 61 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c  aiMap[] is popul
14020 61 74 65 64 20 77 69 74 68 20 7b 32 2c 20 30 2c  ated with {2, 0,
14030 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   1}..*/.#ifndef 
14040 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
14050 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
14060 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20 50  FindInIndex(.  P
14070 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
14080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
14090 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
140a0 20 20 45 78 70 72 20 2a 70 58 2c 20 20 20 20 20    Expr *pX,     
140b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
140c0 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
140d0 69 64 65 20 28 52 48 53 29 20 6f 66 20 74 68 65  ide (RHS) of the
140e0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
140f0 20 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 20    u32 inFlags,  
14100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14110 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f  IN_INDEX_LOOP, _
14120 4d 45 4d 42 45 52 53 48 49 50 2c 20 61 6e 64 2f  MEMBERSHIP, and/
14130 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20  or _NOOP_OK */. 
14140 20 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75   int *prRhsHasNu
14150 6c 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ll,         /* R
14160 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
14170 4e 55 4c 4c 20 73 74 61 74 75 73 2e 20 20 53 65  NULL status.  Se
14180 65 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74  e notes */.  int
14190 20 2a 61 69 4d 61 70 2c 20 20 20 20 20 20 20 20   *aiMap,        
141a0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69          /* Mappi
141b0 6e 67 20 66 72 6f 6d 20 49 6e 64 65 78 20 66 69  ng from Index fi
141c0 65 6c 64 73 20 74 6f 20 52 48 53 20 66 69 65 6c  elds to RHS fiel
141d0 64 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54  ds */.  int *piT
141e0 61 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ab              
141f0 20 20 20 2f 2a 20 4f 55 54 3a 20 69 6e 64 65 78     /* OUT: index
14200 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   to use */.){.  
14210 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20  Select *p;      
14220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14230 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
14240 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
14250 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
14260 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20   int eType = 0; 
14270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14280 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
14290 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f  f RHS table. IN_
142a0 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74  INDEX_* */.  int
142b0 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
142c0 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20  nTab++;         
142d0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20     /* Cursor of 
142e0 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f  the RHS table */
142f0 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69  .  int mustBeUni
14300 71 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  que;            
14310 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
14320 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20   if RHS must be 
14330 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65  unique */.  Vdbe
14340 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
14350 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20  Vdbe(pParse);   
14360 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
14370 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
14380 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
14390 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
143a0 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d    mustBeUnique =
143b0 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49   (inFlags & IN_I
143c0 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a  NDEX_LOOP)!=0;..
143d0 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20    /* If the RHS 
143e0 6f 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20  of this IN(...) 
143f0 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 53 45  operator is a SE
14400 4c 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74 20  LECT, and if it 
14410 6d 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77 68  matters .  ** wh
14420 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
14430 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 63   SELECT result c
14440 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c  ontains NULL val
14450 75 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74 68  ues, check wheth
14460 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e  er.  ** or not N
14470 55 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ULL is actually 
14480 70 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61 79  possible (it may
14490 20 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78 61   not be, for exa
144a0 6d 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20  mple, due .  ** 
144b0 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  to NOT NULL cons
144c0 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 73  traints in the s
144d0 63 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55  chema). If no NU
144e0 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f  LL values are po
144f0 73 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74  ssible,.  ** set
14500 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f   prRhsHasNull to
14510 20 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e   0 before contin
14520 75 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20  uing.  */.  if( 
14530 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20  prRhsHasNull && 
14540 28 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pX->flags & EP_
14550 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
14560 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70    int i;.    Exp
14570 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
14580 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pX->x.pSelect->p
14590 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69  EList;.    for(i
145a0 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
145b0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
145c0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
145d0 43 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74  CanBeNull(pEList
145e0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20  ->a[i].pExpr) ) 
145f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14600 20 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e   if( i==pEList->
14610 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  nExpr ){.      p
14620 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b  rRhsHasNull = 0;
14630 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14640 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
14650 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
14660 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  le or index can 
14670 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  be used to.  ** 
14680 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65 72  satisfy the quer
14690 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65 66  y.  This is pref
146a0 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61  erable to genera
146b0 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a  ting a new .  **
146c0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
146d0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
146e0 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28  se->nErr==0 && (
146f0 70 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65 46  p = isCandidateF
14700 6f 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30 20  orInOpt(pX))!=0 
14710 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
14720 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
14730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14740 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
14750 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c  tion */.    Tabl
14760 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
14770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14780 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62     /* Table <tab
14790 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20  le>. */.    i16 
147a0 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
147b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147c0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
147d0 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  dx for pTab */. 
147e0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
147f0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
14800 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
14810 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
14820 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
14830 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20  pEList!=0 );    
14840 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61           /* Beca
14850 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
14860 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
14870 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
14880 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
14890 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61  pr!=0 ); /* Beca
148a0 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
148b0 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
148c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
148d0 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20  pSrc!=0 );      
148e0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61           /* Beca
148f0 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
14900 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
14910 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70  .    pTab = p->p
14920 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
14930 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20  .    /* Code an 
14940 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61  OP_Transaction a
14950 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20  nd OP_TableLock 
14960 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a  for <table>. */.
14970 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
14980 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
14990 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
149a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  );.    sqlite3Co
149b0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
149c0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
149d0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
149e0 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
149f0 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
14a00 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  ab->zName);..   
14a10 20 61 73 73 65 72 74 28 76 29 3b 20 20 2f 2a 20   assert(v);  /* 
14a20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29  sqlite3GetVdbe()
14a30 20 68 61 73 20 61 6c 77 61 79 73 20 62 65 65 6e   has always been
14a40 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
14a50 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45  ed */.    if( nE
14a60 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74  xpr==1 && pEList
14a70 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[0].pExpr->iC
14a80 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
14a90 20 2f 2a 20 54 68 65 20 22 78 20 49 4e 20 28 53   /* The "x IN (S
14aa0 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
14ab0 20 74 61 62 6c 65 29 22 20 63 61 73 65 20 2a 2f   table)" case */
14ac0 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72  .      int iAddr
14ad0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14ae0 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
14af0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
14b00 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20  rage(v);..      
14b10 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
14b20 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
14b30 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
14b40 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54  nRead);.      eT
14b50 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
14b60 4f 57 49 44 3b 0a 20 20 20 20 20 20 45 78 70 6c  OWID;.      Expl
14b70 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
14b80 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20  arse, 0,.       
14b90 20 20 20 20 20 22 55 53 49 4e 47 20 52 4f 57 49       "USING ROWI
14ba0 44 20 53 45 41 52 43 48 20 4f 4e 20 54 41 42 4c  D SEARCH ON TABL
14bb0 45 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52  E %s FOR IN-OPER
14bc0 41 54 4f 52 22 2c 70 54 61 62 2d 3e 7a 4e 61 6d  ATOR",pTab->zNam
14bd0 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
14be0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
14bf0 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65  , iAddr);.    }e
14c00 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
14c10 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
14c40 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
14c50 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
14c60 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  1;.      int i;.
14c70 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
14c80 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
14c90 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
14ca0 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65  sed to perform e
14cb0 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ach .      ** co
14cc0 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20  mparison is the 
14cd0 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69  same as the affi
14ce0 6e 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c  nity of each col
14cf0 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20 20  umn in table.   
14d00 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53     ** on the RHS
14d10 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
14d20 74 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c  tor.  If it not,
14d30 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
14d40 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
14d50 75 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f 66  use any index of
14d60 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e 20   the RHS table. 
14d70 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
14d80 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66  0; i<nExpr && af
14d90 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b  finity_ok; i++){
14da0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
14db0 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63  Lhs = sqlite3Vec
14dc0 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
14dd0 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pX->pLeft, i);. 
14de0 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
14df0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
14e00 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
14e10 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61         char idxa
14e20 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c  ff = sqlite3Tabl
14e30 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  eColumnAffinity(
14e40 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52  pTab,iCol); /* R
14e50 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  HS table */.    
14e60 20 20 20 20 63 68 61 72 20 63 6d 70 61 66 66 20      char cmpaff 
14e70 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
14e80 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69  Affinity(pLhs, i
14e90 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  dxaff);.        
14ea0 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66  testcase( cmpaff
14eb0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
14ec0 42 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  B );.        tes
14ed0 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53  tcase( cmpaff==S
14ee0 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
14ef0 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  ;.        switch
14f00 28 20 63 6d 70 61 66 66 20 29 7b 0a 20 20 20 20  ( cmpaff ){.    
14f10 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
14f20 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20  E_AFF_BLOB:.    
14f30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
14f40 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
14f50 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20  LITE_AFF_TEXT:. 
14f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
14f70 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
14f80 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72 65 74 75  nity() only retu
14f90 72 6e 73 20 54 45 58 54 20 69 66 20 6f 6e 65 20  rns TEXT if one 
14fa0 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20  side or the.    
14fb0 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
14fc0 20 68 61 73 20 6e 6f 20 61 66 66 69 6e 69 74 79   has no affinity
14fd0 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 73   and the other s
14fe0 69 64 65 20 69 73 20 54 45 58 54 2e 20 20 48 65  ide is TEXT.  He
14ff0 6e 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nce,.           
15000 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   ** the only way
15010 20 66 6f 72 20 63 6d 70 61 66 66 20 74 6f 20 62   for cmpaff to b
15020 65 20 54 45 58 54 20 69 73 20 66 6f 72 20 69 64  e TEXT is for id
15030 78 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 0a  xaff to be TEXT.
15040 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
15050 6e 64 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20  nd for the term 
15060 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
15070 65 20 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20  e IN to have no 
15080 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20  affinity. */.   
15090 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
150a0 20 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f   idxaff==SQLITE_
150b0 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
150c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
150d0 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
150e0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 66  :.            af
150f0 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69  finity_ok = sqli
15100 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
15110 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20  nity(idxaff);.  
15120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15130 0a 20 20 20 20 20 20 69 66 28 20 61 66 66 69 6e  .      if( affin
15140 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20  ity_ok ){.      
15150 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
15160 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65  an existing inde
15170 78 20 74 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b  x that will work
15180 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65   for this IN ope
15190 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
151a0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
151b0 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20  pIndex; pIdx && 
151c0 65 54 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70  eType==0; pIdx=p
151d0 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
151e0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63         Bitmask c
151f0 6f 6c 55 73 65 64 3b 20 20 20 20 20 20 2f 2a 20  olUsed;      /* 
15200 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  Columns of the i
15210 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a 20 20 20  ndex used */.   
15220 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
15230 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Col;         /* 
15240 4d 61 73 6b 20 66 6f 72 20 74 68 65 20 63 75 72  Mask for the cur
15250 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  rent column */. 
15260 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
15270 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72  x->nColumn<nExpr
15280 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
15290 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
152a0 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
152b0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
152c0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
152d0 75 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d  um nColumn is BM
152e0 53 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20  S-2, not BMS-1, 
152f0 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63  so that we can c
15300 6f 6d 70 75 74 65 0a 20 20 20 20 20 20 20 20 20  ompute.         
15310 20 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78 70   ** BITMASK(nExp
15320 72 29 20 77 69 74 68 6f 75 74 20 6f 76 65 72 66  r) without overf
15330 6c 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  lowing */.      
15340 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49      testcase( pI
15350 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53  dx->nColumn==BMS
15360 2d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -2 );.          
15370 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e  testcase( pIdx->
15380 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29  nColumn==BMS-1 )
15390 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
153a0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42  pIdx->nColumn>=B
153b0 4d 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  MS-1 ) continue;
153c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
153d0 75 73 74 42 65 55 6e 69 71 75 65 20 29 7b 0a 20  ustBeUnique ){. 
153e0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
153f0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78  Idx->nKeyCol>nEx
15400 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  pr.             
15410 7c 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  ||(pIdx->nColumn
15420 3e 6e 45 78 70 72 20 26 26 20 21 49 73 55 6e 69  >nExpr && !IsUni
15430 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 29 0a  queIndex(pIdx)).
15440 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
15460 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20  tinue;  /* This 
15470 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 6e 69  index is not uni
15480 71 75 65 20 6f 76 65 72 20 74 68 65 20 49 4e 20  que over the IN 
15490 52 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  RHS columns */. 
154a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
154b0 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
154c0 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 3d 20        colUsed = 
154d0 30 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  0;   /* Columns 
154e0 6f 66 20 69 6e 64 65 78 20 75 73 65 64 20 73 6f  of index used so
154f0 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
15500 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
15510 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
15520 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73        Expr *pLhs
15530 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
15540 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d  FieldSubexpr(pX-
15550 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
15560 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52          Expr *pR
15570 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  hs = pEList->a[i
15580 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
15590 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52       CollSeq *pR
155a0 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  eq = sqlite3Bina
155b0 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
155c0 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70  (pParse, pLhs, p
155d0 52 68 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Rhs);.          
155e0 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20    int j;.  .    
155f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15600 70 52 65 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d  pReq!=0 || pRhs-
15610 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57  >iColumn==XN_ROW
15620 49 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ID || pParse->nE
15630 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rr );.          
15640 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78    for(j=0; j<nEx
15650 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
15660 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
15670 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70  ->aiColumn[j]!=p
15680 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63  Rhs->iColumn ) c
15690 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
156a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
156b0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29  Idx->azColl[j] )
156c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
156d0 69 66 28 20 70 52 65 71 21 3d 30 20 26 26 20 73  if( pReq!=0 && s
156e0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 52  qlite3StrICmp(pR
156f0 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d  eq->zName, pIdx-
15700 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29  >azColl[j])!=0 )
15710 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
15720 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
15730 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15740 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
15750 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
15760 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
15770 3d 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b 3b  ==nExpr ) break;
15780 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f  .            mCo
15790 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a  l = MASKBIT(j);.
157a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
157b0 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20 29  mCol & colUsed )
157c0 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20   break; /* Each 
157d0 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79  column used only
157e0 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20   once */.       
157f0 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20       colUsed |= 
15800 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  mCol;.          
15810 20 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69    if( aiMap ) ai
15820 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20  Map[i] = j;.    
15830 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
15840 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
15850 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64  nExpr || colUsed
15860 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72  !=(MASKBIT(nExpr
15870 29 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  )-1) );.        
15880 20 20 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28    if( colUsed==(
15890 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31  MASKBIT(nExpr)-1
158a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
158b0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
158c0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74  this point, that
158d0 20 6d 65 61 6e 73 20 74 68 65 20 69 6e 64 65 78   means the index
158e0 20 70 49 64 78 20 69 73 20 75 73 61 62 6c 65 20   pIdx is usable 
158f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
15900 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
15910 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
15920 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f  OP_Once); VdbeCo
15930 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
15940 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
15950 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
15960 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15980 20 20 22 55 53 49 4e 47 20 49 4e 44 45 58 20 25    "USING INDEX %
15990 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f  s FOR IN-OPERATO
159a0 52 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  R",pIdx->zName))
159b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
159c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
159d0 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
159e0 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  iTab, pIdx->tnum
159f0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
15a00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
15a10 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
15a20 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  se, pIdx);.     
15a30 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
15a40 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64  nt((v, "%s", pId
15a50 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
15a60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15a70 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
15a80 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f  ESC == IN_INDEX_
15a90 49 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20  INDEX_ASC+1 );. 
15aa0 20 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65             eType
15ab0 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45   = IN_INDEX_INDE
15ac0 58 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53  X_ASC + pIdx->aS
15ad0 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 20 20 0a  ortOrder[0];.  .
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15af0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a  prRhsHasNull ){.
15b00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
15b10 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
15b20 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 20 20  _MASK.          
15b30 20 20 20 20 69 36 34 20 6d 61 73 6b 20 3d 20 28      i64 mask = (
15b40 31 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a 20 20 20  1<<nExpr)-1;.   
15b50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15b60 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
15b70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73  (v, OP_ColumnsUs
15b80 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ed, .           
15b90 20 20 20 20 20 20 20 69 54 61 62 2c 20 30 2c 20         iTab, 0, 
15ba0 30 2c 20 28 75 38 2a 29 26 6d 61 73 6b 2c 20 50  0, (u8*)&mask, P
15bb0 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66  4_INT64);.#endif
15bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
15bd0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b  prRhsHasNull = +
15be0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
15c00 20 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20   nExpr==1 ){.   
15c10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15c20 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
15c30 61 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52  ag(v, iTab, *prR
15c40 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20  hsHasNull);.    
15c50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15c60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15c80 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
15c90 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  dr);.          }
15ca0 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e  .        } /* En
15cb0 64 20 6c 6f 6f 70 20 6f 76 65 72 20 69 6e 64 65  d loop over inde
15cc0 78 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2f  xes */.      } /
15cd0 2a 20 45 6e 64 20 69 66 28 20 61 66 66 69 6e 69  * End if( affini
15ce0 74 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20 20 20 7d  ty_ok ) */.    }
15cf0 20 2f 2a 20 45 6e 64 20 69 66 20 6e 6f 74 20 61   /* End if not a
15d00 6e 20 72 6f 77 69 64 20 69 6e 64 65 78 20 2a 2f  n rowid index */
15d10 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 61 74 74 65  .  } /* End atte
15d20 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  mpt to optimize 
15d30 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 2a  using an index *
15d40 2f 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72  /..  /* If no pr
15d50 65 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20  eexisting index 
15d60 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  is available for
15d70 20 74 68 65 20 49 4e 20 63 6c 61 75 73 65 0a 20   the IN clause. 
15d80 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58   ** and IN_INDEX
15d90 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f  _NOOP is an allo
15da0 77 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61  wed reply.  ** a
15db0 6e 64 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  nd the RHS of th
15dc0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
15dd0 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73   a list, not a s
15de0 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64  ubquery.  ** and
15df0 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20   the RHS is not 
15e00 63 6f 6e 73 74 61 6e 74 20 6f 72 20 68 61 73 20  constant or has 
15e10 74 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72  two or fewer ter
15e20 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74  ms,.  ** then it
15e30 20 69 73 20 6e 6f 74 20 77 6f 72 74 68 20 63 72   is not worth cr
15e40 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  eating an epheme
15e50 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 65 76 61  ral table to eva
15e60 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 49  luate.  ** the I
15e70 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 72 65  N operator so re
15e80 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
15e90 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  OP..  */.  if( e
15ea0 54 79 70 65 3d 3d 30 0a 20 20 20 26 26 20 28 69  Type==0.   && (i
15eb0 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
15ec0 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26  X_NOOP_OK).   &&
15ed0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
15ee0 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
15ef0 63 74 29 0a 20 20 20 26 26 20 28 21 73 71 6c 69  ct).   && (!sqli
15f00 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61  te3InRhsIsConsta
15f10 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e  nt(pX) || pX->x.
15f20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29  pList->nExpr<=2)
15f30 0a 20 20 29 7b 0a 20 20 20 20 65 54 79 70 65 20  .  ){.    eType 
15f40 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b  = IN_INDEX_NOOP;
15f50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70  .  }..  if( eTyp
15f60 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  e==0 ){.    /* C
15f70 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e  ould not find an
15f80 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
15f90 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  or index to use 
15fa0 61 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65  as the RHS b-tre
15fb0 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c  e..    ** We wil
15fc0 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61  l have to genera
15fd0 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  te an ephemeral 
15fe0 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20  table to do the 
15ff0 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  job..    */.    
16000 75 33 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c  u32 savedNQueryL
16010 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51  oop = pParse->nQ
16020 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e  ueryLoop;.    in
16030 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d  t rMayHaveNull =
16040 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20   0;.    eType = 
16050 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20  IN_INDEX_EPH;.  
16060 20 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20    if( inFlags & 
16070 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b  IN_INDEX_LOOP ){
16080 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
16090 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20  QueryLoop = 0;. 
160a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52     }else if( prR
160b0 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20  hsHasNull ){.   
160c0 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c     *prRhsHasNull
160d0 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20   = rMayHaveNull 
160e0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
160f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
16100 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
16110 4e 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  N );.    sqlite3
16120 43 6f 64 65 52 68 73 4f 66 49 4e 28 70 50 61 72  CodeRhsOfIN(pPar
16130 73 65 2c 20 70 58 2c 20 69 54 61 62 29 3b 0a 20  se, pX, iTab);. 
16140 20 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e     if( rMayHaveN
16150 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ull ){.      sql
16160 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
16170 61 67 28 76 2c 20 69 54 61 62 2c 20 72 4d 61 79  ag(v, iTab, rMay
16180 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d  HaveNull);.    }
16190 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
161a0 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e  eryLoop = savedN
161b0 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 0a 0a  QueryLoop;.  }..
161c0 20 20 69 66 28 20 61 69 4d 61 70 20 26 26 20 65    if( aiMap && e
161d0 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type!=IN_INDEX_I
161e0 4e 44 45 58 5f 41 53 43 20 26 26 20 65 54 79 70  NDEX_ASC && eTyp
161f0 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e!=IN_INDEX_INDE
16200 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e  X_DESC ){.    in
16210 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20  t i, n;.    n = 
16220 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
16230 72 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29  rSize(pX->pLeft)
16240 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
16250 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69  <n; i++) aiMap[i
16260 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 2a 70 69  ] = i;.  }.  *pi
16270 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 72 65  Tab = iTab;.  re
16280 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65  turn eType;.}.#e
16290 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
162a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
162b0 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  RY./*.** Argumen
162c0 74 20 70 45 78 70 72 20 69 73 20 61 6e 20 28 3f  t pExpr is an (?
162d0 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20  , ?...) IN(...) 
162e0 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73  expression. This
162f0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c   .** function al
16300 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
16310 72 6e 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  rns a nul-termin
16320 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74  ated string cont
16330 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61  aining .** the a
16340 66 66 69 6e 69 74 69 65 73 20 74 6f 20 62 65 20  ffinities to be 
16350 75 73 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f  used for each co
16360 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70  lumn of the comp
16370 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74  arison..**.** It
16380 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
16390 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
163a0 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74  ller to ensure t
163b0 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64  hat the returned
163c0 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 65 76  .** string is ev
163d0 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
163e0 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
163f0 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
16400 63 68 61 72 20 2a 65 78 70 72 49 4e 41 66 66 69  char *exprINAffi
16410 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72  nity(Parse *pPar
16420 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
16430 7b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20  {.  Expr *pLeft 
16440 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
16450 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c    int nVal = sql
16460 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
16470 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c  ze(pLeft);.  Sel
16480 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 28  ect *pSelect = (
16490 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
164a0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70  P_xIsSelect) ? p
164b0 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20  Expr->x.pSelect 
164c0 3a 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  : 0;.  char *zRe
164d0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45  t;..  assert( pE
164e0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29  xpr->op==TK_IN )
164f0 3b 0a 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74  ;.  zRet = sqlit
16500 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 50  e3DbMallocRaw(pP
16510 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31  arse->db, nVal+1
16520 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b  );.  if( zRet ){
16530 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
16540 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b  for(i=0; i<nVal;
16550 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
16560 72 20 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56  r *pA = sqlite3V
16570 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
16580 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
16590 20 20 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69     char a = sqli
165a0 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
165b0 70 41 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pA);.      if( p
165c0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
165d0 20 20 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69    zRet[i] = sqli
165e0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
165f0 74 79 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  ty(pSelect->pELi
16600 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
16610 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  a);.      }else{
16620 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d  .        zRet[i]
16630 20 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = a;.      }.  
16640 20 20 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61    }.    zRet[nVa
16650 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  l] = '\0';.  }. 
16660 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
16670 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
16680 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16690 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  UERY./*.** Load 
166a0 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
166b0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
166c0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69  irst argument wi
166d0 74 68 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  th an error .** 
166e0 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66  message of the f
166f0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75  orm:.**.**   "su
16700 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
16710 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70   N columns - exp
16720 65 63 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76  ected M".*/   .v
16730 6f 69 64 20 73 71 6c 69 74 65 33 53 75 62 73 65  oid sqlite3Subse
16740 6c 65 63 74 45 72 72 6f 72 28 50 61 72 73 65 20  lectError(Parse 
16750 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63  *pParse, int nAc
16760 74 75 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63  tual, int nExpec
16770 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
16780 20 2a 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65   *zFmt = "sub-se
16790 6c 65 63 74 20 72 65 74 75 72 6e 73 20 25 64 20  lect returns %d 
167a0 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74  columns - expect
167b0 65 64 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65  ed %d";.  sqlite
167c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
167d0 2c 20 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c  , zFmt, nActual,
167e0 20 6e 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e   nExpect);.}.#en
167f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65  dif../*.** Expre
16800 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61  ssion pExpr is a
16810 20 76 65 63 74 6f 72 20 74 68 61 74 20 68 61 73   vector that has
16820 20 62 65 65 6e 20 75 73 65 64 20 69 6e 20 61 20   been used in a 
16830 63 6f 6e 74 65 78 74 20 77 68 65 72 65 0a 2a 2a  context where.**
16840 20 69 74 20 69 73 20 6e 6f 74 20 70 65 72 6d 69   it is not permi
16850 74 74 65 64 2e 20 49 66 20 70 45 78 70 72 20 69  tted. If pExpr i
16860 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 76  s a sub-select v
16870 65 63 74 6f 72 2c 20 74 68 69 73 20 72 6f 75 74  ector, this rout
16880 69 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73 20 74 68  ine .** loads th
16890 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 77  e Parse object w
168a0 69 74 68 20 61 20 6d 65 73 73 61 67 65 20 6f 66  ith a message of
168b0 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
168c0 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72     "sub-select r
168d0 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73  eturns N columns
168e0 20 2d 20 65 78 70 65 63 74 65 64 20 31 22 0a 2a   - expected 1".*
168f0 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 74 20 69  *.** Or, if it i
16900 73 20 61 20 72 65 67 75 6c 61 72 20 73 63 61 6c  s a regular scal
16910 61 72 20 76 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a  ar vector:.**.**
16920 20 20 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69     "row value mi
16930 73 75 73 65 64 22 0a 2a 2f 20 20 20 0a 76 6f 69  sused".*/   .voi
16940 64 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45  d sqlite3VectorE
16950 72 72 6f 72 4d 73 67 28 50 61 72 73 65 20 2a 70  rrorMsg(Parse *p
16960 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
16970 70 72 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  pr){.#ifndef SQL
16980 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16990 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  Y.  if( pExpr->f
169a0 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
169b0 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
169c0 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
169d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
169e0 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
169f0 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  t->nExpr, 1);.  
16a00 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
16a10 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
16a20 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f  rMsg(pParse, "ro
16a30 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
16a40 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
16a50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
16a60 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
16a70 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
16a80 77 69 6c 6c 20 63 6f 6e 73 74 72 75 63 74 20 61  will construct a
16a90 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
16aa0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c  e containing all
16ab0 20 74 65 72 6d 73 0a 2a 2a 20 69 6e 20 74 68 65   terms.** in the
16ac0 20 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70   RHS of an IN op
16ad0 65 72 61 74 6f 72 2e 20 20 54 68 65 20 49 4e 20  erator.  The IN 
16ae0 6f 70 65 72 61 74 6f 72 20 63 61 6e 20 62 65 20  operator can be 
16af0 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 77 6f  in either of two
16b00 0a 2a 2a 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a  .** forms:.**.**
16b10 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31       x IN (4,5,1
16b20 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1)              
16b30 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  -- IN operator w
16b40 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68  ith list on righ
16b50 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20  t-hand side.**  
16b60 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
16b70 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d  a FROM b)     --
16b80 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
16b90 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68  h subquery on th
16ba0 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68  e right.**.** Th
16bb0 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65  e pExpr paramete
16bc0 72 20 69 73 20 74 68 65 20 49 4e 20 6f 70 65 72  r is the IN oper
16bd0 61 74 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f  ator.  The curso
16be0 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
16bf0 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20  .** constructed 
16c00 65 70 68 65 72 6d 65 72 61 6c 20 74 61 62 6c 65  ephermeral table
16c10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 54   is returned.  T
16c20 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
16c30 65 20 65 70 68 65 6d 65 72 61 6c 0a 2a 2a 20 74  e ephemeral.** t
16c40 61 62 6c 65 20 69 73 20 63 6f 6d 70 75 74 65 64  able is computed
16c50 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
16c60 62 65 72 20 69 73 20 61 6c 73 6f 20 73 74 6f 72  ber is also stor
16c70 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 69 54 61  ed in pExpr->iTa
16c80 62 6c 65 2c 0a 2a 2a 20 68 6f 77 65 76 65 72 20  ble,.** however 
16c90 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
16ca0 72 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  r returned might
16cb0 20 6e 6f 74 20 62 65 20 74 68 65 20 73 61 6d 65   not be the same
16cc0 2c 20 61 73 20 69 74 20 6d 69 67 68 74 0a 2a 2a  , as it might.**
16cd0 20 68 61 76 65 20 62 65 65 6e 20 64 75 70 6c 69   have been dupli
16ce0 63 61 74 65 64 20 75 73 69 6e 67 20 4f 50 5f 4f  cated using OP_O
16cf0 70 65 6e 44 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  penDup..**.** If
16d00 20 74 68 65 20 4c 48 53 20 65 78 70 72 65 73 73   the LHS express
16d10 69 6f 6e 20 28 22 78 22 20 69 6e 20 74 68 65 20  ion ("x" in the 
16d20 65 78 61 6d 70 6c 65 73 29 20 69 73 20 61 20 63  examples) is a c
16d30 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 0a  olumn value, or.
16d40 2a 2a 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  ** the SELECT st
16d50 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
16d60 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
16d70 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
16d80 79 20 6f 66 20 74 68 61 74 0a 2a 2a 20 63 6f 6c  y of that.** col
16d90 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
16da0 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
16db0 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
16dc0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 53 45 4c 45   and the.** SELE
16dd0 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
16de0 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
16df0 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
16e00 74 79 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 66  ty is used.** if
16e10 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68   either column h
16e20 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e  as NUMERIC or IN
16e30 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20  TEGER affinity. 
16e40 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 27 78  If neither.** 'x
16e50 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
16e60 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
16e70 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
16e80 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
16e90 0a 2a 2a 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a  .** is used..*/.
16ea0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
16eb0 52 68 73 4f 66 49 4e 28 0a 20 20 50 61 72 73 65  RhsOfIN(.  Parse
16ec0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
16ed0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
16ee0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
16ef0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
16f00 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 6f 70 65     /* The IN ope
16f10 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
16f20 54 61 62 20 20 20 20 20 20 20 20 20 20 20 20 20  Tab             
16f30 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 63     /* Use this c
16f40 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a  ursor number */.
16f50 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63  ){.  int addrOnc
16f60 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
16f70 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
16f80 68 65 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72  he OP_Once instr
16f90 75 63 74 69 6f 6e 20 61 74 20 74 6f 70 20 2a 2f  uction at top */
16fa0 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16fc0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
16fd0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
16fe0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  struction */.  E
16ff0 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  xpr *pLeft;     
17000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
17010 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
17020 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 4b 65  operator */.  Ke
17030 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
17040 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79  = 0;      /* Key
17050 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
17060 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20    int nVal;     
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17080 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 20   Size of vector 
17090 70 4c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20  pLeft */.  Vdbe 
170a0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
170b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
170c0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
170d0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
170e0 69 6f 6e 20 2a 2f 0a 0a 20 20 76 20 3d 20 70 50  ion */..  v = pP
170f0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
17100 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a  ssert( v!=0 );..
17110 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74    /* The evaluat
17120 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 6d 75  ion of the IN mu
17130 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65  st be repeated e
17140 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a  very time it.  *
17150 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
17160 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
17170 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
17180 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
17190 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
171a0 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
171b0 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
171c0 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
171d0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
171e0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
171f0 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
17200 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
17210 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
17220 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
17230 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
17240 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
17250 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
17260 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   compute the RHS
17270 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
17280 61 6e 64 20 72 65 75 73 65 20 69 74 20 6d 61 6e  and reuse it man
17290 79 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  y names..  */.  
172a0 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
172b0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56  erty(pExpr, EP_V
172c0 61 72 53 65 6c 65 63 74 29 20 26 26 20 70 50 61  arSelect) && pPa
172d0 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3d 3d 30  rse->iSelfTab==0
172e0 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 75 73 65   ){.    /* Reuse
172f0 20 6f 66 20 74 68 65 20 52 48 53 20 69 73 20 61   of the RHS is a
17300 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 2f 2a  llowed */.    /*
17310 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
17320 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
17330 6e 20 63 6f 64 65 64 2c 20 62 75 74 20 74 68 65  n coded, but the
17340 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20   previous code. 
17350 20 20 20 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20     ** might not 
17360 68 61 76 65 20 62 65 65 6e 20 69 6e 76 6f 6b 65  have been invoke
17370 64 20 79 65 74 2c 20 73 6f 20 69 6e 76 6f 6b 65  d yet, so invoke
17380 20 69 74 20 6e 6f 77 20 61 73 20 61 20 73 75 62   it now as a sub
17390 72 6f 75 74 69 6e 65 2e 20 0a 20 20 20 20 2a 2f  routine. .    */
173a0 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
173b0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
173c0 45 50 5f 53 75 62 72 74 6e 29 20 29 7b 0a 20 20  EP_Subrtn) ){.  
173d0 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73      addrOnce = s
173e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
173f0 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
17400 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17410 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
17420 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
17430 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
17440 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e  .        Explain
17450 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
17460 65 2c 20 30 2c 20 22 52 45 55 53 45 20 4c 49 53  e, 0, "REUSE LIS
17470 54 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a  T SUBQUERY %d",.
17480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
17490 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
174a0 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 7d  selId));.      }
174b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
174c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
174d0 6f 73 75 62 2c 20 70 45 78 70 72 2d 3e 79 2e 73  osub, pExpr->y.s
174e0 75 62 2e 72 65 67 52 65 74 75 72 6e 2c 0a 20 20  ub.regReturn,.  
174f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17500 20 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73        pExpr->y.s
17510 75 62 2e 69 41 64 64 72 29 3b 0a 20 20 20 20 20  ub.iAddr);.     
17520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17530 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
17540 2c 20 69 54 61 62 2c 20 70 45 78 70 72 2d 3e 69  , iTab, pExpr->i
17550 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71  Table);.      sq
17560 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
17570 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
17580 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
17590 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69    }..    /* Begi
175a0 6e 20 63 6f 64 69 6e 67 20 74 68 65 20 73 75 62  n coding the sub
175b0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 45  routine */.    E
175c0 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
175d0 45 78 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29  Expr, EP_Subrtn)
175e0 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73  ;.    pExpr->y.s
175f0 75 62 2e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  ub.regReturn = +
17600 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
17610 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e     pExpr->y.sub.
17620 69 41 64 64 72 20 3d 0a 20 20 20 20 20 20 73 71  iAddr =.      sq
17630 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17640 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
17650 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72  , pExpr->y.sub.r
17660 65 67 52 65 74 75 72 6e 29 20 2b 20 31 3b 0a 20  egReturn) + 1;. 
17670 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
17680 76 2c 20 22 72 65 74 75 72 6e 20 61 64 64 72 65  v, "return addre
17690 73 73 22 29 29 3b 0a 0a 20 20 20 20 61 64 64 72  ss"));..    addr
176a0 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Once = sqlite3Vd
176b0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
176c0 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
176d0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
176e0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
176f0 20 74 68 69 73 20 69 73 20 61 20 76 65 63 74 6f   this is a vecto
17700 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  r IN operator */
17710 0a 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72  .  pLeft = pExpr
17720 2d 3e 70 4c 65 66 74 3b 0a 20 20 6e 56 61 6c 20  ->pLeft;.  nVal 
17730 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
17740 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
17750 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
17760 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
17770 62 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 63 6f  ble that will co
17780 6e 74 61 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ntain the conten
17790 74 20 6f 66 0a 20 20 2a 2a 20 52 48 53 20 6f 66  t of.  ** RHS of
177a0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
177b0 2e 0a 20 20 2a 2f 0a 20 20 70 45 78 70 72 2d 3e  ..  */.  pExpr->
177c0 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
177d0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
177e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
177f0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
17800 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 56  Expr->iTable, nV
17810 61 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  al);.#ifdef SQLI
17820 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
17830 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 69 66 28  N_COMMENTS.  if(
17840 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
17850 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
17860 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 56 64 62  lect) ){.    Vdb
17870 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 52 65  eComment((v, "Re
17880 73 75 6c 74 20 6f 66 20 53 45 4c 45 43 54 20 25  sult of SELECT %
17890 75 22 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  u", pExpr->x.pSe
178a0 6c 65 63 74 2d 3e 73 65 6c 49 64 29 29 3b 0a 20  lect->selId));. 
178b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65   }else{.    Vdbe
178c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 52 48 53  Comment((v, "RHS
178d0 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 22   of IN operator"
178e0 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
178f0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
17900 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
17910 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c  pParse->db, nVal
17920 2c 20 31 29 3b 0a 0a 20 20 69 66 28 20 45 78 70  , 1);..  if( Exp
17930 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
17940 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
17950 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  ) ){.    /* Case
17960 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
17970 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
17980 20 2a 2a 0a 20 20 20 20 2a 2a 20 47 65 6e 65 72   **.    ** Gener
17990 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74  ate code to writ
179a0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
179b0 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f   the select into
179c0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
179d0 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f     ** table allo
179e0 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  cated and opened
179f0 20 61 62 6f 76 65 2e 0a 20 20 20 20 2a 2f 0a 20   above..    */. 
17a00 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65     Select *pSele
17a10 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  ct = pExpr->x.pS
17a20 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 4c  elect;.    ExprL
17a30 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53  ist *pEList = pS
17a40 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a  elect->pEList;..
17a50 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
17a60 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
17a70 20 22 25 73 4c 49 53 54 20 53 55 42 51 55 45 52   "%sLIST SUBQUER
17a80 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 61  Y %d",.        a
17a90 64 64 72 4f 6e 63 65 3f 22 22 3a 22 43 4f 52 52  ddrOnce?"":"CORR
17aa0 45 4c 41 54 45 44 20 22 2c 20 70 53 65 6c 65 63  ELATED ", pSelec
17ab0 74 2d 3e 73 65 6c 49 64 0a 20 20 20 20 29 29 3b  t->selId.    ));
17ac0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c  .    /* If the L
17ad0 48 53 20 61 6e 64 20 52 48 53 20 6f 66 20 74 68  HS and RHS of th
17ae0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f  e IN operator do
17af0 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68 61 74   not match, that
17b00 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 77 69  .    ** error wi
17b10 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61 75  ll have been cau
17b20 67 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20  ght long before 
17b30 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
17b40 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  int. */.    if( 
17b50 41 4c 57 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e  ALWAYS(pEList->n
17b60 45 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20  Expr==nVal) ){. 
17b70 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
17b80 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  dest;.      int 
17b90 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
17ba0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
17bb0 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 69  dest, SRT_Set, i
17bc0 54 61 62 29 3b 0a 20 20 20 20 20 20 64 65 73 74  Tab);.      dest
17bd0 2e 7a 41 66 66 53 64 73 74 20 3d 20 65 78 70 72  .zAffSdst = expr
17be0 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  INAffinity(pPars
17bf0 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  e, pExpr);.     
17c00 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
17c10 20 3d 20 30 3b 0a 20 20 20 20 20 20 74 65 73 74   = 0;.      test
17c20 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73  case( pSelect->s
17c30 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
17c40 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74  tinct );.      t
17c50 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66  estcase( pKeyInf
17c60 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65  o==0 ); /* Cause
17c70 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69  d by OOM in sqli
17c80 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
17c90 29 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  ) */.      if( s
17ca0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
17cb0 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
17cc0 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
17cd0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
17ce0 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a  arse->db, dest.z
17cf0 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  AffSdst);.      
17d00 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
17d10 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b  Unref(pKeyInfo);
17d20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
17d30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
17d40 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
17d50 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41  rse->db, dest.zA
17d60 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 61  ffSdst);.      a
17d70 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21  ssert( pKeyInfo!
17d80 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c  =0 ); /* OOM wil
17d90 6c 20 63 61 75 73 65 20 65 78 69 74 20 61 66 74  l cause exit aft
17da0 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  er sqlite3Select
17db0 28 29 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  () */.      asse
17dc0 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
17dd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17de0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  EList->nExpr>0 )
17df0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17e00 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
17e10 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
17e20 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  fo) );.      for
17e30 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b  (i=0; i<nVal; i+
17e40 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
17e50 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63   *p = sqlite3Vec
17e60 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
17e70 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
17e80 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
17e90 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42  ll[i] = sqlite3B
17ea0 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
17eb0 53 65 71 28 0a 20 20 20 20 20 20 20 20 20 20 20  Seq(.           
17ec0 20 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69   pParse, p, pELi
17ed0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20  st->a[i].pExpr. 
17ee0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
17ef0 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
17f00 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
17f10 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b  ->x.pList!=0) ){
17f20 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20  .    /* Case 2: 
17f30 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70      expr IN (exp
17f40 72 6c 69 73 74 29 0a 20 20 20 20 2a 2a 0a 20 20  rlist).    **.  
17f50 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78    ** For each ex
17f60 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20  pression, build 
17f70 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f  an index key fro
17f80 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  m the evaluation
17f90 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 74 6f 72   and.    ** stor
17fa0 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70  e it in the temp
17fb0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20  orary table. If 
17fc0 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75  <expr> is a colu
17fd0 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20  mn, then use.   
17fe0 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73   ** that columns
17ff0 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62   affinity when b
18000 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65  uilding index ke
18010 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  ys. If <expr> is
18020 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 20 63 6f   not.    ** a co
18030 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
18040 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
18050 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66 69  */.    char affi
18060 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  nity;           
18070 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20   /* Affinity of 
18080 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
18090 4e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a  N */.    int i;.
180a0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
180b0 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
180c0 4c 69 73 74 3b 0a 20 20 20 20 73 74 72 75 63 74  List;.    struct
180d0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
180e0 70 49 74 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72  pItem;.    int r
180f0 31 2c 20 72 32 3b 0a 20 20 20 20 61 66 66 69 6e  1, r2;.    affin
18100 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
18110 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29  rAffinity(pLeft)
18120 3b 0a 20 20 20 20 69 66 28 20 61 66 66 69 6e 69  ;.    if( affini
18130 74 79 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty<=SQLITE_AFF_N
18140 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 61 66 66  ONE ){.      aff
18150 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
18160 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20  FF_BLOB;.    }. 
18170 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
18180 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18190 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
181a0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
181b0 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 70 4b  nfo) );.      pK
181c0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
181d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
181e0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
181f0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
18200 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20   }..    /* Loop 
18210 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
18220 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
18230 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 72 31  list>. */.    r1
18240 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
18250 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
18260 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
18270 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
18280 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73  ;.    for(i=pLis
18290 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
182a0 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  pList->a; i>0; i
182b0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
182c0 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
182d0 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20  pItem->pExpr;.. 
182e0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
182f0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
18300 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
18310 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
18320 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
18330 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61  the test that wa
18340 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76  s generated abov
18350 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
18360 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  e.      ** this 
18370 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74  code only execut
18380 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73  es once.  Becaus
18390 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73  e for a non-cons
183a0 74 61 6e 74 0a 20 20 20 20 20 20 2a 2a 20 65 78  tant.      ** ex
183b0 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
183c0 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
183d0 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
183e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
183f0 28 20 61 64 64 72 4f 6e 63 65 20 26 26 20 21 73  ( addrOnce && !s
18400 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
18410 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20  tant(pE2) ){.   
18420 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18430 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
18440 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 20  addrOnce);.     
18450 20 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70     ExprClearProp
18460 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
18470 75 62 72 74 6e 29 3b 0a 20 20 20 20 20 20 20 20  ubrtn);.        
18480 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20  addrOnce = 0;.  
18490 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
184a0 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
184b0 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
184c0 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
184d0 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
184e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
184f0 64 65 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20  de(pParse, pE2, 
18500 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
18510 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
18520 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
18530 31 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e  1, 1, r2, &affin
18540 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ity, 1);.      s
18550 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
18560 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
18570 65 72 74 2c 20 69 54 61 62 2c 20 72 32 2c 20 72  ert, iTab, r2, r
18580 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
18590 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
185a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
185b0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  1);.    sqlite3R
185c0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
185d0 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 7d 0a 20  arse, r2);.  }. 
185e0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
185f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18600 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
18610 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e  , (void *)pKeyIn
18620 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
18630 0a 20 20 7d 0a 20 20 69 66 28 20 61 64 64 72 4f  .  }.  if( addrO
18640 6e 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nce ){.    sqlit
18650 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
18660 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20  , addrOnce);.   
18670 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72   /* Subroutine r
18680 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 73 71 6c  eturn */.    sql
18690 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
186a0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 45 78  , OP_Return, pEx
186b0 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74  pr->y.sub.regRet
186c0 75 72 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  urn);.    sqlite
186d0 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
186e0 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41   pExpr->y.sub.iA
186f0 64 64 72 2d 31 2c 20 73 71 6c 69 74 65 33 56 64  ddr-1, sqlite3Vd
18700 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
18710 2d 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  -1);.  }.}.#endi
18720 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
18730 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
18740 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
18750 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62  e for scalar sub
18760 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20  queries used as 
18770 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72 65  a subquery expre
18780 73 73 69 6f 6e 0a 2a 2a 20 6f 72 20 45 58 49 53  ssion.** or EXIS
18790 54 53 20 6f 70 65 72 61 74 6f 72 3a 0a 2a 2a 0a  TS operator:.**.
187a0 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61  **     (SELECT a
187b0 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20   FROM b)        
187c0 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a    -- subquery.**
187d0 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c       EXISTS (SEL
187e0 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
187f0 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65  -- EXISTS subque
18800 72 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78  ry.**.** The pEx
18810 70 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pr parameter is 
18820 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 45 58  the SELECT or EX
18830 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 74 6f  ISTS operator to
18840 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a   be coded..**.**
18850 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
18860 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20  ster that holds 
18870 74 68 65 20 72 65 73 75 6c 74 2e 20 20 46 6f 72  the result.  For
18880 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20   a multi-column 
18890 53 45 4c 45 43 54 2c 20 0a 2a 2a 20 74 68 65 20  SELECT, .** the 
188a0 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
188b0 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73   in a contiguous
188c0 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
188d0 65 72 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72  ers and the.** r
188e0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
188f0 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20 74  he register of t
18900 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 72 65 73  he left-most res
18910 75 6c 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 52  ult column..** R
18920 65 74 75 72 6e 20 30 20 69 66 20 61 6e 20 65 72  eturn 0 if an er
18930 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23  ror occurs..*/.#
18940 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18950 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
18960 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
18970 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
18980 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
18990 7b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65  {.  int addrOnce
189a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
189b0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
189c0 5f 4f 6e 63 65 20 61 74 20 74 6f 70 20 6f 66 20  _Once at top of 
189d0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
189e0 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20  int rReg = 0;   
189f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18a00 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20  egister storing 
18a10 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 53  resulting */.  S
18a20 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
18a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
18a40 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
18a50 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 53 65  o encode */.  Se
18a60 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
18a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
18a80 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45   to deal with SE
18a90 4c 45 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20  LECT result */. 
18aa0 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20   int nReg;      
18ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18ac0 52 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  Registers to all
18ad0 6f 63 61 74 65 20 2a 2f 0a 20 20 45 78 70 72 20  ocate */.  Expr 
18ae0 2a 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  *pLimit;        
18af0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6c 69         /* New li
18b00 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  mit expression *
18b10 2f 0a 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  /..  Vdbe *v = p
18b20 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
18b30 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
18b40 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
18b50 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
18b60 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
18b70 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
18b80 4c 45 43 54 20 29 3b 0a 20 20 61 73 73 65 72 74  LECT );.  assert
18b90 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
18ba0 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d  EXISTS || pExpr-
18bb0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
18bc0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 78 70 72  ;.  assert( Expr
18bd0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
18be0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
18bf0 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 70 45 78   );.  pSel = pEx
18c00 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 0a  pr->x.pSelect;..
18c10 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74    /* The evaluat
18c20 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 49 53 54  ion of the EXIST
18c30 53 2f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65  S/SELECT must be
18c40 20 72 65 70 65 61 74 65 64 20 65 76 65 72 79 20   repeated every 
18c50 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20  time it.  ** is 
18c60 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61  encountered if a
18c70 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
18c80 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
18c90 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
18ca0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
18cb0 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
18cc0 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
18cd0 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
18ce0 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
18cf0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
18d00 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
18d10 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
18d20 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
18d30 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
18d40 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
18d50 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
18d60 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20  then we can run 
18d70 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f  this code just o
18d80 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68  nce.  ** save th
18d90 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72  e results, and r
18da0 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65  euse the same re
18db0 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
18dc0 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a  nt invocations..
18dd0 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
18de0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
18df0 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
18e00 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
18e10 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 61  is routine has a
18e20 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 64 65  lready been code
18e30 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 69  d, then invoke i
18e40 74 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 73 75  t as a.    ** su
18e50 62 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20  broutine. */.   
18e60 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
18e70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
18e80 75 62 72 74 6e 29 20 29 7b 0a 20 20 20 20 20 20  ubrtn) ){.      
18e90 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
18ea0 28 28 70 50 61 72 73 65 2c 20 30 2c 20 22 52 45  ((pParse, 0, "RE
18eb0 55 53 45 20 53 55 42 51 55 45 52 59 20 25 64 22  USE SUBQUERY %d"
18ec0 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64 29 29 3b  , pSel->selId));
18ed0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18ee0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
18ef0 6f 73 75 62 2c 20 70 45 78 70 72 2d 3e 79 2e 73  osub, pExpr->y.s
18f00 75 62 2e 72 65 67 52 65 74 75 72 6e 2c 0a 20 20  ub.regReturn,.  
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73        pExpr->y.s
18f30 75 62 2e 69 41 64 64 72 29 3b 0a 20 20 20 20 20  ub.iAddr);.     
18f40 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69   return pExpr->i
18f50 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  Table;.    }..  
18f60 20 20 2f 2a 20 42 65 67 69 6e 20 63 6f 64 69 6e    /* Begin codin
18f70 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  g the subroutine
18f80 20 2a 2f 0a 20 20 20 20 45 78 70 72 53 65 74 50   */.    ExprSetP
18f90 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18fa0 50 5f 53 75 62 72 74 6e 29 3b 0a 20 20 20 20 70  P_Subrtn);.    p
18fb0 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52  Expr->y.sub.regR
18fc0 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
18fd0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70  ->nMem;.    pExp
18fe0 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 20 3d  r->y.sub.iAddr =
18ff0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19000 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
19010 6e 74 65 67 65 72 2c 20 30 2c 20 70 45 78 70 72  nteger, 0, pExpr
19020 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72  ->y.sub.regRetur
19030 6e 29 20 2b 20 31 3b 0a 20 20 20 20 56 64 62 65  n) + 1;.    Vdbe
19040 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 74  Comment((v, "ret
19050 75 72 6e 20 61 64 64 72 65 73 73 22 29 29 3b 0a  urn address"));.
19060 0a 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20  .    addrOnce = 
19070 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19080 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
19090 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
190a0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 20    }.  .  /* For 
190b0 61 20 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61  a SELECT, genera
190c0 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74  te code to put t
190d0 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c  he values for al
190e0 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a  l columns of.  *
190f0 2a 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  * the first row 
19100 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
19110 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 72   registers and r
19120 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
19130 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  of.  ** the firs
19140 74 20 72 65 67 69 73 74 65 72 2e 0a 20 20 2a 2a  t register..  **
19150 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
19160 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74   an EXISTS, writ
19170 65 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28  e an integer 0 (
19180 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31  not exists) or 1
19190 20 28 65 78 69 73 74 73 29 0a 20 20 2a 2a 20 69   (exists).  ** i
191a0 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61  nto a register a
191b0 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 20 72  nd return that r
191c0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a  egister number..
191d0 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 62 6f 74    **.  ** In bot
191e0 68 20 63 61 73 65 73 2c 20 74 68 65 20 71 75 65  h cases, the que
191f0 72 79 20 69 73 20 61 75 67 6d 65 6e 74 65 64 20  ry is augmented 
19200 77 69 74 68 20 22 4c 49 4d 49 54 20 31 22 2e 20  with "LIMIT 1". 
19210 20 41 6e 79 20 0a 20 20 2a 2a 20 70 72 65 65 78   Any .  ** preex
19220 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 69 73 20  isting limit is 
19230 64 69 73 63 61 72 64 65 64 20 69 6e 20 70 6c 61  discarded in pla
19240 63 65 20 6f 66 20 74 68 65 20 6e 65 77 20 4c 49  ce of the new LI
19250 4d 49 54 20 31 2e 0a 20 20 2a 2f 0a 20 20 45 78  MIT 1..  */.  Ex
19260 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
19270 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 53 43  pParse, 1, "%sSC
19280 41 4c 41 52 20 53 55 42 51 55 45 52 59 20 25 64  ALAR SUBQUERY %d
19290 22 2c 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f  ",.        addrO
192a0 6e 63 65 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54  nce?"":"CORRELAT
192b0 45 44 20 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49  ED ", pSel->selI
192c0 64 29 29 3b 0a 20 20 6e 52 65 67 20 3d 20 70 45  d));.  nReg = pE
192d0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
192e0 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69 73  CT ? pSel->pELis
192f0 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20 20  t->nExpr : 1;.  
19300 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
19310 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20  tInit(&dest, 0, 
19320 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b  pParse->nMem+1);
19330 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
19340 2b 3d 20 6e 52 65 67 3b 0a 20 20 69 66 28 20 70  += nReg;.  if( p
19350 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
19360 45 43 54 20 29 7b 0a 20 20 20 20 64 65 73 74 2e  ECT ){.    dest.
19370 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b  eDest = SRT_Mem;
19380 0a 20 20 20 20 64 65 73 74 2e 69 53 64 73 74 20  .    dest.iSdst 
19390 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
193a0 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20 3d      dest.nSdst =
193b0 20 6e 52 65 67 3b 0a 20 20 20 20 73 71 6c 69 74   nReg;.    sqlit
193c0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
193d0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74  OP_Null, 0, dest
193e0 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e 69  .iSDParm, dest.i
193f0 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a  SDParm+nReg-1);.
19400 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
19410 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65  (v, "Init subque
19420 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  ry result"));.  
19430 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 73 74 2e  }else{.    dest.
19440 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73  eDest = SRT_Exis
19450 74 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ts;.    sqlite3V
19460 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19470 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74  Integer, 0, dest
19480 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 56  .iSDParm);.    V
19490 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
194a0 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75  Init EXISTS resu
194b0 6c 74 22 29 29 3b 0a 20 20 7d 0a 20 20 70 4c 69  lt"));.  }.  pLi
194c0 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  mit = sqlite3Exp
194d0 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
194e0 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 26 73  b, TK_INTEGER,&s
194f0 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b  qlite3IntTokens[
19500 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  1], 0);.  if( pS
19510 65 6c 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  el->pLimit ){.  
19520 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
19530 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
19540 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c  pSel->pLimit->pL
19550 65 66 74 29 3b 0a 20 20 20 20 70 53 65 6c 2d 3e  eft);.    pSel->
19560 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 3d 20  pLimit->pLeft = 
19570 70 4c 69 6d 69 74 3b 0a 20 20 7d 65 6c 73 65 7b  pLimit;.  }else{
19580 0a 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69  .    pSel->pLimi
19590 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
195a0 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 49 4d 49  (pParse, TK_LIMI
195b0 54 2c 20 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20  T, pLimit, 0);. 
195c0 20 7d 0a 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69   }.  pSel->iLimi
195d0 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  t = 0;.  if( sql
195e0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
195f0 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20  e, pSel, &dest) 
19600 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
19610 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69 54  .  }.  pExpr->iT
19620 61 62 6c 65 20 3d 20 72 52 65 67 20 3d 20 64 65  able = rReg = de
19630 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 45 78  st.iSDParm;.  Ex
19640 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
19650 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
19660 75 63 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72  uce);.  if( addr
19670 4f 6e 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Once ){.    sqli
19680 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
19690 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 0a 20  v, addrOnce);.. 
196a0 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
196b0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 73   return */.    s
196c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
196d0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70  (v, OP_Return, p
196e0 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52  Expr->y.sub.regR
196f0 65 74 75 72 6e 29 3b 0a 20 20 20 20 73 71 6c 69  eturn);.    sqli
19700 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
19710 76 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e  v, pExpr->y.sub.
19720 69 41 64 64 72 2d 31 2c 20 73 71 6c 69 74 65 33  iAddr-1, sqlite3
19730 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
19740 76 29 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  v)-1);.  }..  re
19750 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e  turn rReg;.}.#en
19760 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
19770 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
19780 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19790 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
197a0 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20 61  ** Expr pIn is a
197b0 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73  n IN(...) expres
197c0 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  sion. This funct
197d0 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20  ion checks that 
197e0 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65  the .** sub-sele
197f0 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  ct on the RHS of
19800 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74   the IN() operat
19810 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  or has the same 
19820 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f  number of .** co
19830 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63  lumns as the vec
19840 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
19850 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f  Or, if the RHS o
19860 66 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f  f the IN() is no
19870 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72  t .** a sub-quer
19880 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53 20  y, that the LHS 
19890 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73  is a vector of s
198a0 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ize 1..*/.int sq
198b0 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e  lite3ExprCheckIN
198c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
198d0 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e  Expr *pIn){.  in
198e0 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69  t nVector = sqli
198f0 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
19900 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20  e(pIn->pLeft);. 
19910 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73   if( (pIn->flags
19920 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
19930 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63   ){.    if( nVec
19940 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c  tor!=pIn->x.pSel
19950 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
19960 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  pr ){.      sqli
19970 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
19980 72 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78  r(pParse, pIn->x
19990 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
199a0 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72  ->nExpr, nVector
199b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
199c0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
199d0 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20   if( nVector!=1 
199e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65  ){.    sqlite3Ve
199f0 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61  ctorErrorMsg(pPa
19a00 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29  rse, pIn->pLeft)
19a10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
19a20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
19a30 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
19a40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
19a50 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
19a60 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
19a70 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n IN expression.
19a80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
19a90 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
19aa0 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75        x IN (valu
19ab0 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a  e, value, ...).*
19ac0 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61  *.** The left-ha
19ad0 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73  nd side (LHS) is
19ae0 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63   a scalar or vec
19af0 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  tor expression. 
19b00 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68   The .** right-h
19b10 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 69  and side (RHS) i
19b20 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65  s an array of ze
19b30 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61  ro or more scala
19b40 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a  r values, or a.*
19b50 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49 66 20  * subquery.  If 
19b60 74 68 65 20 52 48 53 20 69 73 20 61 20 73 75 62  the RHS is a sub
19b70 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65  query, the numbe
19b80 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
19b90 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63  mns must.** matc
19ba0 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
19bb0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76  columns in the v
19bc0 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53  ector on the LHS
19bd0 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73  .  If the RHS is
19be0 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61  .** a list of va
19bf0 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75  lues, the LHS mu
19c00 73 74 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20  st be a scalar. 
19c10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70  .**.** The IN op
19c20 65 72 61 74 6f 72 20 69 73 20 74 72 75 65 20 69  erator is true i
19c30 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20  f the LHS value 
19c40 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  is contained wit
19c50 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20  hin the RHS..** 
19c60 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61  The result is fa
19c70 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
19c80 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74  s definitely not
19c90 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68   in the RHS.  Th
19ca0 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20  e .** result is 
19cb0 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73  NULL if the pres
19cc0 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20  ence of the LHS 
19cd0 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f  in the RHS canno
19ce0 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69  t be .** determi
19cf0 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73  ned due to NULLs
19d00 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
19d10 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
19d20 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74  ode that jumps t
19d30 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66  o destIfFalse if
19d40 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
19d50 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  .** contained wi
19d60 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49  thin the RHS.  I
19d70 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77  f due to NULLs w
19d80 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
19d90 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a  ne if the LHS.**
19da0 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
19db0 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75   the RHS then ju
19dc0 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c  mp to destIfNull
19dd0 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  .  If the LHS is
19de0 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69   contained.** wi
19df0 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  thin the RHS the
19e00 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a  n fall through..
19e10 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65  **.** See the se
19e20 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74  parate in-operat
19e30 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74  or.md documentat
19e40 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ion file in the 
19e50 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c  canonical.** SQL
19e60 69 74 65 20 73 6f 75 72 63 65 20 74 72 65 65 20  ite source tree 
19e70 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
19e80 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
19e90 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
19ea0 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20  e3ExprCodeIN(.  
19eb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
19ec0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
19ed0 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
19ee0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
19ef0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
19f00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
19f10 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
19f20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
19f30 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  e,      /* Jump 
19f40 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e  here if LHS is n
19f50 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
19f60 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
19f70 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20   destIfNull     
19f80 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
19f90 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
19fa0 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74  re unknown due t
19fb0 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20  o NULLs */.){.  
19fc0 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  int rRhsHasNull 
19fd0 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65  = 0;  /* Registe
19fe0 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69  r that is true i
19ff0 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  f RHS contains N
1a000 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ULL values */.  
1a010 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20  int eType;      
1a020 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
1a030 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
1a040 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20  t rLhs;         
1a050 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28      /* Register(
1a060 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c  s) holding the L
1a070 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  HS values */.  i
1a080 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20  nt rLhsOrig;    
1a090 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75       /* LHS valu
1a0a0 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72  es prior to reor
1a0b0 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b  dering by aiMap[
1a0c0 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ] */.  Vdbe *v; 
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a0e0 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  Statement under 
1a0f0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1a100 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30    int *aiMap = 0
1a110 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66  ;       /* Map f
1a120 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64  rom vector field
1a130 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   to index column
1a140 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66   */.  char *zAff
1a150 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41   = 0;       /* A
1a160 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66  ffinity string f
1a170 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a  or comparisons *
1a180 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b  /.  int nVector;
1a190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1a1a0 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72  e of vectors for
1a1b0 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
1a1c0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d  r */.  int iDumm
1a1d0 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
1a1e0 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20  Dummy parameter 
1a1f0 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  to exprCodeVecto
1a200 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  r() */.  Expr *p
1a210 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Left;          /
1a220 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * The LHS of the
1a230 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
1a240 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1a250 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20          /* loop 
1a260 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
1a270 20 64 65 73 74 53 74 65 70 32 3b 20 20 20 20 20   destStep2;     
1a280 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
1a290 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73  ump when NULLs s
1a2a0 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f  een in step 2 */
1a2b0 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 36  .  int destStep6
1a2c0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72   = 0;    /* Star
1a2d0 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74  t of code for St
1a2e0 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ep 6 */.  int ad
1a2f0 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20  drTruthOp;      
1a300 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70  /* Address of op
1a310 63 6f 64 65 20 74 68 61 74 20 64 65 74 65 72 6d  code that determ
1a320 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73 20 74  ines the IN is t
1a330 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  rue */.  int des
1a340 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f  tNotNull;      /
1a350 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61  * Jump here if a
1a360 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e   comparison is n
1a370 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65 70 20  ot true in step 
1a380 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  6 */.  int addrT
1a390 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
1a3a0 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d  Top of the step-
1a3b0 36 20 6c 6f 6f 70 20 2a 2f 20 0a 20 20 69 6e 74  6 loop */ .  int
1a3c0 20 69 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20   iTab = 0;      
1a3d0 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 75     /* Index to u
1a3e0 73 65 20 2a 2f 0a 0a 20 20 70 4c 65 66 74 20 3d  se */..  pLeft =
1a3f0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
1a400 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1a410 43 68 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20  CheckIN(pParse, 
1a420 70 45 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b  pExpr) ) return;
1a430 0a 20 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e  .  zAff = exprIN
1a440 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
1a450 20 70 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74   pExpr);.  nVect
1a460 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  or = sqlite3Expr
1a470 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
1a480 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61  ->pLeft);.  aiMa
1a490 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  p = (int*)sqlite
1a4a0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  3DbMallocZero(. 
1a4b0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c       pParse->db,
1a4c0 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66   nVector*(sizeof
1a4d0 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63  (int) + sizeof(c
1a4e0 68 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20  har)) + 1.  );. 
1a4f0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
1a500 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1a510 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  goto sqlite3Expr
1a520 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72  CodeIN_oom_error
1a530 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  ;..  /* Attempt 
1a540 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52  to compute the R
1a550 48 53 2e 20 41 66 74 65 72 20 74 68 69 73 20 73  HS. After this s
1a560 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67  tep, if anything
1a570 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a   other than.  **
1a580 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
1a590 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
1a5a0 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 77 69 74  table opened wit
1a5b0 68 20 63 75 72 73 6f 72 20 69 54 61 62 0a 20 20  h cursor iTab.  
1a5c0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
1a5d0 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65  values that make
1a5e0 20 75 70 20 74 68 65 20 52 48 53 2e 20 49 66 20   up the RHS. If 
1a5f0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73  IN_INDEX_NOOP is
1a600 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20   returned,.  ** 
1a610 74 68 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20  the RHS has not 
1a620 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20  yet been coded. 
1a630 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
1a640 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
1a650 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
1a660 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64   /* OOM detected
1a670 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72   prior to this r
1a680 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65  outine */.  Vdbe
1a690 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1a6a0 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29  "begin IN expr")
1a6b0 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c  );.  eType = sql
1a6c0 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
1a6d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20  pParse, pExpr,. 
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49              IN_I
1a700 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
1a710 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  | IN_INDEX_NOOP_
1a720 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK,.            
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a740 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65   destIfFalse==de
1a750 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26  stIfNull ? 0 : &
1a760 72 52 68 73 48 61 73 4e 75 6c 6c 2c 0a 20 20 20  rRhsHasNull,.   
1a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a780 20 20 20 20 20 20 20 20 20 20 61 69 4d 61 70 2c            aiMap,
1a790 20 26 69 54 61 62 29 3b 0a 0a 20 20 61 73 73 65   &iTab);..  asse
1a7a0 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
1a7b0 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c   || nVector==1 |
1a7c0 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  | eType==IN_INDE
1a7d0 58 5f 45 50 48 0a 20 20 20 20 20 20 20 7c 7c 20  X_EPH.       || 
1a7e0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
1a7f0 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20 65 54 79  INDEX_ASC || eTy
1a800 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe==IN_INDEX_IND
1a810 45 58 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23 69  EX_DESC .  );.#i
1a820 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1a830 47 0a 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20 74  G.  /* Confirm t
1a840 68 61 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e 74  hat aiMap[] cont
1a850 61 69 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e 74  ains nVector int
1a860 65 67 65 72 20 76 61 6c 75 65 73 20 62 65 74 77  eger values betw
1a870 65 65 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20 6e  een 0 and.  ** n
1a880 56 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66  Vector-1. */.  f
1a890 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
1a8a0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  r; i++){.    int
1a8b0 20 6a 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f 72   j, cnt;.    for
1a8c0 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63  (cnt=j=0; j<nVec
1a8d0 74 6f 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61 69  tor; j++) if( ai
1a8e0 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b  Map[j]==i ) cnt+
1a8f0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  +;.    assert( c
1a900 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65 6e  nt==1 );.  }.#en
1a910 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74  dif..  /* Code t
1a920 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70  he LHS, the <exp
1a930 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
1a940 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68  IN (...)". If th
1a950 65 20 4c 48 53 20 69 73 20 61 20 0a 20 20 2a 2a  e LHS is a .  **
1a960 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 69 74   vector, then it
1a970 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e   is stored in an
1a980 20 61 72 72 61 79 20 6f 66 20 6e 56 65 63 74 6f   array of nVecto
1a990 72 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  r registers star
1a9a0 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72 31  ting .  ** at r1
1a9b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69  ..  **.  ** sqli
1a9c0 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29  te3FindInIndex()
1a9d0 20 6d 69 67 68 74 20 68 61 76 65 20 72 65 6f 72   might have reor
1a9e0 64 65 72 65 64 20 74 68 65 20 66 69 65 6c 64 73  dered the fields
1a9f0 20 6f 66 20 74 68 65 20 4c 48 53 20 76 65 63 74   of the LHS vect
1aa00 6f 72 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  or.  ** so that 
1aa10 74 68 65 20 66 69 65 6c 64 73 20 61 72 65 20 69  the fields are i
1aa20 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72  n the same order
1aa30 20 61 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20   as an existing 
1aa40 69 6e 64 65 78 2e 20 20 20 54 68 65 0a 20 20 2a  index.   The.  *
1aa50 2a 20 61 69 4d 61 70 5b 5d 20 61 72 72 61 79 20  * aiMap[] array 
1aa60 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 70 70 69  contains a mappi
1aa70 6e 67 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67  ng from the orig
1aa80 69 6e 61 6c 20 4c 48 53 20 66 69 65 6c 64 20 6f  inal LHS field o
1aa90 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65  rder to.  ** the
1aaa0 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74 68 61   field order tha
1aab0 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 52 48  t matches the RH
1aac0 53 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20  S index..  */.  
1aad0 72 4c 68 73 4f 72 69 67 20 3d 20 65 78 70 72 43  rLhsOrig = exprC
1aae0 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65  odeVector(pParse
1aaf0 2c 20 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d 79  , pLeft, &iDummy
1ab00 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1ab10 6e 56 65 63 74 6f 72 20 26 26 20 61 69 4d 61 70  nVector && aiMap
1ab20 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f  [i]==i; i++){} /
1ab30 2a 20 41 72 65 20 4c 48 53 20 66 69 65 6c 64 73  * Are LHS fields
1ab40 20 72 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a 20   reordered? */. 
1ab50 20 69 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72 20   if( i==nVector 
1ab60 29 7b 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66 69  ){.    /* LHS fi
1ab70 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 72 65 6f  elds are not reo
1ab80 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 72 4c  rdered */.    rL
1ab90 68 73 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a 20  hs = rLhsOrig;. 
1aba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e   }else{.    /* N
1abb0 65 65 64 20 74 6f 20 72 65 6f 72 64 65 72 20 74  eed to reorder t
1abc0 68 65 20 4c 48 53 20 66 69 65 6c 64 73 20 61 63  he LHS fields ac
1abd0 63 6f 72 64 69 6e 67 20 74 6f 20 61 69 4d 61 70  cording to aiMap
1abe0 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 73   */.    rLhs = s
1abf0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1ac00 67 65 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74  ge(pParse, nVect
1ac10 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  or);.    for(i=0
1ac20 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
1ac30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1ac40 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1ac50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67 2b  _Copy, rLhsOrig+
1ac60 69 2c 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69 5d  i, rLhs+aiMap[i]
1ac70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
1ac80 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33  .  /* If sqlite3
1ac90 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69  FindInIndex() di
1aca0 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72  d not find or cr
1acb0 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68  eate an index th
1acc0 61 74 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61  at is.  ** suita
1acd0 62 6c 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ble for evaluati
1ace0 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  ng the IN operat
1acf0 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74  or, then evaluat
1ad00 65 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73  e using a.  ** s
1ad10 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
1ad20 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a  risons..  **.  *
1ad30 2a 20 54 68 69 73 20 69 73 20 73 74 65 70 20 28  * This is step (
1ad40 31 29 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70 65  1) in the in-ope
1ad50 72 61 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69 7a  rator.md optimiz
1ad60 65 64 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20  ed algorithm..  
1ad70 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
1ad80 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b  IN_INDEX_NOOP ){
1ad90 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1ada0 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
1adb0 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53  pList;.    CollS
1adc0 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
1add0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1ade0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1adf0 65 66 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61  eft);.    int la
1ae00 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  belOk = sqlite3V
1ae10 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
1ae20 72 73 65 29 3b 0a 20 20 20 20 69 6e 74 20 72 32  rse);.    int r2
1ae30 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20  , regToFree;.   
1ae40 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d   int regCkNull =
1ae50 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   0;.    int ii;.
1ae60 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1ae70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1ae80 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1ae90 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73  ) );.    if( des
1aea0 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46  tIfNull!=destIfF
1aeb0 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alse ){.      re
1aec0 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  gCkNull = sqlite
1aed0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
1aee0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1aef0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1af00 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73 2c  OP_BitAnd, rLhs,
1af10 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c 6c   rLhs, regCkNull
1af20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
1af30 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d  (ii=0; ii<pList-
1af40 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
1af50 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1af60 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1af70 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  arse, pList->a[i
1af80 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f  i].pExpr, &regTo
1af90 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Free);.      if(
1afa0 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71   regCkNull && sq
1afb0 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
1afc0 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  ll(pList->a[ii].
1afd0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
1afe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1aff0 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64  Op3(v, OP_BitAnd
1b000 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c  , regCkNull, r2,
1b010 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20   regCkNull);.   
1b020 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
1b030 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
1b040 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d   || destIfNull!=
1b050 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
1b060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1b070 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
1b080 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b  q, rLhs, labelOk
1b090 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20  , r2,.          
1b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0b0 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34  (void*)pColl, P4
1b0c0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
1b0d0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1b0e0 66 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e  f(v, ii<pList->n
1b0f0 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20  Expr-1);.       
1b100 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1b110 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45  v, ii==pList->nE
1b120 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  xpr-1);.        
1b130 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1b140 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b  eP5(v, zAff[0]);
1b150 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65        assert( de
1b170 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
1b180 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20  False );.       
1b190 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b1a0 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68  p4(v, OP_Ne, rLh
1b1b0 73 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  s, destIfFalse, 
1b1c0 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r2,.            
1b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1b1e0 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
1b1f0 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76  OLLSEQ); VdbeCov
1b200 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
1b210 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1b220 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d  ngeP5(v, zAff[0]
1b230 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   | SQLITE_JUMPIF
1b240 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
1b250 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
1b260 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1b270 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20  e, regToFree);. 
1b280 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67     }.    if( reg
1b290 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  CkNull ){.      
1b2a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b2b0 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
1b2c0 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49  regCkNull, destI
1b2d0 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65  fNull); VdbeCove
1b2e0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
1b2f0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1b300 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
1b310 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1b320 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1b330 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20  l(v, labelOk);. 
1b340 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1b350 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1b360 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20   regCkNull);.   
1b370 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70   goto sqlite3Exp
1b380 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64  rCodeIN_finished
1b390 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70  ;.  }..  /* Step
1b3a0 20 32 3a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   2: Check to see
1b3b0 20 69 66 20 74 68 65 20 4c 48 53 20 63 6f 6e 74   if the LHS cont
1b3c0 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63 6f  ains any NULL co
1b3d0 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a 20  lumns.  If the. 
1b3e0 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f 6e   ** LHS does con
1b3f0 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e 20  tain NULLs then 
1b400 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20  the result must 
1b410 62 65 20 65 69 74 68 65 72 20 46 41 4c 53 45 20  be either FALSE 
1b420 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65  or NULL..  ** We
1b430 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70 20   will then skip 
1b440 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
1b450 68 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20  h of the RHS..  
1b460 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 4e  */.  if( destIfN
1b470 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65  ull==destIfFalse
1b480 20 29 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70   ){.    destStep
1b490 32 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b  2 = destIfFalse;
1b4a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
1b4b0 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 53 74  stStep2 = destSt
1b4c0 65 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ep6 = sqlite3Vdb
1b4d0 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
1b4e0 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  e);.  }.  for(i=
1b4f0 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
1b500 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
1b510 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
1b520 69 65 6c 64 53 75 62 65 78 70 72 28 70 45 78 70  ieldSubexpr(pExp
1b530 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  r->pLeft, i);.  
1b540 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1b550 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b  rCanBeNull(p) ){
1b560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1b570 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1b580 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64  sNull, rLhs+i, d
1b590 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20  estStep2);.     
1b5a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b5b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1b5c0 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c  * Step 3.  The L
1b5d0 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20  HS is now known 
1b5e0 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20  to be non-NULL. 
1b5f0 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73   Do the binary s
1b600 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68  earch.  ** of th
1b610 65 20 52 48 53 20 75 73 69 6e 67 20 74 68 65 20  e RHS using the 
1b620 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20  LHS as a probe. 
1b630 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72   If found, the r
1b640 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72  esult is.  ** tr
1b650 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ue..  */.  if( e
1b660 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
1b670 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49  OWID ){.    /* I
1b680 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
1b690 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49   RHS is the ROWI
1b6a0 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65  D of table b-tre
1b6b0 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f  e and so we also
1b6c0 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61  .    ** know tha
1b6d0 74 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e  t the RHS is non
1b6e0 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77  -NULL.  Hence, w
1b6f0 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20  e combine steps 
1b700 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69  3 and 4.    ** i
1b710 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  nto a single opc
1b720 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ode. */.    sqli
1b730 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1b740 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69   OP_SeekRowid, i
1b750 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c 73 65  Tab, destIfFalse
1b760 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20 56 64 62  , rLhs);.    Vdb
1b770 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b780 20 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20    addrTruthOp = 
1b790 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b7a0 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20 20  0(v, OP_Goto);  
1b7b0 2f 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 2a  /* Return True *
1b7c0 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  /.  }else{.    s
1b7d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1b7e0 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
1b7f0 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 2c 20   rLhs, nVector, 
1b800 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f 72  0, zAff, nVector
1b810 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49  );.    if( destI
1b820 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75  fFalse==destIfNu
1b830 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  ll ){.      /* C
1b840 6f 6d 62 69 6e 65 20 53 74 65 70 20 33 20 61 6e  ombine Step 3 an
1b850 64 20 53 74 65 70 20 35 20 69 6e 74 6f 20 61 20  d Step 5 into a 
1b860 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20 2a 2f  single opcode */
1b870 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1b880 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
1b890 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 54 61 62  P_NotFound, iTab
1b8a0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 0a 20  , destIfFalse,. 
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8c0 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20            rLhs, 
1b8d0 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f  nVector); VdbeCo
1b8e0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1b8f0 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70   goto sqlite3Exp
1b900 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64  rCodeIN_finished
1b910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f  ;.    }.    /* O
1b920 72 64 69 6e 61 72 79 20 53 74 65 70 20 33 2c 20  rdinary Step 3, 
1b930 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
1b940 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c  re FALSE and NUL
1b950 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a  L are distinct *
1b960 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f  /.    addrTruthO
1b970 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
1b980 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
1b990 6f 75 6e 64 2c 20 69 54 61 62 2c 20 30 2c 0a 20  ound, iTab, 0,. 
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9c0 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74       rLhs, nVect
1b9d0 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  or); VdbeCoverag
1b9e0 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(v);.  }..  /* 
1b9f0 53 74 65 70 20 34 2e 20 20 49 66 20 74 68 65 20  Step 4.  If the 
1ba00 52 48 53 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20  RHS is known to 
1ba10 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20  be non-NULL and 
1ba20 77 65 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 0a  we did not find.
1ba30 20 20 2a 2a 20 61 6e 20 6d 61 74 63 68 20 6f 6e    ** an match on
1ba40 20 74 68 65 20 73 65 61 72 63 68 20 61 62 6f 76   the search abov
1ba50 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  e, then the resu
1ba60 6c 74 20 6d 75 73 74 20 62 65 20 46 41 4c 53 45  lt must be FALSE
1ba70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 52 68  ..  */.  if( rRh
1ba80 73 48 61 73 4e 75 6c 6c 20 26 26 20 6e 56 65 63  sHasNull && nVec
1ba90 74 6f 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71  tor==1 ){.    sq
1baa0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1bab0 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72  v, OP_NotNull, r
1bac0 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74  RhsHasNull, dest
1bad0 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 56 64  IfFalse);.    Vd
1bae0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1baf0 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35 2e   }..  /* Step 5.
1bb00 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 63    If we do not c
1bb10 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 64 69  are about the di
1bb20 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
1bb30 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20 46   NULL and.  ** F
1bb40 41 4c 53 45 2c 20 74 68 65 6e 20 6a 75 73 74 20  ALSE, then just 
1bb50 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 0a 20  return false. . 
1bb60 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66   */.  if( destIf
1bb70 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c  False==destIfNul
1bb80 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 47  l ) sqlite3VdbeG
1bb90 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c  oto(v, destIfFal
1bba0 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 74 65 70 20  se);..  /* Step 
1bbb0 36 3a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  6: Loop through 
1bbc0 72 6f 77 73 20 6f 66 20 74 68 65 20 52 48 53 2e  rows of the RHS.
1bbd0 20 20 43 6f 6d 70 61 72 65 20 65 61 63 68 20 72    Compare each r
1bbe0 6f 77 20 74 6f 20 74 68 65 20 4c 48 53 2e 0a 20  ow to the LHS.. 
1bbf0 20 2a 2a 20 49 66 20 61 6e 79 20 63 6f 6d 70 61   ** If any compa
1bc00 72 69 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74  rison is NULL, t
1bc10 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
1bc20 73 20 4e 55 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a  s NULL.  If all.
1bc30 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73    ** comparisons
1bc40 20 61 72 65 20 46 41 4c 53 45 20 74 68 65 6e 20   are FALSE then 
1bc50 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74  the final result
1bc60 20 69 73 20 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a   is FALSE..  **.
1bc70 20 20 2a 2a 20 46 6f 72 20 61 20 73 63 61 6c 61    ** For a scala
1bc80 72 20 4c 48 53 2c 20 69 74 20 69 73 20 73 75 66  r LHS, it is suf
1bc90 66 69 63 69 65 6e 74 20 74 6f 20 63 68 65 63 6b  ficient to check
1bca0 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20   just the first 
1bcb0 72 6f 77 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  row.  ** of the 
1bcc0 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  RHS..  */.  if( 
1bcd0 64 65 73 74 53 74 65 70 36 20 29 20 73 71 6c 69  destStep6 ) sqli
1bce0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1bcf0 62 65 6c 28 76 2c 20 64 65 73 74 53 74 65 70 36  bel(v, destStep6
1bd00 29 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  );.  addrTop = s
1bd10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1bd20 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
1bd30 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c 73 65  Tab, destIfFalse
1bd40 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
1bd50 65 28 76 29 3b 0a 20 20 69 66 28 20 6e 56 65 63  e(v);.  if( nVec
1bd60 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64 65 73  tor>1 ){.    des
1bd70 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  tNotNull = sqlit
1bd80 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1bd90 70 50 61 72 73 65 29 3b 0a 20 20 7d 65 6c 73 65  pParse);.  }else
1bda0 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65  {.    /* For nVe
1bdb0 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65  ctor==1, combine
1bdc0 20 73 74 65 70 73 20 36 20 61 6e 64 20 37 20 62   steps 6 and 7 b
1bdd0 79 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  y immediately re
1bde0 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46  turning.    ** F
1bdf0 41 4c 53 45 20 69 66 20 74 68 65 20 66 69 72 73  ALSE if the firs
1be00 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  t comparison is 
1be10 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20  not NULL */.    
1be20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65  destNotNull = de
1be30 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20  stIfFalse;.  }. 
1be40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
1be50 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  tor; i++){.    E
1be60 78 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c  xpr *p;.    Coll
1be70 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
1be80 69 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65 33  int r3 = sqlite3
1be90 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
1bea0 65 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  e);.    p = sqli
1beb0 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
1bec0 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b  bexpr(pLeft, i);
1bed0 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1bee0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1bef0 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
1bf00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bf10 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
1bf20 69 54 61 62 2c 20 69 2c 20 72 33 29 3b 0a 20 20  iTab, i, r3);.  
1bf30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bf40 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c  Op4(v, OP_Ne, rL
1bf50 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75 6c  hs+i, destNotNul
1bf60 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20  l, r3,.         
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
1bf80 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  id*)pColl, P4_CO
1bf90 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56 64 62 65  LLSEQ);.    Vdbe
1bfa0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1bfb0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1bfc0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1bfd0 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  3);.  }.  sqlite
1bfe0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1bff0 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49  P_Goto, 0, destI
1c000 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 56  fNull);.  if( nV
1c010 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 73  ector>1 ){.    s
1c020 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1c030 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 4e 6f  eLabel(v, destNo
1c040 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  tNull);.    sqli
1c050 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c060 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
1c070 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20  addrTop+1);.    
1c080 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1c090 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37 3a  ..    /* Step 7:
1c0a0 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68    If we reach th
1c0b0 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
1c0c0 77 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  w that the resul
1c0d0 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  t must.    ** be
1c0e0 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73   false. */.    s
1c0f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c100 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1c110 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1c120 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65  }..  /* Jumps he
1c130 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72  re in order to r
1c140 65 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20  eturn true. */. 
1c150 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1c160 48 65 72 65 28 76 2c 20 61 64 64 72 54 72 75 74  Here(v, addrTrut
1c170 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78  hOp);..sqlite3Ex
1c180 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65  prCodeIN_finishe
1c190 64 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d 72  d:.  if( rLhs!=r
1c1a0 4c 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74 65  LhsOrig ) sqlite
1c1b0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1c1c0 70 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20  pParse, rLhs);. 
1c1d0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1c1e0 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29   "end IN expr"))
1c1f0 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  ;.sqlite3ExprCod
1c200 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20  eIN_oom_error:. 
1c210 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1c220 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70  Parse->db, aiMap
1c230 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1c240 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
1c250 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Aff);.}.#endif /
1c260 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
1c270 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
1c280 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1c290 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
1c2a0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
1c2b0 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
1c2c0 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
1c2d0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
1c2e0 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
1c2f0 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  by z[0..n-1] int
1c300 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
1c310 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
1c320 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
1c330 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
1c340 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
1c350 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
1c360 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
1c370 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
1c380 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
1c390 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
1c3a0 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
1c3b0 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
1c3c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c3d0 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
1c3e0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
1c3f0 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c   int negateFlag,
1c400 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66   int iMem){.  if
1c410 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29  ( ALWAYS(z!=0) )
1c420 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
1c430 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41  ue;.    sqlite3A
1c440 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73  toF(z, &value, s
1c450 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1c460 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
1c470 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71  .    assert( !sq
1c480 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
1c490 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20  ) ); /* The new 
1c4a0 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72  AtoF never retur
1c4b0 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66  ns NaN */.    if
1c4c0 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
1c4d0 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
1c4e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c4f0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52  dOp4Dup8(v, OP_R
1c500 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  eal, 0, iMem, 0,
1c510 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
1c520 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65  _REAL);.  }.}.#e
1c530 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ndif.../*.** Gen
1c540 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
1c550 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
1c560 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
1c570 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
1c580 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  xt z[0..n-1] int
1c590 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
1c5a0 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54  .**.** Expr.u.zT
1c5b0 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55  oken is always U
1c5c0 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72  TF8 and zero-ter
1c5d0 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  minated..*/.stat
1c5e0 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
1c5f0 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ger(Parse *pPars
1c600 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1c610 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74  int negFlag, int
1c620 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a   iMem){.  Vdbe *
1c630 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1c640 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  e;.  if( pExpr->
1c650 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
1c660 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lue ){.    int i
1c670 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c   = pExpr->u.iVal
1c680 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
1c690 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
1c6a0 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69  negFlag ) i = -i
1c6b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1c6c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1c6d0 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b  teger, i, iMem);
1c6e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1c6f0 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c  t c;.    i64 val
1c700 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ue;.    const ch
1c710 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75  ar *z = pExpr->u
1c720 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73  .zToken;.    ass
1c730 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20  ert( z!=0 );.   
1c740 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f   c = sqlite3DecO
1c750 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61  rHexToI64(z, &va
1c760 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 28 63  lue);.    if( (c
1c770 3d 3d 33 20 26 26 20 21 6e 65 67 46 6c 61 67 29  ==3 && !negFlag)
1c780 20 7c 7c 20 28 63 3d 3d 32 29 20 7c 7c 20 28 6e   || (c==2) || (n
1c790 65 67 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d  egFlag && value=
1c7a0 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29  =SMALLEST_INT64)
1c7b0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1c7c0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1c7d0 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74  OINT.      sqlit
1c7e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c7f0 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e  e, "oversized in
1c800 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65  teger: %s%s", ne
1c810 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22  gFlag ? "-" : ""
1c820 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e  , z);.#else.#ifn
1c830 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c840 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20  HEX_INTEGER.    
1c850 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1c860 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29  rnicmp(z,"0x",2)
1c870 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1c880 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1c890 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65  Parse, "hex lite
1c8a0 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25  ral too big: %s%
1c8b0 73 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a  s", negFlag?"-":
1c8c0 22 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  "",z);.      }el
1c8d0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
1c8e0 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  {.        codeRe
1c8f0 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67  al(v, z, negFlag
1c900 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d  , iMem);.      }
1c910 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
1c920 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  e{.      if( neg
1c930 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20  Flag ){ value = 
1c940 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c 45 53 54 5f  c==3 ? SMALLEST_
1c950 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20  INT64 : -value; 
1c960 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1c970 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
1c980 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
1c990 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c  em, 0, (u8*)&val
1c9a0 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  ue, P4_INT64);. 
1c9b0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20     }.  }.}.../* 
1c9c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1c9d0 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74  at will load int
1c9e0 6f 20 72 65 67 69 73 74 65 72 20 72 65 67 4f 75  o register regOu
1c9f0 74 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69  t a value that i
1ca00 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65  s.** appropriate
1ca10 20 66 6f 72 20 74 68 65 20 69 49 64 78 43 6f 6c   for the iIdxCol
1ca20 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  -th column of in
1ca30 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69  dex pIdx..*/.voi
1ca40 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1ca50 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e  eLoadIndexColumn
1ca60 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1ca70 65 2c 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69  e,  /* The parsi
1ca80 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1ca90 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
1caa0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f  /* The index who
1cab0 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20  se column is to 
1cac0 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69  be loaded */.  i
1cad0 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f  nt iTabCur,    /
1cae0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
1caf0 67 20 74 6f 20 61 20 74 61 62 6c 65 20 72 6f 77  g to a table row
1cb00 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 6f   */.  int iIdxCo
1cb10 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c  l,    /* The col
1cb20 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
1cb30 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f   to be loaded */
1cb40 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20  .  int regOut   
1cb50 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
1cb60 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c  index column val
1cb70 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ue in this regis
1cb80 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20  ter */.){.  i16 
1cb90 69 54 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  iTabCol = pIdx->
1cba0 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c  aiColumn[iIdxCol
1cbb0 5d 3b 0a 20 20 69 66 28 20 69 54 61 62 43 6f 6c  ];.  if( iTabCol
1cbc0 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20  ==XN_EXPR ){.   
1cbd0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
1cbe0 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20 20 61  ColExpr );.    a
1cbf0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f  ssert( pIdx->aCo
1cc00 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64  lExpr->nExpr>iId
1cc10 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61 72  xCol );.    pPar
1cc20 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69  se->iSelfTab = i
1cc30 54 61 62 43 75 72 20 2b 20 31 3b 0a 20 20 20 20  TabCur + 1;.    
1cc40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
1cc50 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 64 78  opy(pParse, pIdx
1cc60 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49  ->aColExpr->a[iI
1cc70 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65  dxCol].pExpr, re
1cc80 67 4f 75 74 29 3b 0a 20 20 20 20 70 50 61 72 73  gOut);.    pPars
1cc90 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 30 3b  e->iSelfTab = 0;
1cca0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1ccb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1ccc0 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50  ColumnOfTable(pP
1ccd0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 49 64  arse->pVdbe, pId
1cce0 78 2d 3e 70 54 61 62 6c 65 2c 20 69 54 61 62 43  x->pTable, iTabC
1ccf0 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ur,.            
1cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd10 20 20 20 20 20 20 20 20 69 54 61 62 43 6f 6c 2c          iTabCol,
1cd20 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a   regOut);.  }.}.
1cd30 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1cd40 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20  code to extract 
1cd50 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1cd60 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
1cd70 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76  of a table..*/.v
1cd80 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1cd90 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
1cda0 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  ble(.  Vdbe *v, 
1cdb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
1cdc0 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  BE under constru
1cdd0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65  ction */.  Table
1cde0 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68   *pTab,    /* Th
1cdf0 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  e table containi
1ce00 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a  ng the value */.
1ce10 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
1ce20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63    /* The table c
1ce30 75 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50  ursor.  Or the P
1ce40 4b 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54  K cursor for WIT
1ce50 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20  HOUT ROWID */.  
1ce60 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
1ce70 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1ce80 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63  column to extrac
1ce90 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  t */.  int regOu
1cea0 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63  t      /* Extrac
1ceb0 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f  t the value into
1cec0 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
1ced0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 54 61 62 3d  /.){.  if( pTab=
1cee0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1cef0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1cf00 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 43 75  P_Column, iTabCu
1cf10 72 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29  r, iCol, regOut)
1cf20 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1cf30 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c  }.  if( iCol<0 |
1cf40 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50  | iCol==pTab->iP
1cf50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
1cf60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1cf70 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75  OP_Rowid, iTabCu
1cf80 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65  r, regOut);.  }e
1cf90 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  lse{.    int op 
1cfa0 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  = IsVirtual(pTab
1cfb0 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a  ) ? OP_VColumn :
1cfc0 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   OP_Column;.    
1cfd0 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20  int x = iCol;.  
1cfe0 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
1cff0 70 54 61 62 29 20 26 26 20 21 49 73 56 69 72 74  pTab) && !IsVirt
1d000 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
1d010 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f     x = sqlite3Co
1d020 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69  lumnOfIndex(sqli
1d030 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
1d040 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b  ex(pTab), iCol);
1d050 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d060 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1d070 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20  op, iTabCur, x, 
1d080 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69  regOut);.  }.  i
1d090 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
1d0a0 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44    sqlite3ColumnD
1d0b0 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20  efault(v, pTab, 
1d0c0 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  iCol, regOut);. 
1d0d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
1d0e0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
1d0f0 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20  ill extract the 
1d100 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d  iColumn-th colum
1d110 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20  n from.** table 
1d120 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74  pTab and store t
1d130 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
1d140 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
1d150 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  . .**.** There m
1d160 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
1d170 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
1d180 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69   iTable when thi
1d190 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
1d1a0 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c  called.  If iCol
1d1b0 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  umn<0 then code 
1d1c0 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
1d1d0 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
1d1e0 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  owid..*/.int sql
1d1f0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1d200 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
1d210 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
1d220 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1d230 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1d240 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1d250 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
1d260 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
1d270 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
1d280 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
1d290 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
1d2a0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
1d2b0 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
1d2c0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1d2d0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
1d2e0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
1d2f0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
1d300 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g,        /* Sto
1d310 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
1d320 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20  */.  u8 p5      
1d330 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75        /* P5 valu
1d340 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20  e for OP_Column 
1d350 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20  + FLAGS */.){.  
1d360 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1d370 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
1d380 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c  t( v!=0 );.  sql
1d390 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1d3a0 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
1d3b0 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43  pTab, iTable, iC
1d3c0 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
1d3d0 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71  if( p5 ){.    sq
1d3e0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1d3f0 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 0a 20 20  5(v, p5);.  }.  
1d400 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a  return iReg;.}..
1d410 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1d420 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74  ode to move cont
1d430 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ent from registe
1d440 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d  rs iFrom...iFrom
1d450 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20  +nReg-1.** over 
1d460 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67  to iTo..iTo+nReg
1d470 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  -1..*/.void sqli
1d480 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
1d490 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1d4a0 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
1d4b0 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  o, int nReg){.  
1d4c0 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69  assert( iFrom>=i
1d4d0 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d  To+nReg || iFrom
1d4e0 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20  +nReg<=iTo );.  
1d4f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d500 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  3(pParse->pVdbe,
1d510 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c   OP_Move, iFrom,
1d520 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a   iTo, nReg);.}..
1d530 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
1d540 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
1d550 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52  n node to a TK_R
1d560 45 47 49 53 54 45 52 20 72 65 66 65 72 65 6e 63  EGISTER referenc
1d570 69 6e 67 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  ing.** register 
1d580 69 52 65 67 2e 20 20 54 68 65 20 63 61 6c 6c 65  iReg.  The calle
1d590 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
1d5a0 61 74 20 69 52 65 67 20 61 6c 72 65 61 64 79 20  at iReg already 
1d5b0 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20  contains.** the 
1d5c0 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1d5d0 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
1d5e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d5f0 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
1d600 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1d610 20 69 52 65 67 29 7b 0a 20 20 45 78 70 72 20 2a   iReg){.  Expr *
1d620 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
1d630 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b  kipCollateAndLik
1d640 65 6c 79 28 70 45 78 70 72 29 3b 0a 20 20 70 2d  ely(pExpr);.  p-
1d650 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  >op2 = p->op;.  
1d660 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  p->op = TK_REGIS
1d670 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65  TER;.  p->iTable
1d680 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43   = iReg;.  ExprC
1d690 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20  learProperty(p, 
1d6a0 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a  EP_Skip);.}../*.
1d6b0 2a 2a 20 45 76 61 6c 75 61 74 65 20 61 6e 20 65  ** Evaluate an e
1d6c0 78 70 72 65 73 73 69 6f 6e 20 28 65 69 74 68 65  xpression (eithe
1d6d0 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20  r a vector or a 
1d6e0 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
1d6f0 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20  n) and store.** 
1d700 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 63 6f  the result in co
1d710 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72  ntinguous tempor
1d720 61 72 79 20 72 65 67 69 73 74 65 72 73 2e 20 20  ary registers.  
1d730 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1d740 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   of.** the first
1d750 20 72 65 67 69 73 74 65 72 20 75 73 65 64 20 74   register used t
1d760 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
1d770 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  lt..**.** If the
1d780 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74   returned result
1d790 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
1d7a0 65 6d 70 6f 72 61 72 79 20 73 63 61 6c 61 72 2c  emporary scalar,
1d7b0 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65   then also write
1d7c0 0a 2a 2a 20 74 68 61 74 20 72 65 67 69 73 74 65  .** that registe
1d7d0 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  r number into *p
1d7e0 69 46 72 65 65 61 62 6c 65 2e 20 20 49 66 20 74  iFreeable.  If t
1d7f0 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75  he returned resu
1d800 6c 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 69  lt register.** i
1d810 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
1d820 79 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72  y or if the expr
1d830 65 73 73 69 6f 6e 20 69 73 20 61 20 76 65 63 74  ession is a vect
1d840 6f 72 20 73 65 74 20 2a 70 69 46 72 65 65 61 62  or set *piFreeab
1d850 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73  le.** to 0..*/.s
1d860 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f  tatic int exprCo
1d870 64 65 56 65 63 74 6f 72 28 50 61 72 73 65 20 2a  deVector(Parse *
1d880 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c  pParse, Expr *p,
1d890 20 69 6e 74 20 2a 70 69 46 72 65 65 61 62 6c 65   int *piFreeable
1d8a0 29 7b 0a 20 20 69 6e 74 20 69 52 65 73 75 6c 74  ){.  int iResult
1d8b0 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 20  ;.  int nResult 
1d8c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
1d8d0 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20 69 66  torSize(p);.  if
1d8e0 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a  ( nResult==1 ){.
1d8f0 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71      iResult = sq
1d900 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1d910 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 69 46  p(pParse, p, piF
1d920 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73  reeable);.  }els
1d930 65 7b 0a 20 20 20 20 2a 70 69 46 72 65 65 61 62  e{.    *piFreeab
1d940 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  le = 0;.    if( 
1d950 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  p->op==TK_SELECT
1d960 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
1d970 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
1d980 20 20 20 69 52 65 73 75 6c 74 20 3d 20 30 3b 0a     iResult = 0;.
1d990 23 65 6c 73 65 0a 20 20 20 20 20 20 69 52 65 73  #else.      iRes
1d9a0 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ult = sqlite3Cod
1d9b0 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
1d9c0 65 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  e, p);.#endif.  
1d9d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1d9e0 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 52 65 73  nt i;.      iRes
1d9f0 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ult = pParse->nM
1da00 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72  em+1;.      pPar
1da10 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73  se->nMem += nRes
1da20 75 6c 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ult;.      for(i
1da30 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69  =0; i<nResult; i
1da40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
1da50 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74  ite3ExprCodeFact
1da60 6f 72 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  orable(pParse, p
1da70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1da80 70 45 78 70 72 2c 20 69 2b 69 52 65 73 75 6c 74  pExpr, i+iResult
1da90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1daa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
1dab0 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  esult;.}.../*.**
1dac0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
1dad0 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
1dae0 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65  Vdbe to evaluate
1daf0 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
1db00 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d  pression.  Attem
1db10 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  pt to store the 
1db20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
1db30 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a  ter "target"..**
1db40 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
1db50 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c  ster where resul
1db60 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ts are stored..*
1db70 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72  *.** With this r
1db80 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73  outine, there is
1db90 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68   no guarantee th
1dba0 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a  at results will.
1dbb0 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ** be stored in 
1dbc0 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
1dbd0 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f  ult might be sto
1dbe0 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  red in some othe
1dbf0 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66  r.** register if
1dc00 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e   it is convenien
1dc10 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65  t to do so.  The
1dc20 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1dc30 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20  n.** must check 
1dc40 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
1dc50 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73  and move the res
1dc60 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69  ults to the desi
1dc70 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e  red.** register.
1dc80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
1dc90 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61  xprCodeTarget(Pa
1dca0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1dcb0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
1dcc0 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
1dcd0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1dce0 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64  ;  /* The VM und
1dcf0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1dd00 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dd20 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69  * The opcode bei
1dd30 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
1dd40 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74  t inReg = target
1dd50 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
1dd60 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  ts stored in reg
1dd70 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20  ister inReg */. 
1dd80 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
1dd90 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
1dda0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
1ddb0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
1ddc0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
1ddd0 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20  regFree2 = 0;   
1dde0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
1ddf0 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
1de00 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1de10 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72  r */.  int r1, r
1de20 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
1de30 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69   /* Various regi
1de40 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a  ster numbers */.
1de50 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20 20    Expr tempX;   
1de60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1de70 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73 73  emporary express
1de80 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  ion node */.  in
1de90 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73  t p5 = 0;..  ass
1dea0 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26  ert( target>0 &&
1deb0 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d   target<=pParse-
1dec0 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76  >nMem );.  if( v
1ded0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
1dee0 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
1def0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1df00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1df10 0a 0a 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76  ..expr_code_doov
1df20 65 72 3a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  er:.  if( pExpr=
1df30 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54  =0 ){.    op = T
1df40 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  K_NULL;.  }else{
1df50 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  .    op = pExpr-
1df60 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  >op;.  }.  switc
1df70 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
1df80 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
1df90 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
1dfa0 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78   *pAggInfo = pEx
1dfb0 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
1dfc0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
1dfd0 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
1dfe0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70  pAggInfo->aCol[p
1dff0 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20  Expr->iAgg];.   
1e000 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f     if( !pAggInfo
1e010 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a  ->directMode ){.
1e020 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e030 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a  pCol->iMem>0 );.
1e040 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1e050 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20  Col->iMem;.     
1e060 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49   }else if( pAggI
1e070 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49  nfo->useSortingI
1e080 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dx ){.        sq
1e090 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1e0a0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41  v, OP_Column, pA
1e0b0 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49  ggInfo->sortingI
1e0c0 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20  dxPTab,.        
1e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0e0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
1e0f0 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  terColumn, targe
1e100 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
1e110 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20  rn target;.     
1e120 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65   }.      /* Othe
1e130 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75  rwise, fall thru
1e140 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c   into the TK_COL
1e150 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  UMN case */.    
1e160 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
1e170 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  LUMN: {.      in
1e180 74 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  t iTab = pExpr->
1e190 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66  iTable;.      if
1e1a0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1e1b0 79 28 70 45 78 70 72 2c 20 45 50 5f 46 69 78 65  y(pExpr, EP_Fixe
1e1c0 64 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  dCol) ){.       
1e1d0 20 2f 2a 20 54 68 69 73 20 43 4f 4c 55 4d 4e 20   /* This COLUMN 
1e1e0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
1e1f0 61 6c 6c 79 20 61 20 63 6f 6e 73 74 61 6e 74 20  ally a constant 
1e200 64 75 65 20 74 6f 20 57 48 45 52 45 20 63 6c 61  due to WHERE cla
1e210 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  use.        ** c
1e220 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e 64 20  onstraints, and 
1e230 74 68 61 74 20 63 6f 6e 73 74 61 6e 74 20 69 73  that constant is
1e240 20 63 6f 64 65 64 20 62 79 20 74 68 65 20 70 45   coded by the pE
1e250 78 70 72 2d 3e 70 4c 65 66 74 0a 20 20 20 20 20  xpr->pLeft.     
1e260 20 20 20 2a 2a 20 65 78 70 72 65 73 73 73 69 6f     ** expresssio
1e270 6e 2e 20 20 48 6f 77 65 76 65 72 2c 20 6d 61 6b  n.  However, mak
1e280 65 20 73 75 72 65 20 74 68 65 20 63 6f 6e 73 74  e sure the const
1e290 61 6e 74 20 68 61 73 20 74 68 65 20 63 6f 72 72  ant has the corr
1e2a0 65 63 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  ect.        ** d
1e2b0 61 74 61 74 79 70 65 20 62 79 20 61 70 70 6c 79  atatype by apply
1e2c0 69 6e 67 20 74 68 65 20 41 66 66 69 6e 69 74 79  ing the Affinity
1e2d0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
1e2e0 6c 75 6d 6e 20 74 6f 20 74 68 65 0a 20 20 20 20  lumn to the.    
1e2f0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 2e      ** constant.
1e300 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1e310 20 20 20 20 69 6e 74 20 69 52 65 67 20 3d 20 73      int iReg = s
1e320 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1e330 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1e340 70 72 2d 3e 70 4c 65 66 74 2c 74 61 72 67 65 74  pr->pLeft,target
1e350 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  );.        int a
1e360 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c  ff = sqlite3Tabl
1e370 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  eColumnAffinity(
1e380 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 2c 20 70  pExpr->y.pTab, p
1e390 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
1e3a0 20 20 20 20 20 20 20 20 69 66 28 20 61 66 66 3e          if( aff>
1e3b0 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
1e3c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
1e3d0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
1e3e0 41 66 66 5b 5d 20 3d 20 22 42 5c 30 30 30 43 5c  Aff[] = "B\000C\
1e3f0 30 30 30 44 5c 30 30 30 45 22 3b 0a 20 20 20 20  000D\000E";.    
1e400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
1e410 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3d 3d 27  LITE_AFF_BLOB=='
1e420 41 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  A' );.          
1e430 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 41  assert( SQLITE_A
1e440 46 46 5f 54 45 58 54 3d 3d 27 42 27 20 29 3b 0a  FF_TEXT=='B' );.
1e450 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52            if( iR
1e460 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
1e470 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e480 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e490 50 5f 53 43 6f 70 79 2c 20 69 52 65 67 2c 20 74  P_SCopy, iReg, t
1e4a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1e4b0 20 20 20 20 69 52 65 67 20 3d 20 74 61 72 67 65      iReg = targe
1e4c0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
1e4d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e4e0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1e4f0 5f 41 66 66 69 6e 69 74 79 2c 20 69 52 65 67 2c  _Affinity, iReg,
1e500 20 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   1, 0,.         
1e510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e520 20 20 20 26 7a 41 66 66 5b 28 61 66 66 2d 27 42     &zAff[(aff-'B
1e530 27 29 2a 32 5d 2c 20 50 34 5f 53 54 41 54 49 43  ')*2], P4_STATIC
1e540 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1e550 20 20 20 20 20 72 65 74 75 72 6e 20 69 52 65 67       return iReg
1e560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e570 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20  if( iTab<0 ){.  
1e580 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
1e590 2d 3e 69 53 65 6c 66 54 61 62 3c 30 20 29 7b 0a  ->iSelfTab<0 ){.
1e5a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
1e5b0 65 72 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f  erating CHECK co
1e5c0 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73  nstraints or ins
1e5d0 65 72 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74  erting into part
1e5e0 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ial index */.   
1e5f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45         return pE
1e600 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70  xpr->iColumn - p
1e610 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b  Parse->iSelfTab;
1e620 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1e630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64            /* Cod
1e640 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ing an expressio
1e650 6e 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  n that is part o
1e660 66 20 61 6e 20 69 6e 64 65 78 20 77 68 65 72 65  f an index where
1e670 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
1e680 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
1e690 65 20 69 6e 64 65 78 20 72 65 66 65 72 20 74 6f  e index refer to
1e6a0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 77 68   the table to wh
1e6b0 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 62 65  ich the index be
1e6c0 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20  longs */.       
1e6d0 20 20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65     iTab = pParse
1e6e0 2d 3e 69 53 65 6c 66 54 61 62 20 2d 20 31 3b 0a  ->iSelfTab - 1;.
1e6f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e700 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  }.      return s
1e710 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1e720 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
1e730 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 2c 0a 20  pExpr->y.pTab,. 
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1e760 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54  xpr->iColumn, iT
1e770 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  ab, target,.    
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e790 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1e7a0 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20  ->op2);.    }.  
1e7b0 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
1e7c0 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49  R: {.      codeI
1e7d0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
1e7e0 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29  Expr, 0, target)
1e7f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1e800 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  arget;.    }.   
1e810 20 63 61 73 65 20 54 4b 5f 54 52 55 45 46 41 4c   case TK_TRUEFAL
1e820 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  SE: {.      sqli
1e830 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e840 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73 71 6c   OP_Integer, sql
1e850 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c  ite3ExprTruthVal
1e860 75 65 28 70 45 78 70 72 29 2c 20 74 61 72 67 65  ue(pExpr), targe
1e870 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1e880 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
1e890 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e8a0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1e8b0 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  T.    case TK_FL
1e8c0 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  OAT: {.      ass
1e8d0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1e8e0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e8f0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1e900 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
1e910 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
1e920 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1e930 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1e940 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1e950 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
1e960 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1e970 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e980 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1e990 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1e9a0 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
1e9b0 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c  tring(v, target,
1e9c0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e9d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e9e0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
1e9f0 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
1ea00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1ea10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ea20 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
1ea30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1ea40 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66  arget;.    }.#if
1ea50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ea60 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
1ea70 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
1ea80 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
1ea90 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1eaa0 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  *z;.      char *
1eab0 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73  zBlob;.      ass
1eac0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1ead0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1eae0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1eaf0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1eb00 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1eb10 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a  x' || pExpr->u.z
1eb20 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b  Token[0]=='X' );
1eb30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1eb40 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
1eb50 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
1eb60 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a   z = &pExpr->u.z
1eb70 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20  Token[2];.      
1eb80 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
1eb90 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20  n30(z) - 1;.    
1eba0 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d    assert( z[n]==
1ebb0 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42  '\'' );.      zB
1ebc0 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78  lob = sqlite3Hex
1ebd0 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64  ToBlob(sqlite3Vd
1ebe0 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a  beDb(v), z, n);.
1ebf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ec00 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
1ec10 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c  ob, n/2, target,
1ec20 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59   0, zBlob, P4_DY
1ec30 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72 65  NAMIC);.      re
1ec40 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1ec50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
1ec60 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
1ec70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1ec80 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1ec90 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1eca0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1ecb0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1ecc0 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20  Token!=0 );.    
1ecd0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1ece0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20  >u.zToken[0]!=0 
1ecf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ed00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ed10 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
1ed20 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  ->iColumn, targe
1ed30 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  t);.      if( pE
1ed40 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
1ed50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  !=0 ){.        c
1ed60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
1ed70 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f  qlite3VListNumTo
1ed80 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c  Name(pParse->pVL
1ed90 69 73 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ist, pExpr->iCol
1eda0 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73  umn);.        as
1edb0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1edc0 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c  Token[0]=='?' ||
1edd0 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75   strcmp(pExpr->u
1ede0 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29  .zToken, z)==0 )
1edf0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
1ee00 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b  ->pVList[0] = 0;
1ee10 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 56 4c 69   /* Indicate VLi
1ee20 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72  st may no longer
1ee30 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
1ee40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ee50 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
1ee60 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54  char*)z, P4_STAT
1ee70 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
1ee80 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1ee90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1eea0 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
1eeb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78        return pEx
1eec0 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
1eed0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1eee0 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
1eef0 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
1ef00 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
1ef10 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
1ef20 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
1ef30 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
1ef40 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
1ef50 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1ef60 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1ef70 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
1ef80 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
1ef90 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20  arget ){.       
1efa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1efb0 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
1efc0 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
1efd0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
1efe0 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a  target;.      }.
1eff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f000 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61  eAddOp2(v, OP_Ca
1f010 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  st, target,.    
1f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f030 20 20 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e      sqlite3Affin
1f040 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75  ityType(pExpr->u
1f050 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20  .zToken, 0));.  
1f060 20 20 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67      return inReg
1f070 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1f080 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  * SQLITE_OMIT_CA
1f090 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ST */.    case T
1f0a0 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
1f0b0 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f  K_ISNOT:.      o
1f0c0 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
1f0d0 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
1f0e0 0a 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49  .      p5 = SQLI
1f0f0 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
1f100 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68   /* fall-through
1f110 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
1f120 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
1f130 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
1f140 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
1f150 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
1f160 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
1f170 45 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EQ: {.      Expr
1f180 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
1f190 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66  >pLeft;.      if
1f1a0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
1f1b0 65 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a  ector(pLeft) ){.
1f1c0 20 20 20 20 20 20 20 20 63 6f 64 65 56 65 63 74          codeVect
1f1d0 6f 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  orCompare(pParse
1f1e0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c  , pExpr, target,
1f1f0 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20   op, p5);.      
1f200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1f210 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1f220 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1f230 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1f240 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
1f250 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f260 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f270 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1f280 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63  ree2);.        c
1f290 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1f2a0 65 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  e, pLeft, pExpr-
1f2b0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1f2c0 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1f2d0 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53   inReg, SQLITE_S
1f2e0 54 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20  TOREP2 | p5);.  
1f2f0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f300 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
1f310 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
1f320 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f330 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
1f340 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f350 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
1f360 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
1f370 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f380 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
1f390 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f3a0 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
1f3b0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
1f3c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f3d0 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
1f3e0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f3f0 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
1f400 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
1f410 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f420 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
1f430 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f440 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
1f450 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
1f460 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f470 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  v,op==OP_Eq);.  
1f480 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f490 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74  NE==OP_Ne); test
1f4a0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
1f4b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f4c0 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
1f4d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f4e0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1f4f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f500 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1f510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1f520 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f530 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
1f540 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
1f550 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
1f560 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
1f570 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
1f580 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
1f590 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
1f5a0 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
1f5b0 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
1f5c0 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
1f5d0 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
1f5e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
1f5f0 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
1f600 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
1f610 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e     assert( TK_AN
1f620 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20  D==OP_And );    
1f630 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f640 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ( op==TK_AND );.
1f650 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f660 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20  _OR==OP_Or );   
1f670 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1f680 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29  ase( op==TK_OR )
1f690 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f6a0 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20  TK_PLUS==OP_Add 
1f6b0 29 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73  );           tes
1f6c0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c  tcase( op==TK_PL
1f6d0 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  US );.      asse
1f6e0 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50  rt( TK_MINUS==OP
1f6f0 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20  _Subtract );    
1f700 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f710 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20  K_MINUS );.     
1f720 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
1f730 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
1f740 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f750 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20  op==TK_REM );.  
1f760 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
1f770 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64  ITAND==OP_BitAnd
1f780 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1f790 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44  e( op==TK_BITAND
1f7a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f7b0 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42  ( TK_BITOR==OP_B
1f7c0 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74  itOr );        t
1f7d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f7e0 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61  BITOR );.      a
1f7f0 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d  ssert( TK_SLASH=
1f800 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20  =OP_Divide );   
1f810 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f820 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20  ==TK_SLASH );.  
1f830 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1f840 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c  SHIFT==OP_ShiftL
1f850 65 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  eft );   testcas
1f860 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54  e( op==TK_LSHIFT
1f870 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f880 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_RSHIFT==OP_
1f890 53 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74  ShiftRight );  t
1f8a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f8b0 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  RSHIFT );.      
1f8c0 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41  assert( TK_CONCA
1f8d0 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20  T==OP_Concat ); 
1f8e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f8f0 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a  p==TK_CONCAT );.
1f900 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f910 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f920 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f930 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1f940 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1f950 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f960 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f970 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1f980 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f990 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
1f9a0 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
1f9b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f9c0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1f9d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f9e0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1f9f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fa00 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1fa10 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
1fa20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
1fa30 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
1fa40 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
1fa50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
1fa60 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
1fa70 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ER ){.        co
1fa80 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1fa90 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67  , pLeft, 1, targ
1faa0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  et);.        ret
1fab0 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 69 66 6e  urn target;.#ifn
1fac0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1fad0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1fae0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1faf0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
1fb00 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  AT ){.        as
1fb10 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1fb20 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1fb30 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1fb40 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1fb50 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  , pLeft->u.zToke
1fb60 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 1, target);. 
1fb70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61         return ta
1fb80 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rget;.#endif.   
1fb90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fba0 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f    tempX.op = TK_
1fbb0 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20  INTEGER;.       
1fbc0 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45   tempX.flags = E
1fbd0 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f  P_IntValue|EP_To
1fbe0 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20  kenOnly;.       
1fbf0 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20   tempX.u.iValue 
1fc00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20  = 0;.        r1 
1fc10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1fc20 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74  eTemp(pParse, &t
1fc30 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  empX, &regFree1)
1fc40 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
1fc50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1fc60 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1fc70 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1fc80 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e2);.        sql
1fc90 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1fca0 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
1fcb0 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
1fcc0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1fcd0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1fce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1fcf0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1fd00 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
1fd10 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
1fd20 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1fd30 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42   TK_BITNOT==OP_B
1fd40 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63  itNot );   testc
1fd50 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e  ase( op==TK_BITN
1fd60 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OT );.      asse
1fd70 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e  rt( TK_NOT==OP_N
1fd80 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20 74 65  ot );         te
1fd90 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1fda0 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1fdb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fdc0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1fdd0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1fde0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
1fdf0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1fe00 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1fe10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1fe20 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b   op, r1, inReg);
1fe30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fe40 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1fe50 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69  TRUTH: {.      i
1fe60 6e 74 20 69 73 54 72 75 65 3b 20 20 20 20 2f 2a  nt isTrue;    /*
1fe70 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e   IS TRUE or IS N
1fe80 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20  OT TRUE */.     
1fe90 20 69 6e 74 20 62 4e 6f 72 6d 61 6c 3b 20 20 20   int bNormal;   
1fea0 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
1feb0 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20   FALSE */.      
1fec0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1fed0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1fee0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1fef0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1ff00 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1ff10 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1ff20 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33  isTrue = sqlite3
1ff30 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70  ExprTruthValue(p
1ff40 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
1ff50 20 20 20 20 20 62 4e 6f 72 6d 61 6c 20 3d 20 70       bNormal = p
1ff60 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53  Expr->op2==TK_IS
1ff70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ff80 28 20 69 73 54 72 75 65 20 26 26 20 62 4e 6f 72  ( isTrue && bNor
1ff90 6d 61 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  mal);.      test
1ffa0 63 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26  case( !isTrue &&
1ffb0 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20   bNormal);.     
1ffc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ffd0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 73 54 72  p4Int(v, OP_IsTr
1ffe0 75 65 2c 20 72 31 2c 20 69 6e 52 65 67 2c 20 21  ue, r1, inReg, !
1fff0 69 73 54 72 75 65 2c 20 69 73 54 72 75 65 20 5e  isTrue, isTrue ^
20000 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20   bNormal);.     
20010 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20020 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
20030 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
20040 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  TNULL: {.      i
20050 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
20060 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
20070 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20  ==OP_IsNull );  
20080 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
20090 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
200a0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
200b0 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
200c0 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70   ); testcase( op
200d0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
200e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
200f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
20100 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
20110 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
20120 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
20130 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
20140 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
20150 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
20160 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
20170 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
20180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20190 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20  1(v, op, r1);.  
201a0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
201b0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
201c0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
201d0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
201e0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
201f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20200 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
20210 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29  eger, 0, target)
20220 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20230 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
20240 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ddr);.      brea
20250 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
20260 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
20270 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
20280 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70  fo *pInfo = pExp
20290 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
202a0 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20     if( pInfo==0 
202b0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
202c0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
202d0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
202e0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
202f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
20300 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75  sg(pParse, "misu
20310 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a  se of aggregate:
20320 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75   %s()", pExpr->u
20330 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
20340 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
20350 65 74 75 72 6e 20 70 49 6e 66 6f 2d 3e 61 46 75  eturn pInfo->aFu
20360 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e  nc[pExpr->iAgg].
20370 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iMem;.      }.  
20380 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20390 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
203a0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
203b0 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20  xprList *pFarg; 
203c0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
203d0 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
203e0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nts */.      int
203f0 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20 20   nFarg;         
20400 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20410 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
20420 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e  nts */.      Fun
20430 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20  cDef *pDef;     
20440 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
20450 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ion definition o
20460 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 63  bject */.      c
20470 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20  onst char *zId; 
20480 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
20490 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
204a0 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d 61 73      u32 constMas
204b0 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61  k = 0;     /* Ma
204c0 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  sk of function a
204d0 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72  rguments that ar
204e0 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20  e constant */.  
204f0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
20500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
20510 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
20520 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
20530 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
20540 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
20550 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  onnection */.   
20560 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
20570 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  db);      /* The
20580 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75   text encoding u
20590 73 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61  sed by this data
205a0 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f  base */.      Co
205b0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
205c0 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74  ;    /* A collat
205d0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ing sequence */.
205e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
205f0 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
20600 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
20610 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
20620 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a   EP_WinFunc) ){.
20630 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
20640 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e 72 65  Expr->y.pWin->re
20650 67 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 7d  gResult;.      }
20660 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
20670 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  f( ConstFactorOk
20680 28 70 50 61 72 73 65 29 20 26 26 20 73 71 6c 69  (pParse) && sqli
20690 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
206a0 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20  tNotJoin(pExpr) 
206b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ){.        /* SQ
206c0 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20  L functions can 
206d0 62 65 20 65 78 70 65 6e 73 69 76 65 2e 20 53 6f  be expensive. So
206e0 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 63 6f 6e   try to move con
206f0 73 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e 73 0a  stant functions.
20700 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 20 6f          ** out o
20710 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
20720 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
20730 65 61 6e 73 20 61 6e 20 65 78 74 72 61 20 4f 50  eans an extra OP
20740 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20 20 20  _Copy. */.      
20750 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
20760 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
20770 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31  Parse, pExpr, -1
20780 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20790 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
207a0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
207b0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
207c0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
207d0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
207e0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  r, EP_TokenOnly)
207f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72   ){.        pFar
20800 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
20810 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72  se{.        pFar
20820 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  g = pExpr->x.pLi
20830 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
20840 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20    nFarg = pFarg 
20850 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a  ? pFarg->nExpr :
20860 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
20870 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
20880 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
20890 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
208a0 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  zId = pExpr->u.z
208b0 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44 65  Token;.      pDe
208c0 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
208d0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c  unction(db, zId,
208e0 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b   nFarg, enc, 0);
208f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
20900 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51  NABLE_UNKNOWN_SQ
20910 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20  L_FUNCTION.     
20920 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26 26 20   if( pDef==0 && 
20930 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
20940 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
20950 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
20960 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f  ction(db, "unkno
20970 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c  wn", nFarg, enc,
20980 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
20990 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44  dif.      if( pD
209a0 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78  ef==0 || pDef->x
209b0 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20  Finalize!=0 ){. 
209c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
209d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
209e0 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e  unknown function
209f0 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20  : %s()", zId);. 
20a00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20a10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
20a20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63 74  Attempt a direct
20a30 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
20a40 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  of the built-in 
20a50 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20  COALESCE() and. 
20a60 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29       ** IFNULL()
20a70 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69   functions.  Thi
20a80 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73  s avoids unneces
20a90 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20  sary evaluation 
20aa0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75  of.      ** argu
20ab0 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66  ments past the f
20ac0 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72  irst non-NULL ar
20ad0 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
20ae0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
20af0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
20b00 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43  ITE_FUNC_COALESC
20b10 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E ){.        int
20b20 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73   endCoalesce = s
20b30 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
20b40 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
20b50 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
20b60 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20  rg>=2 );.       
20b70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20b80 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
20b90 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
20ba0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  et);.        for
20bb0 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=1; i<nFarg; i
20bc0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
20bd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20be0 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
20bf0 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65  target, endCoale
20c00 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sce);.          
20c10 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
20c20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20c30 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
20c40 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  e, pFarg->a[i].p
20c50 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
20c60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20c70 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
20c80 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43  lveLabel(v, endC
20c90 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
20ca0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
20cb0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55  ..      /* The U
20cc0 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69  NLIKELY() functi
20cd0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
20ce0 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  The result is th
20cf0 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
20d00 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72   of the first ar
20d10 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
20d20 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
20d30 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
20d40 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
20d50 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  Y ){.        ass
20d60 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b  ert( nFarg>=1 );
20d70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20d80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
20d90 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 46  arget(pParse, pF
20da0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
20db0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
20dc0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
20dd0 5f 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a 20  _DEBUG.      /* 
20de0 54 68 65 20 41 46 46 49 4e 49 54 59 28 29 20 66  The AFFINITY() f
20df0 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61 74 65  unction evaluate
20e00 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68  s to a string th
20e10 61 74 20 64 65 73 63 72 69 62 65 73 0a 20 20 20  at describes.   
20e20 20 20 20 2a 2a 20 74 68 65 20 74 79 70 65 20 61     ** the type a
20e30 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 61  ffinity of the a
20e40 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 69  rgument.  This i
20e50 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
20e60 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ng of.      ** t
20e70 68 65 20 53 51 4c 69 74 65 20 74 79 70 65 20 6c  he SQLite type l
20e80 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ogic..      */. 
20e90 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
20ea0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
20eb0 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59 20  E_FUNC_AFFINITY 
20ec0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
20ed0 20 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d   char *azAff[] =
20ee0 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65 78 74   { "blob", "text
20ef0 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20 22 69  ", "numeric", "i
20f00 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22 20  nteger", "real" 
20f10 7d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  };.        char 
20f20 61 66 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73  aff;.        ass
20f30 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
20f40 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20 73  .        aff = s
20f50 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
20f60 74 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  ty(pFarg->a[0].p
20f70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
20f80 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
20f90 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20  ring(v, target, 
20fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20fb0 20 28 61 66 66 3c 3d 53 51 4c 49 54 45 5f 41 46   (aff<=SQLITE_AF
20fc0 46 5f 4e 4f 4e 45 29 20 3f 20 22 6e 6f 6e 65 22  F_NONE) ? "none"
20fd0 20 3a 20 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c   : azAff[aff-SQL
20fe0 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 29 3b 0a  ITE_AFF_BLOB]);.
20ff0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
21000 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 23  arget;.      }.#
21010 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 66 6f 72  endif..      for
21020 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=0; i<nFarg; i
21030 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
21040 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33   i<32 && sqlite3
21050 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
21060 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
21070 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
21080 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29  estcase( i==31 )
21090 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
210a0 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54  tMask |= MASKBIT
210b0 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  32(i);.        }
210c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
210d0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
210e0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
210f0 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f  COLL)!=0 && !pCo
21100 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
21110 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
21120 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
21130 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  e, pFarg->a[i].p
21140 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
21150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
21160 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20  f( pFarg ){.    
21170 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73      if( constMas
21180 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  k ){.          r
21190 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  1 = pParse->nMem
211a0 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  +1;.          pP
211b0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46  arse->nMem += nF
211c0 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  arg;.        }el
211d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31  se{.          r1
211e0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
211f0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
21200 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  Farg);.        }
21210 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  ..        /* For
21220 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79   length() and ty
21230 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73  peof() functions
21240 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61   with a column a
21250 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20  rgument,.       
21260 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20 70   ** set the P5 p
21270 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20  arameter to the 
21280 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65  OP_Column opcode
21290 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54   to OPFLAG_LENGT
212a0 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20  HARG.        ** 
212b0 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  or OPFLAG_TYPEOF
212c0 41 52 47 20 72 65 73 70 65 63 74 69 76 65 6c 79  ARG respectively
212d0 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63  , to avoid unnec
212e0 65 73 73 61 72 79 20 64 61 74 61 0a 20 20 20 20  essary data.    
212f0 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a      ** loading..
21300 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21310 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75     if( (pDef->fu
21320 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ncFlags & (SQLIT
21330 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51  E_FUNC_LENGTH|SQ
21340 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46  LITE_FUNC_TYPEOF
21350 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
21360 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20     u8 exprOp;.  
21370 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21380 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20  nFarg==1 );.    
21390 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
213a0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21  arg->a[0].pExpr!
213b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
213c0 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e  exprOp = pFarg->
213d0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a  a[0].pExpr->op;.
213e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78            if( ex
213f0 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  prOp==TK_COLUMN 
21400 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47  || exprOp==TK_AG
21410 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  G_COLUMN ){.    
21420 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21430 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
21440 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  TH==OPFLAG_LENGT
21450 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  HARG );.        
21460 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
21470 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d  TE_FUNC_TYPEOF==
21480 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
21490 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
214a0 74 65 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e  testcase( pDef->
214b0 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c  funcFlags & OPFL
214c0 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a  AG_LENGTHARG );.
214d0 20 20 20 20 20 20 20 20 20 20 20 20 70 46 61 72              pFar
214e0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  g->a[0].pExpr->o
214f0 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  p2 = .          
21500 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75          pDef->fu
21510 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41  ncFlags & (OPFLA
21520 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c  G_LENGTHARG|OPFL
21530 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
21540 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21550 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71     }..        sq
21560 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
21570 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46  rList(pParse, pF
21580 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20  arg, r1, 0,.    
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215a0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
215b0 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49  TE_ECEL_DUP|SQLI
215c0 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b  TE_ECEL_FACTOR);
215d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
215e0 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20        r1 = 0;.  
215f0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
21600 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
21610 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
21620 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61  Possibly overloa
21630 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  d the function i
21640 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
21650 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  ment is.      **
21660 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
21670 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a   column..      *
21680 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69  *.      ** For i
21690 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
216a0 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45  LIKE, GLOB, REGE
216b0 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75  XP, and MATCH) u
216c0 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  se the.      ** 
216d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
216e0 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20   not the first, 
216f0 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
21700 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20  to test to.     
21710 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
21720 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76   a column in a v
21730 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
21740 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61  his is done beca
21750 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  use.      ** the
21760 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66   left operand of
21770 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
21780 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65   (the operand we
21790 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a   want to.      *
217a0 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f  * control overlo
217b0 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61  ading) ends up a
217c0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
217d0 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20  ument to the.   
217e0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
217f0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
21800 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71  "A glob B" is eq
21810 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
21820 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29     ** "glob(B,A)
21830 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73  .  We want to us
21840 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c  e the A in "A gl
21850 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20  ob B" to test.  
21860 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74      ** for funct
21870 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e  ion overloading.
21880 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65    But we use the
21890 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62   B term in "glob
218a0 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f  (B,A)"..      */
218b0 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
218c0 3e 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72  >=2 && ExprHasPr
218d0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
218e0 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
218f0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
21900 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
21910 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
21920 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
21930 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
21940 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
21950 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  Farg>0 ){.      
21960 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
21970 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
21980 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
21990 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30  Farg, pFarg->a[0
219a0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
219b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
219c0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
219d0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
219e0 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
219f0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
21a00 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
21a10 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20  fltColl; .      
21a20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21a30 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
21a40 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
21a50 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
21a60 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
21a70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
21a80 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f  ABLE_OFFSET_SQL_
21a90 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20 70  FUNC.      if( p
21aa0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
21ab0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4f 46 46   SQLITE_FUNC_OFF
21ac0 53 45 54 20 29 7b 0a 20 20 20 20 20 20 20 20 45  SET ){.        E
21ad0 78 70 72 20 2a 70 41 72 67 20 3d 20 70 46 61 72  xpr *pArg = pFar
21ae0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  g->a[0].pExpr;. 
21af0 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d         if( pArg-
21b00 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
21b10 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
21b20 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
21b30 20 4f 50 5f 4f 66 66 73 65 74 2c 20 70 41 72 67   OP_Offset, pArg
21b40 2d 3e 69 54 61 62 6c 65 2c 20 70 41 72 67 2d 3e  ->iTable, pArg->
21b50 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29  iColumn, target)
21b60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21b70 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21b80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21b90 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
21ba0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
21bb0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
21bc0 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
21bd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21be0 4f 70 34 28 76 2c 20 70 50 61 72 73 65 2d 3e 69  Op4(v, pParse->i
21bf0 53 65 6c 66 54 61 62 20 3f 20 4f 50 5f 50 75 72  SelfTab ? OP_Pur
21c00 65 46 75 6e 63 30 20 3a 20 4f 50 5f 46 75 6e 63  eFunc0 : OP_Func
21c10 74 69 6f 6e 30 2c 0a 20 20 20 20 20 20 20 20 20  tion0,.         
21c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c30 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20   constMask, r1, 
21c40 74 61 72 67 65 74 2c 20 28 63 68 61 72 2a 29 70  target, (char*)p
21c50 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  Def, P4_FUNCDEF)
21c60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21c70 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
21c80 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20   (u8)nFarg);.   
21c90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
21ca0 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73  Farg && constMas
21cb0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
21cc0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
21cd0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
21ce0 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  r1, nFarg);.    
21cf0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
21d00 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
21d10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21d20 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
21d30 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
21d40 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
21d50 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  CT: {.      int 
21d60 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74  nCol;.      test
21d70 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49  case( op==TK_EXI
21d80 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  STS );.      tes
21d90 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45  tcase( op==TK_SE
21da0 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66  LECT );.      if
21db0 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
21dc0 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72  && (nCol = pExpr
21dd0 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
21de0 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29  ist->nExpr)!=1 )
21df0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21e00 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
21e10 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29  pParse, nCol, 1)
21e20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21e30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
21e40 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
21e50 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
21e60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21e70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
21e80 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
21e90 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
21ea0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69 66   int n;.      if
21eb0 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  ( pExpr->pLeft->
21ec0 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  iTable==0 ){.   
21ed0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
21ee0 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  t->iTable = sqli
21ef0 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
21f00 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
21f10 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pLeft);.      }.
21f20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
21f30 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
21f40 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  | pExpr->pLeft->
21f50 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
21f60 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
21f70 2d 3e 69 54 61 62 6c 65 21 3d 30 0a 20 20 20 20  ->iTable!=0.    
21f80 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61     && pExpr->iTa
21f90 62 6c 65 21 3d 28 6e 20 3d 20 73 71 6c 69 74 65  ble!=(n = sqlite
21fa0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
21fb0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 29 0a 20  pExpr->pLeft)). 
21fc0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
21fd0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
21fe0 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75  pParse, "%d colu
21ff0 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20  mns assigned %d 
22000 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20  values",.       
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22020 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
22030 69 54 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20  iTable, n);.    
22040 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
22050 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
22060 54 61 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69  Table + pExpr->i
22070 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20  Column;.    }.  
22080 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
22090 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
220a0 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
220b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
220c0 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
220d0 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
220e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
220f0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
22100 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22110 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
22120 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
22130 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22140 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
22150 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
22160 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
22170 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22180 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
22190 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
221a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
221b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
221c0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
221d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
221e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
221f0 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a  mm, target, 0);.
22200 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22210 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
22220 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
22230 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
22240 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  t;.    }.#endif 
22250 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
22260 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20  UBQUERY */...   
22270 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20   /*.    **    x 
22280 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
22290 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
222a0 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
222b0 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   to.    **.    *
222c0 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
222d0 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  =z.    **.    **
222e0 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   X is stored in 
222f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
22300 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64    ** Y is stored
22310 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
22320 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[0].pExpr..  
22330 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64    ** Z is stored
22340 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
22350 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[1].pExpr..  
22360 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
22370 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
22380 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
22390 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
223a0 20 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a   target, 0, 0);.
223b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
223c0 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
223d0 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20  ase TK_SPAN:.   
223e0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45   case TK_COLLATE
223f0 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  : .    case TK_U
22400 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 70 45  PLUS: {.      pE
22410 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  xpr = pExpr->pLe
22420 66 74 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  ft;.      goto e
22430 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3b  xpr_code_doover;
22440 20 2f 2a 20 32 30 31 38 2d 30 34 2d 32 38 3a 20   /* 2018-04-28: 
22450 50 72 65 76 65 6e 74 20 64 65 65 70 20 72 65 63  Prevent deep rec
22460 75 72 73 69 6f 6e 2e 20 4f 53 53 46 75 7a 7a 2e  ursion. OSSFuzz.
22470 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63   */.    }..    c
22480 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20  ase TK_TRIGGER: 
22490 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
224a0 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54  e opcode is TK_T
224b0 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65  RIGGER, then the
224c0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
224d0 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20   reference.     
224e0 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20   ** to a column 
224f0 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20  in the new.* or 
22500 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
22510 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  les available to
22520 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65  .      ** trigge
22530 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74  r programs. In t
22540 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54  his case Expr.iT
22550 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31  able is set to 1
22560 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a   for the.      *
22570 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  * new.* pseudo-t
22580 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74  able, or 0 for t
22590 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
225a0 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c  table. Expr.iCol
225b0 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  umn.      ** is 
225c0 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  set to the colum
225d0 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d  n of the pseudo-
225e0 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f  table to read, o
225f0 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20  r to -1 to.     
22600 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77   ** read the row
22610 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20  id field..      
22620 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
22630 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d  expression is im
22640 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
22650 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f  an OP_Param opco
22660 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20  de. The p1.     
22670 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73   ** parameter is
22680 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e   set to 0 for an
22690 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72   old.rowid refer
226a0 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31  ence, or to (i+1
226b0 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  ).      ** to re
226c0 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20  ference another 
226d0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c  column of the ol
226e0 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
226f0 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a  , where .      *
22700 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78  * i is the index
22710 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
22720 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20  For a new.rowid 
22730 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73  reference, p1 is
22740 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f  .      ** set to
22750 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20   (n+1), where n 
22760 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
22770 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68   columns in each
22780 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20   pseudo-table.. 
22790 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65       ** For a re
227a0 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f  ference to any o
227b0 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ther column in t
227c0 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  he new.* pseudo-
227d0 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20  table, p1.      
227e0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b  ** is set to (n+
227f0 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e  2+i), where n an
22800 64 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e  d i are as defin
22810 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46  ed previously. F
22820 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d  or.      ** exam
22830 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c  ple, if the tabl
22840 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67  e on which trigg
22850 65 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69  ers are being fi
22860 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  red is.      ** 
22870 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20  declared as:.   
22880 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
22890 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
228a0 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a  (a, b);.      **
228b0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70  .      ** Then p
228c0 31 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  1 is interpreted
228d0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
228e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
228f0 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f   p1==0   ->    o
22900 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d  ld.rowid     p1=
22910 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72  =3   ->    new.r
22920 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20  owid.      **   
22930 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==1   ->    ol
22940 64 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.a         p1==
22950 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a  4   ->    new.a.
22960 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32        **   p1==2
22970 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20     ->    old.b  
22980 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d         p1==5   -
22990 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20  >    new.b      
229a0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
229b0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
229c0 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20  Expr->y.pTab;.  
229d0 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
229e0 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
229f0 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
22a00 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
22a10 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
22a20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
22a30 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
22a40 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
22a50 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
22a60 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
22a70 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
22a80 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
22a90 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
22aa0 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
22ab0 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
22ac0 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
22ad0 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
22ae0 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
22af0 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
22b00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22b10 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
22b20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
22b30 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
22b40 72 5b 25 64 5d 3d 25 73 2e 25 73 22 2c 20 74 61  r[%d]=%s.%s", ta
22b50 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 28 70  rget,.        (p
22b60 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
22b70 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20  new" : "old"),. 
22b80 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
22b90 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69  Column<0 ? "rowi
22ba0 64 22 20 3a 20 70 45 78 70 72 2d 3e 79 2e 70 54  d" : pExpr->y.pT
22bb0 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
22bc0 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 0a  iColumn].zName).
22bd0 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64        ));..#ifnd
22be0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
22bf0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
22c00 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
22c10 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66  lumn has REAL af
22c20 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63  finity, it may c
22c30 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
22c40 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a  ed as an.      *
22c50 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f  * integer. Use O
22c60 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74  P_RealAffinity t
22c70 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  o make sure it i
22c80 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20  s really real.. 
22c90 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
22ca0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
22cb0 36 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69  60985-57662 SQLi
22cc0 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20  te will convert 
22cd0 74 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74  the value back t
22ce0 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74  o.      ** float
22cf0 69 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65  ing point when e
22d00 78 74 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f  xtracting it fro
22d10 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a  m the record.  *
22d20 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  /.      if( pExp
22d30 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20  r->iColumn>=0 . 
22d40 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61        && pTab->a
22d50 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
22d60 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51  mn].affinity==SQ
22d70 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
22d80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
22d90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
22da0 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  (v, OP_RealAffin
22db0 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ity, target);.  
22dc0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22dd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22de0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43  .    case TK_VEC
22df0 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TOR: {.      sql
22e00 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
22e10 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
22e20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20  misused");.     
22e30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
22e40 20 20 20 2f 2a 20 54 4b 5f 49 46 5f 4e 55 4c 4c     /* TK_IF_NULL
22e50 5f 52 4f 57 20 45 78 70 72 20 6e 6f 64 65 73 20  _ROW Expr nodes 
22e60 61 72 65 20 69 6e 73 65 72 74 65 64 20 61 68 65  are inserted ahe
22e70 61 64 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  ad of expression
22e80 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 65  s.    ** that de
22e90 72 69 76 65 20 66 72 6f 6d 20 74 68 65 20 72 69  rive from the ri
22ea0 67 68 74 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f  ght-hand table o
22eb0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20  f a LEFT JOIN.  
22ec0 54 68 65 0a 20 20 20 20 2a 2a 20 45 78 70 72 2e  The.    ** Expr.
22ed0 69 54 61 62 6c 65 20 76 61 6c 75 65 20 69 73 20  iTable value is 
22ee0 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65 72  the table number
22ef0 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68   for the right-h
22f00 61 6e 64 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  and table..    *
22f10 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
22f20 20 69 73 20 6f 6e 6c 79 20 65 76 61 6c 75 61 74   is only evaluat
22f30 65 64 20 69 66 20 74 68 61 74 20 74 61 62 6c 65  ed if that table
22f40 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
22f50 79 0a 20 20 20 20 2a 2a 20 6f 6e 20 61 20 4c 45  y.    ** on a LE
22f60 46 54 20 4a 4f 49 4e 20 4e 55 4c 4c 20 72 6f 77  FT JOIN NULL row
22f70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
22f80 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  e TK_IF_NULL_ROW
22f90 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
22fa0 64 72 49 4e 52 3b 0a 20 20 20 20 20 20 75 38 20  drINR;.      u8 
22fb0 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20  okConstFactor = 
22fc0 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
22fd0 61 63 74 6f 72 3b 0a 20 20 20 20 20 20 61 64 64  actor;.      add
22fe0 72 49 4e 52 20 3d 20 73 71 6c 69 74 65 33 56 64  rINR = sqlite3Vd
22ff0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
23000 66 4e 75 6c 6c 52 6f 77 2c 20 70 45 78 70 72 2d  fNullRow, pExpr-
23010 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >iTable);.      
23020 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 64  /* Temporarily d
23030 69 73 61 62 6c 65 20 66 61 63 74 6f 72 69 6e 67  isable factoring
23040 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20 65 78 70   of constant exp
23050 72 65 73 73 69 6f 6e 73 2c 20 73 69 6e 63 65 0a  ressions, since.
23060 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 74 68        ** even th
23070 6f 75 67 68 20 65 78 70 72 65 73 73 69 6f 6e 73  ough expressions
23080 20 6d 61 79 20 61 70 70 65 61 72 20 74 6f 20 62   may appear to b
23090 65 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 79  e constant, they
230a0 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 2a   are not.      *
230b0 2a 20 72 65 61 6c 6c 79 20 63 6f 6e 73 74 61 6e  * really constan
230c0 74 20 62 65 63 61 75 73 65 20 74 68 65 79 20 6f  t because they o
230d0 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68  riginate from th
230e0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
230f0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20  e.      ** of a 
23100 4c 45 46 54 20 4a 4f 49 4e 2e 20 2a 2f 0a 20 20  LEFT JOIN. */.  
23110 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f      pParse->okCo
23120 6e 73 74 46 61 63 74 6f 72 20 3d 20 30 3b 0a 20  nstFactor = 0;. 
23130 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
23140 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
23150 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
23160 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
23170 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
23180 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20  okConstFactor = 
23190 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 3b 0a 20  okConstFactor;. 
231a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
231b0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
231c0 49 4e 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  INR);.      sqli
231d0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
231e0 76 2c 20 61 64 64 72 49 4e 52 2c 20 69 6e 52 65  v, addrINR, inRe
231f0 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
23200 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
23210 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20     ** Form A:.  
23220 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48    **   CASE x WH
23230 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48  EN e1 THEN r1 WH
23240 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e  EN e2 THEN r2 ..
23250 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72  . WHEN eN THEN r
23260 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
23270 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   **.    ** Form 
23280 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  B:.    **   CASE
23290 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
232a0 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
232b0 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
232c0 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
232d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
232e0 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20 74  rm A is can be t
232f0 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20  ransformed into 
23300 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  the equivalent f
23310 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73  orm B as follows
23320 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
23330 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72  WHEN x=e1 THEN r
23340 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e  1 WHEN x=e2 THEN
23350 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20   r2 ....    **  
23360 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20        WHEN x=eN 
23370 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
23380 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
23390 20 58 20 28 69 66 20 69 74 20 65 78 69 73 74 73   X (if it exists
233a0 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  ) is in pExpr->p
233b0 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69  Left..    ** Y i
233c0 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65 6c  s in the last el
233d0 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e  ement of pExpr->
233e0 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70 72  x.pList if pExpr
233f0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
23400 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20   is.    ** odd. 
23410 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f   The Y is also o
23420 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65  ptional.  If the
23430 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
23440 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20  nts in x.pList. 
23450 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74     ** is even, t
23460 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65 64  hen Y is omitted
23470 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72 77   and the "otherw
23480 69 73 65 22 20 72 65 73 75 6c 74 20 69 73 20 4e  ise" result is N
23490 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69  ULL..    ** Ei i
234a0 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  s in pExpr->pLis
234b0 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69  t->a[i*2] and Ri
234c0 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   is pExpr->pList
234d0 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20  ->a[i*2+1]..    
234e0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
234f0 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72  sult of the expr
23500 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69  ession is the Ri
23510 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d   for the first m
23520 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20  atching Ei,.    
23530 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  ** or if there i
23540 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69  s no matching Ei
23550 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20  , the ELSE term 
23560 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  Y, or if there i
23570 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45  s.    ** no ELSE
23580 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20   term, NULL..   
23590 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
235a0 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
235b0 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20  CASE ); {.      
235c0 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20  int endLabel;   
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235e0 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
235f0 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20  for end of CASE 
23600 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  stmt */.      in
23610 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20  t nextCase;     
23620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23630 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
23640 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75  r next WHEN clau
23650 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
23660 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  nExpr;          
23670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23680 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48   2x number of WH
23690 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
236a0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236c0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
236d0 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ter */.      Exp
236e0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23700 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74  * List of WHEN t
23710 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74  erms */.      st
23720 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
23730 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20  em *aListelem;  
23740 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e  /* Array of WHEN
23750 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
23760 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20  Expr opCompare; 
23770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23780 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65    /* The X==Ei e
23790 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
237a0 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20     Expr *pX;    
237b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237c0 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78       /* The X ex
237d0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
237e0 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20    Expr *pTest = 
237f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
23800 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f      /* X==Ei (fo
23810 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69  rm A) or just Ei
23820 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20   (form B) */.   
23830 20 20 20 45 78 70 72 20 2a 70 44 65 6c 20 3d 20     Expr *pDel = 
23840 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
23850 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
23860 62 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  b;..      assert
23870 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
23880 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
23890 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72  Select) && pExpr
238a0 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20  ->x.pList );.   
238b0 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d     assert(pExpr-
238c0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
238d0 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69  > 0);.      pELi
238e0 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
238f0 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74  ist;.      aList
23900 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61  elem = pEList->a
23910 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
23920 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
23930 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20       endLabel = 
23940 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
23950 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
23960 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45      if( (pX = pE
23970 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
23980 7b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d  {.        pDel =
23990 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
239a0 64 62 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20  db, pX, 0);.    
239b0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
239c0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
239d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
239e0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  rDelete(db, pDel
239f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
23a00 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
23a10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23a20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pX->op==TK_COLUM
23a30 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  N );.        exp
23a40 72 54 6f 52 65 67 69 73 74 65 72 28 70 44 65 6c  rToRegister(pDel
23a50 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  , exprCodeVector
23a60 28 70 50 61 72 73 65 2c 20 70 44 65 6c 2c 20 26  (pParse, pDel, &
23a70 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20  regFree1));.    
23a80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
23a90 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
23aa0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43       memset(&opC
23ab0 6f 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f  ompare, 0, sizeo
23ac0 66 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20  f(opCompare));. 
23ad0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
23ae0 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20  .op = TK_EQ;.   
23af0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
23b00 4c 65 66 74 20 3d 20 70 44 65 6c 3b 0a 20 20 20  Left = pDel;.   
23b10 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
23b20 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20  Compare;.       
23b30 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64   /* Ticket b351d
23b40 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64  95f9cd5ef17e9d9d
23b50 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30  bae18f5ca8611190
23b60 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  001:.        ** 
23b70 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
23b80 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20  Free1 might get 
23b90 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68  SCopy-ed into th
23ba0 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20  e file result.. 
23bb0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b         ** So mak
23bc0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
23bd0 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65  regFree1 registe
23be0 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20  r is not reused 
23bf0 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20  for other.      
23c00 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e    ** purposes an
23c10 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77  d possibly overw
23c20 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
23c30 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30      regFree1 = 0
23c40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23c50 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
23c60 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  -1; i=i+2){.    
23c70 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20      if( pX ){.  
23c80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23c90 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pTest!=0 );.    
23ca0 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
23cb0 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c  pRight = aListel
23cc0 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
23cd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23ce0 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c        pTest = aL
23cf0 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
23d00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23d10 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73      nextCase = s
23d20 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
23d30 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
23d40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
23d50 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Test->op==TK_COL
23d60 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
23d70 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
23d80 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c  e(pParse, pTest,
23d90 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54   nextCase, SQLIT
23da0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
23db0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
23dc0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
23dd0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
23de0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
23df0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
23e00 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
23e10 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61  m[i+1].pExpr, ta
23e20 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
23e30 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
23e40 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
23e50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23e60 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
23e70 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20  nextCase);.     
23e80 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45   }.      if( (nE
23e90 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20  xpr&1)!=0 ){.   
23ea0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23eb0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
23ec0 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e  ist->a[nExpr-1].
23ed0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
23ee0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23ef0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23f00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
23f10 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
23f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
23f30 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
23f40 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20  b, pDel);.      
23f50 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
23f60 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61  veLabel(v, endLa
23f70 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  bel);.      brea
23f80 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
23f90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
23fa0 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
23fb0 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
23fc0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61  assert( pExpr->a
23fd0 66 66 45 78 70 72 3d 3d 4f 45 5f 52 6f 6c 6c 62  ffExpr==OE_Rollb
23fe0 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20  ack .           
23ff0 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 45 78 70  || pExpr->affExp
24000 72 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20  r==OE_Abort.    
24010 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
24020 3e 61 66 66 45 78 70 72 3d 3d 4f 45 5f 46 61 69  >affExpr==OE_Fai
24030 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  l.           || 
24040 70 45 78 70 72 2d 3e 61 66 66 45 78 70 72 3d 3d  pExpr->affExpr==
24050 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20  OE_Ignore.      
24060 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
24070 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
24080 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
24090 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
240a0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
240b0 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49              "RAI
240c0 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65  SE() may only be
240d0 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74   used within a t
240e0 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29  rigger-program")
240f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
24100 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
24110 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
24120 45 78 70 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  Expr==OE_Abort )
24130 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24140 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
24150 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
24160 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
24170 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
24180 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
24190 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
241a0 2d 3e 61 66 66 45 78 70 72 3d 3d 4f 45 5f 49 67  ->affExpr==OE_Ig
241b0 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
241c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
241d0 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  4(.            v
241e0 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
241f0 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  E_OK, OE_Ignore,
24200 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
24210 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ken,0);.        
24220 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
24230 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24240 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c        sqlite3Hal
24250 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
24260 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  se, SQLITE_CONST
24270 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20  RAINT_TRIGGER,. 
24280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24290 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
242a0 70 72 2d 3e 61 66 66 45 78 70 72 2c 20 70 45 78  pr->affExpr, pEx
242b0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
242c0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
242d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
242e0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
242f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
24300 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
24310 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
24320 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
24330 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
24340 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  ;.  return inReg
24350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f  ;.}../*.** Facto
24360 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f  r out the code o
24370 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
24380 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61  ession to initia
24390 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
243a0 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65 73 74 3e  *.** If regDest>
243b0 3d 30 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  =0 then the resu
243c0 6c 74 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f  lt is always sto
243d0 72 65 64 20 69 6e 20 74 68 61 74 20 72 65 67 69  red in that regi
243e0 73 74 65 72 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ster and the.** 
243f0 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 72 65  result is not re
24400 75 73 61 62 6c 65 2e 20 20 49 66 20 72 65 67 44  usable.  If regD
24410 65 73 74 3c 30 20 74 68 65 6e 20 74 68 69 73 20  est<0 then this 
24420 72 6f 75 74 69 6e 65 20 69 73 20 66 72 65 65 20  routine is free 
24430 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65  to .** store the
24440 20 76 61 6c 75 65 20 77 68 65 72 65 65 76 65 72   value whereever
24450 20 69 74 20 77 61 6e 74 73 2e 20 20 54 68 65 20   it wants.  The 
24460 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20 74  register where t
24470 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a  he expression .*
24480 2a 20 69 73 20 73 74 6f 72 65 64 20 69 73 20 72  * is stored is r
24490 65 74 75 72 6e 65 64 2e 20 20 57 68 65 6e 20 72  eturned.  When r
244a0 65 67 44 65 73 74 3c 30 2c 20 74 77 6f 20 69 64  egDest<0, two id
244b0 65 6e 74 69 63 61 6c 20 65 78 70 72 65 73 73 69  entical expressi
244c0 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65  ons will.** code
244d0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65 67   to the same reg
244e0 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
244f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
24500 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nit(.  Parse *pP
24510 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
24520 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
24530 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
24540 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
24550 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65  sion to code whe
24560 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69 74 69  n the VDBE initi
24570 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20  alizes */.  int 
24580 72 65 67 44 65 73 74 20 20 20 20 20 20 20 2f 2a  regDest       /*
24590 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   Store the value
245a0 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
245b0 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  r */.){.  ExprLi
245c0 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  st *p;.  assert(
245d0 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
245e0 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20  Parse) );.  p = 
245f0 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
24600 70 72 3b 0a 20 20 69 66 28 20 72 65 67 44 65 73  pr;.  if( regDes
24610 74 3c 30 20 26 26 20 70 20 29 7b 0a 20 20 20 20  t<0 && p ){.    
24620 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
24630 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
24640 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
24650 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d  pItem=p->a, i=p-
24660 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74  >nExpr; i>0; pIt
24670 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20  em++, i--){.    
24680 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75    if( pItem->reu
24690 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33  sable && sqlite3
246a0 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 70 49  ExprCompare(0,pI
246b0 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72  tem->pExpr,pExpr
246c0 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,-1)==0 ){.     
246d0 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d     return pItem-
246e0 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
246f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24700 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 73 71    }.  pExpr = sq
24710 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
24720 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
24730 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  0);.  p = sqlite
24740 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
24750 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72  pParse, p, pExpr
24760 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
24770 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
24780 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
24790 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d   &p->a[p->nExpr-
247a0 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e  1];.     pItem->
247b0 72 65 75 73 61 62 6c 65 20 3d 20 72 65 67 44 65  reusable = regDe
247c0 73 74 3c 30 3b 0a 20 20 20 20 20 69 66 28 20 72  st<0;.     if( r
247d0 65 67 44 65 73 74 3c 30 20 29 20 72 65 67 44 65  egDest<0 ) regDe
247e0 73 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  st = ++pParse->n
247f0 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  Mem;.     pItem-
24800 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
24810 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a   = regDest;.  }.
24820 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74    pParse->pConst
24830 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65 74 75  Expr = p;.  retu
24840 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f  rn regDest;.}../
24850 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
24860 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
24870 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
24880 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
24890 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  ts.** into a reg
248a0 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ister.  Return t
248b0 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
248c0 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73  er where the res
248d0 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ults.** are stor
248e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
248f0 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
24900 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
24910 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  r that can be de
24920 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68  allocated,.** th
24930 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d  en write its num
24940 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20  ber into *pReg. 
24950 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
24960 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a  egister is not.*
24970 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
24980 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
24990 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   zero..**.** If 
249a0 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
249b0 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
249c0 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e  outine might gen
249d0 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f  erate this.** co
249e0 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72  de to fill the r
249f0 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69  egister in the i
24a00 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65  nitialization se
24a10 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ction of the.** 
24a20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e  VDBE program, in
24a30 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72   order to factor
24a40 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65   it out of the e
24a50 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a  valuation loop..
24a60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
24a70 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
24a80 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
24a90 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
24aa0 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70  ){.  int r2;.  p
24ab0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
24ac0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64  prSkipCollateAnd
24ad0 4c 69 6b 65 6c 79 28 70 45 78 70 72 29 3b 0a 20  Likely(pExpr);. 
24ae0 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72   if( ConstFactor
24af0 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26 26  Ok(pParse).   &&
24b00 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
24b10 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73 71  EGISTER.   && sq
24b20 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
24b30 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
24b40 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 52 65 67  ).  ){.    *pReg
24b50 20 20 3d 20 30 3b 0a 20 20 20 20 72 32 20 3d 20    = 0;.    r2 = 
24b60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
24b70 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
24b80 78 70 72 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73  xpr, -1);.  }els
24b90 65 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20  e{.    int r1 = 
24ba0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
24bb0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  g(pParse);.    r
24bc0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
24bd0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
24be0 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20  , pExpr, r1);.  
24bf0 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a    if( r2==r1 ){.
24c00 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31        *pReg = r1
24c10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24c20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
24c30 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
24c40 20 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65   r1);.      *pRe
24c50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
24c60 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a  .  return r2;.}.
24c70 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
24c80 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
24c90 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
24ca0 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
24cb0 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
24cc0 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
24cd0 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
24ce0 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
24cf0 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
24d00 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
24d10 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
24d20 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
24d30 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
24d40 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
24d50 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b  t){.  int inReg;
24d60 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
24d70 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
24d80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
24d90 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70    if( pExpr && p
24da0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Expr->op==TK_REG
24db0 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c  ISTER ){.    sql
24dc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
24dd0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
24de0 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54  _Copy, pExpr->iT
24df0 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20  able, target);. 
24e00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65   }else{.    inRe
24e10 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
24e20 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
24e30 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
24e40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
24e50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c  arse->pVdbe!=0 |
24e60 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
24e70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
24e80 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
24e90 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70  get && pParse->p
24ea0 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Vdbe ){.      sq
24eb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24ec0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
24ed0 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
24ee0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20  target);.    }. 
24ef0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
24f00 20 61 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70   a transient cop
24f10 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
24f20 70 45 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63  pExpr and then c
24f30 6f 64 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20  ode it using.** 
24f40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
24f50 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
24f60 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
24f70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24f80 28 29 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61  ().** except tha
24f90 74 20 74 68 65 20 69 6e 70 75 74 20 65 78 70 72  t the input expr
24fa0 65 73 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e  ession is guaran
24fb0 74 65 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61  teed to be uncha
24fc0 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
24fd0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
24fe0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
24ff0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
25000 74 20 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c  t target){.  sql
25010 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
25020 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d  e->db;.  pExpr =
25030 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
25040 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
25050 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
25060 46 61 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33  Failed ) sqlite3
25070 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
25080 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
25090 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
250a0 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
250b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
250c0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
250d0 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
250e0 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
250f0 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
25100 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
25110 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
25120 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
25130 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
25140 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
25150 72 67 65 74 2e 20 20 49 66 20 74 68 65 20 65 78  rget.  If the ex
25160 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
25170 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  tant, then this 
25180 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74  routine.** might
25190 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20   choose to code 
251a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
251b0 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  t initialization
251c0 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   time..*/.void s
251d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61  qlite3ExprCodeFa
251e0 63 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a  ctorable(Parse *
251f0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
25200 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
25210 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
25220 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26  okConstFactor &&
25230 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
25240 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45  nstantNotJoin(pE
25250 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  xpr) ){.    sqli
25260 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
25270 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
25280 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73   target);.  }els
25290 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
252a0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
252b0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
252c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
252d0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65  rate code that e
252e0 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69 76  valuates the giv
252f0 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
25300 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c  d puts the resul
25310 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  t.** in register
25320 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41   target..**.** A
25330 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  lso make a copy 
25340 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
25350 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  n results into a
25360 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72  nother "cache" r
25370 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d  egister.** and m
25380 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73  odify the expres
25390 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65  sion so that the
253a0 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
253b0 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74   evaluated,.** t
253c0 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63  he result is a c
253d0 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65  opy of the cache
253e0 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
253f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
25400 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73   used for expres
25410 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75  sions that are u
25420 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  sed multiple .**
25430 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72   times.  They ar
25440 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65  e evaluated once
25450 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73   and the results
25460 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
25470 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64  on.** are reused
25480 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
25490 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68  3ExprCodeAndCach
254a0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
254b0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
254c0 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
254d0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
254e0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d  Vdbe;.  int iMem
254f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
25500 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  get>0 );.  asser
25510 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
25520 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73  _REGISTER );.  s
25530 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
25540 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
25550 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20  rget);.  iMem = 
25560 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
25570 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25580 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
25590 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20  target, iMem);. 
255a0 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
255b0 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a  pExpr, iMem);.}.
255c0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
255d0 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
255e0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
255f0 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
25600 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
25610 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f  ession list into
25620 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
25630 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
25640 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a  ng at target..**
25650 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
25660 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
25670 73 20 65 76 61 6c 75 61 74 65 64 2e 20 20 54 68  s evaluated.  Th
25680 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
25690 64 20 77 69 6c 6c 0a 2a 2a 20 75 73 75 61 6c 6c  d will.** usuall
256a0 79 20 62 65 20 70 4c 69 73 74 2d 3e 6e 45 78 70  y be pList->nExp
256b0 72 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 72  r but might be r
256c0 65 64 75 63 65 64 20 69 66 20 53 51 4c 49 54 45  educed if SQLITE
256d0 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 0a 2a 2a  _ECEL_OMITREF.**
256e0 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a   is defined..**.
256f0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
25700 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76  EL_DUP flag prev
25710 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e  ents the argumen
25720 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ts from being.**
25730 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50   filled using OP
25740 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79  _SCopy.  OP_Copy
25750 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e   must be used in
25760 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stead..**.** The
25770 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
25780 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c  TOR argument all
25790 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ows constant arg
257a0 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20  uments to be.** 
257b0 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74  factored out int
257c0 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  o initialization
257d0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
257e0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46   SQLITE_ECEL_REF
257f0 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74   flag means that
25800 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
25810 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a  the list with.**
25820 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e   ExprList.a[].u.
25830 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
25840 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
25850 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  n evaluated and 
25860 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67  stored.** in reg
25870 69 73 74 65 72 73 20 61 74 20 73 72 63 52 65 67  isters at srcReg
25880 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61 6c  , and so the val
25890 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65 64  ue can be copied
258a0 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2a 20   from there..** 
258b0 49 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f  If SQLITE_ECEL_O
258c0 4d 49 54 52 45 46 20 69 73 20 61 6c 73 6f 20 73  MITREF is also s
258d0 65 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  et, then the val
258e0 75 65 73 20 77 69 74 68 20 75 2e 78 2e 69 4f 72  ues with u.x.iOr
258f0 64 65 72 42 79 43 6f 6c 3e 30 0a 2a 2a 20 61 72  derByCol>0.** ar
25900 65 20 73 69 6d 70 6c 79 20 6f 6d 69 74 74 65 64  e simply omitted
25910 20 72 61 74 68 65 72 20 74 68 61 6e 20 62 65 69   rather than bei
25920 6e 67 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73  ng copied from s
25930 72 63 52 65 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rcReg..*/.int sq
25940 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
25950 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
25960 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
25970 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
25980 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
25990 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78  ist,   /* The ex
259a0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
259b0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
259c0 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20  nt target,      
259d0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
259e0 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ite results */. 
259f0 20 69 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20   int srcReg,    
25a00 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65      /* Source re
25a10 67 69 73 74 65 72 73 20 69 66 20 53 51 4c 49 54  gisters if SQLIT
25a20 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20  E_ECEL_REF */.  
25a30 75 38 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  u8 flags        
25a40 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45     /* SQLITE_ECE
25a50 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  L_* flags */.){.
25a60 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
25a70 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
25a80 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20   int i, j, n;.  
25a90 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61  u8 copyOp = (fla
25aa0 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
25ab0 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20  _DUP) ? OP_Copy 
25ac0 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64  : OP_SCopy;.  Vd
25ad0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
25ae0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
25af0 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61   pList!=0 );.  a
25b00 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
25b10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
25b20 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b  rse->pVdbe!=0 );
25b30 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20    /* Never gets 
25b40 74 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69  this far otherwi
25b50 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73  se */.  n = pLis
25b60 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
25b70 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70  !ConstFactorOk(p
25b80 50 61 72 73 65 29 20 29 20 66 6c 61 67 73 20 26  Parse) ) flags &
25b90 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  = ~SQLITE_ECEL_F
25ba0 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74  ACTOR;.  for(pIt
25bb0 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
25bc0 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
25bd0 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
25be0 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70  pExpr = pItem->p
25bf0 45 78 70 72 3b 0a 23 69 66 64 65 66 20 53 51 4c  Expr;.#ifdef SQL
25c00 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
25c10 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20  R_REFERENCES.   
25c20 20 69 66 28 20 70 49 74 65 6d 2d 3e 62 53 6f 72   if( pItem->bSor
25c30 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20  terRef ){.      
25c40 69 2d 2d 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  i--;.      n--;.
25c50 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
25c60 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
25c70 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  & SQLITE_ECEL_RE
25c80 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20 70 49  F)!=0 && (j = pI
25c90 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
25ca0 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20  yCol)>0 ){.     
25cb0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
25cc0 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
25cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2d 2d 3b   ){.        i--;
25ce0 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  .        n--;.  
25cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25d00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25d10 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20  dOp2(v, copyOp, 
25d20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74 61 72 67  j+srcReg-1, targ
25d30 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  et+i);.      }. 
25d40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
25d50 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
25d60 4c 5f 46 41 43 54 4f 52 29 21 3d 30 0a 20 20 20  L_FACTOR)!=0.   
25d70 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
25d80 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
25d90 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20  NotJoin(pExpr). 
25da0 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
25db0 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
25dc0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
25dd0 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
25de0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
25df0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
25e00 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
25e10 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
25e20 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69  rget+i);.      i
25e30 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
25e40 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64  +i ){.        Vd
25e50 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20  beOp *pOp;.     
25e60 20 20 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f     if( copyOp==O
25e70 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20  P_Copy.         
25e80 26 26 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56  && (pOp=sqlite3V
25e90 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29  dbeGetOp(v, -1))
25ea0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70  ->opcode==OP_Cop
25eb0 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  y.         && pO
25ec0 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p1+pOp->p3+1=
25ed0 3d 69 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  =inReg.         
25ee0 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e  && pOp->p2+pOp->
25ef0 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20  p3+1==target+i. 
25f00 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
25f10 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20      pOp->p3++;. 
25f20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25f30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
25f40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70  dbeAddOp2(v, cop
25f50 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  yOp, inReg, targ
25f60 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  et+i);.        }
25f70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25f80 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
25f90 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
25fa0 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57   code for a BETW
25fb0 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  EEN operator..**
25fc0 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e  .**    x BETWEEN
25fd0 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54   y AND z.**.** T
25fe0 68 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69  he above is equi
25ff0 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a  valent to .**.**
26000 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
26010 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20  z.**.** Code it 
26020 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20  as such, taking 
26030 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63  care to do the c
26040 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73  ommon subexpress
26050 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69  ion.** eliminati
26060 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54  on of x..**.** T
26070 68 65 20 78 4a 75 6d 70 49 66 20 70 61 72 61 6d  he xJumpIf param
26080 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20  eter determines 
26090 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20  details:.**.**  
260a0 20 20 4e 55 4c 4c 3a 20 20 20 20 20 20 20 20 20    NULL:         
260b0 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20            Store 
260c0 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
260d0 6c 74 20 69 6e 20 72 65 67 5b 64 65 73 74 5d 0a  lt in reg[dest].
260e0 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  **    sqlite3Exp
260f0 72 49 66 54 72 75 65 3a 20 20 20 20 20 20 4a 75  rIfTrue:      Ju
26100 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20 74 72  mp to dest if tr
26110 75 65 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  ue.**    sqlite3
26120 45 78 70 72 49 66 46 61 6c 73 65 3a 20 20 20 20  ExprIfFalse:    
26130 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66   Jump to dest if
26140 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65   false.**.** The
26150 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 70 61 72 61   jumpIfNull para
26160 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64  meter is ignored
26170 20 69 66 20 78 4a 75 6d 70 49 66 20 69 73 20 4e   if xJumpIf is N
26180 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ULL..*/.static v
26190 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74 77  oid exprCodeBetw
261a0 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  een(.  Parse *pP
261b0 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
261c0 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
261d0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
261e0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
261f0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45  ,      /* The BE
26200 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e  TWEEN expression
26210 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
26220 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
26230 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 72 20 73  destination or s
26240 74 6f 72 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20  torage location 
26250 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d  */.  void (*xJum
26260 70 29 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c  p)(Parse*,Expr*,
26270 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20 41 63 74  int,int), /* Act
26280 69 6f 6e 20 74 6f 20 74 61 6b 65 20 2a 2f 0a 20  ion to take */. 
26290 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
262a0 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a     /* Take the j
262b0 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45  ump if the BETWE
262c0 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  EN is NULL */.){
262d0 0a 20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b  .  Expr exprAnd;
262e0 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20       /* The AND 
262f0 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d  operator in  x>=
26300 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20  y AND x<=z  */. 
26310 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20   Expr compLeft; 
26320 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20     /* The  x>=y 
26330 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
26340 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20  compRight;   /* 
26350 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20  The  x<=z  term 
26360 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
26370 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72  1 = 0; /* Tempor
26380 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
26390 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 44 65 6c   */.  Expr *pDel
263a0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
263b0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
263c0 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d  ;..  memset(&com
263d0 70 4c 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66  pLeft, 0, sizeof
263e0 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65  (Expr));.  memse
263f0 74 28 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c  t(&compRight, 0,
26400 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
26410 20 20 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e    memset(&exprAn
26420 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  d, 0, sizeof(Exp
26430 72 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  r));..  assert( 
26440 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
26450 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
26460 6c 65 63 74 29 20 29 3b 0a 20 20 70 44 65 6c 20  lect) );.  pDel 
26470 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
26480 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
26490 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  t, 0);.  if( db-
264a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
264b0 20 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 64 2e   ){.    exprAnd.
264c0 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
264d0 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
264e0 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20   &compLeft;.    
264f0 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d  exprAnd.pRight =
26500 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20   &compRight;.   
26510 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54   compLeft.op = T
26520 4b 5f 47 45 3b 0a 20 20 20 20 63 6f 6d 70 4c 65  K_GE;.    compLe
26530 66 74 2e 70 4c 65 66 74 20 3d 20 70 44 65 6c 3b  ft.pLeft = pDel;
26540 0a 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52  .    compLeft.pR
26550 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
26560 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
26570 72 3b 0a 20 20 20 20 63 6f 6d 70 52 69 67 68 74  r;.    compRight
26580 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20  .op = TK_LE;.   
26590 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74   compRight.pLeft
265a0 20 3d 20 70 44 65 6c 3b 0a 20 20 20 20 63 6f 6d   = pDel;.    com
265b0 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20  pRight.pRight = 
265c0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
265d0 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
265e0 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70  exprToRegister(p
265f0 44 65 6c 2c 20 65 78 70 72 43 6f 64 65 56 65 63  Del, exprCodeVec
26600 74 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 6c  tor(pParse, pDel
26610 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20  , &regFree1));. 
26620 20 20 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a     if( xJump ){.
26630 20 20 20 20 20 20 78 4a 75 6d 70 28 70 50 61 72        xJump(pPar
26640 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
26650 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
26660 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26670 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 65 78    /* Mark the ex
26680 70 72 65 73 73 69 6f 6e 20 69 73 20 62 65 69 6e  pression is bein
26690 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72  g from the ON or
266a0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
266b0 20 61 20 6a 6f 69 6e 0a 20 20 20 20 20 20 2a 2a   a join.      **
266c0 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 71 6c   so that the sql
266d0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
266e0 65 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  et() routine wil
266f0 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  l not attempt to
26700 20 6d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69   move.      ** i
26710 74 20 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65  t into the Parse
26720 2e 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74  .pConstExpr list
26730 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65  .  We should use
26740 20 61 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74   a new bit for t
26750 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6f  his,.      ** fo
26760 72 20 63 6c 61 72 69 74 79 2c 20 62 75 74 20 77  r clarity, but w
26770 65 20 61 72 65 20 6f 75 74 20 6f 66 20 62 69 74  e are out of bit
26780 73 20 69 6e 20 74 68 65 20 45 78 70 72 2e 66 6c  s in the Expr.fl
26790 61 67 73 20 66 69 65 6c 64 20 73 6f 20 77 65 0a  ags field so we.
267a0 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 74 6f        ** have to
267b0 20 72 65 75 73 65 20 74 68 65 20 45 50 5f 46 72   reuse the EP_Fr
267c0 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75 6d  omJoin bit.  Bum
267d0 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 44  mer. */.      pD
267e0 65 6c 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  el->flags |= EP_
267f0 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 20 20  FromJoin;.      
26800 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
26810 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 26 65  arget(pParse, &e
26820 78 70 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20  xprAnd, dest);. 
26830 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
26840 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
26850 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
26860 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
26870 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44  xprDelete(db, pD
26880 65 6c 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  el);..  /* Ensur
26890 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20  e adequate test 
268a0 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65  coverage */.  te
268b0 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
268c0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
268d0 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d    && jumpIfNull=
268e0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
268f0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26900 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26910 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
26920 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
26930 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
26940 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
26950 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72  =sqlite3ExprIfTr
26960 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ue  && jumpIfNul
26970 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
26980 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
26990 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
269a0 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
269b0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
269c0 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
269d0 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
269e0 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
269f0 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
26a00 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
26a10 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
26a20 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
26a30 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
26a40 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
26a50 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
26a60 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
26a70 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
26a80 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49  IfFalse && jumpI
26a90 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
26aa0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
26ab0 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
26ac0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26ad0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
26ae0 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
26af0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
26b00 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  xJump==0 );.}../
26b10 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
26b20 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
26b30 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
26b40 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
26b50 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
26b60 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
26b70 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
26b80 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
26b90 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
26ba0 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
26bb0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
26bc0 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
26bd0 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
26be0 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
26bf0 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
26c00 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
26c10 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
26c20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
26c30 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53  IfNull flag is S
26c40 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
26c50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64  ..**.** This cod
26c60 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
26c70 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61   fact that certa
26c80 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  in token values 
26c90 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61  (ex: TK_EQ).** a
26ca0 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f  re the same as o
26cb0 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78  pcode values (ex
26cc0 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d  : OP_Eq) that im
26cd0 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72  plement the corr
26ce0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65  esponding.** ope
26cf0 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c  ration.  Special
26d00 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62   comments in vdb
26d10 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70  e.c and the mkop
26d20 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74  codeh.awk script
26d30 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20   in.** the make 
26d40 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68  process cause th
26d50 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c  ese values to al
26d60 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20  ign.  Assert()s 
26d70 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62  in the code.** b
26d80 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74  elow verify that
26d90 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65   the numbers are
26da0 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74   aligned correct
26db0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
26dc0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61  te3ExprIfTrue(Pa
26dd0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
26de0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
26df0 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
26e00 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
26e10 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
26e20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
26e30 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
26e40 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
26e50 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
26e60 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
26e70 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
26e80 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
26e90 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
26ea0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
26eb0 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b  0) )     return;
26ec0 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f    /* Existence o
26ed0 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
26ee0 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
26ef0 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
26f00 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
26f10 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20  No way this can 
26f20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d  happen */.  op =
26f30 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
26f40 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
26f50 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
26f60 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
26f70 20 20 20 20 20 45 78 70 72 20 2a 70 41 6c 74 20       Expr *pAlt 
26f80 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 69 6d  = sqlite3ExprSim
26f90 70 6c 69 66 69 65 64 41 6e 64 4f 72 28 70 45 78  plifiedAndOr(pEx
26fa0 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
26fb0 41 6c 74 21 3d 70 45 78 70 72 20 29 7b 0a 20 20  Alt!=pExpr ){.  
26fc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26fd0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
26fe0 70 41 6c 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  pAlt, dest, jump
26ff0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  IfNull);.      }
27000 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
27010 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  AND ){.        i
27020 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
27030 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
27040 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  rse);.        te
27050 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
27060 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ll==0 );.       
27070 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
27080 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
27090 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 0a 20 20  r->pLeft, d2,.  
270a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270b0 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 66 4e           jumpIfN
270c0 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
270d0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
270e0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
270f0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
27100 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
27110 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
27120 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
27130 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
27140 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  2);.      }else{
27150 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
27160 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
27170 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
27180 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
27190 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
271a0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
271b0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
271c0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
271d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
271e0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
271f0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
27200 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
27210 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
27220 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
27230 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
27240 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
27250 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
27260 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
27270 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
27280 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
27290 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
272a0 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48     case TK_TRUTH
272b0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73  : {.      int is
272c0 4e 6f 74 3b 20 20 20 20 20 20 2f 2a 20 49 53 20  Not;      /* IS 
272d0 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e  NOT TRUE or IS N
272e0 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20  OT FALSE */.    
272f0 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 20    int isTrue;   
27300 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20    /* IS TRUE or 
27310 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20  IS NOT TRUE */. 
27320 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
27330 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
27340 20 20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45        isNot = pE
27350 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e  xpr->op2==TK_ISN
27360 4f 54 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65  OT;.      isTrue
27370 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72   = sqlite3ExprTr
27380 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e  uthValue(pExpr->
27390 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74  pRight);.      t
273a0 65 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20  estcase( isTrue 
273b0 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20  && isNot );.    
273c0 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54    testcase( !isT
273d0 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a  rue && isNot );.
273e0 20 20 20 20 20 20 69 66 28 20 69 73 54 72 75 65        if( isTrue
273f0 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20   ^ isNot ){.    
27400 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
27410 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
27420 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
27430 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27440 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f              isNo
27450 74 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  t ? SQLITE_JUMPI
27460 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20  FNULL : 0);.    
27470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27480 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
27490 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
274a0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a  r->pLeft, dest,.
274b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274c0 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74             isNot
274d0 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   ? SQLITE_JUMPIF
274e0 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20  NULL : 0);.     
274f0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
27500 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
27510 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
27520 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
27530 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
27540 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
27550 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
27560 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  OT );.      op =
27570 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54   (op==TK_IS) ? T
27580 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20  K_EQ : TK_NE;.  
27590 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d      jumpIfNull =
275a0 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a   SQLITE_NULLEQ;.
275b0 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
275c0 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ru */.    case T
275d0 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
275e0 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
275f0 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
27600 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
27610 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
27620 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_EQ: {.      if
27630 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
27640 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65  ector(pExpr->pLe
27650 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75  ft) ) goto defau
27660 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74  lt_expr;.      t
27670 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
27680 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
27690 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
276a0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
276b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
276c0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
276d0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
276e0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
276f0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
27700 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
27710 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
27720 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27730 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
27740 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
27750 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
27760 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
27770 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
27780 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
27790 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
277a0 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
277b0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
277c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
277d0 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
277e0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
277f0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
27800 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
27810 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
27820 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
27830 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
27840 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
27850 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
27860 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
27870 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
27880 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
27890 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
278a0 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
278b0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
278c0 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
278d0 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  e(op==OP_Eq);.  
278e0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
278f0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
27900 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
27910 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
27920 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
27930 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71  eIf(v, op==OP_Eq
27940 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
27950 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
27960 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
27970 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74  NE==OP_Ne); test
27980 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
27990 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
279a0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
279b0 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
279c0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
279d0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
279e0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
279f0 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Ne && jumpIfNul
27a00 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
27a10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27a20 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
27a30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27a40 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
27a50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27a60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27a70 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
27a80 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
27a90 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
27aa0 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
27ab0 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  l );   testcase(
27ac0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
27ad0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27ae0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
27af0 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61  otNull ); testca
27b00 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
27b10 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  LL );.      r1 =
27b20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
27b30 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
27b40 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
27b50 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
27b60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
27b70 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
27b80 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27b90 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
27ba0 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  ISNULL);.      V
27bb0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27bc0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
27bd0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27be0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
27bf0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27c00 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27c10 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
27c20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
27c30 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
27c40 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
27c50 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
27c60 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78   dest, sqlite3Ex
27c70 70 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66  prIfTrue, jumpIf
27c80 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
27c90 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
27ca0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
27cb0 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
27cc0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
27cd0 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
27ce0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
27cf0 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
27d00 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
27d10 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c  ull = jumpIfNull
27d20 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66   ? dest : destIf
27d30 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c  False;.      sql
27d40 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
27d50 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
27d60 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
27d70 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
27d80 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
27d90 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
27da0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
27db0 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
27dc0 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alse);.      bre
27dd0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
27de0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
27df0 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72      default_expr
27e00 3a 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  :.      if( Expr
27e10 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72  AlwaysTrue(pExpr
27e20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
27e30 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
27e40 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
27e50 73 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79  se if( ExprAlway
27e60 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
27e70 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  .        /* No-o
27e80 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  p */.      }else
27e90 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
27ea0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
27eb0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
27ec0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
27ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27ee0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
27ef0 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
27f00 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
27f10 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
27f20 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
27f30 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
27f40 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
27f50 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
27f60 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
27f70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27f80 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
27f90 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
27fa0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
27fb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
27fc0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
27fd0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a  e, regFree2);  .
27fe0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
27ff0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
28000 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
28010 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
28020 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
28030 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
28040 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
28050 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
28060 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
28070 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
28080 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
28090 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
280a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
280b0 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
280c0 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
280d0 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
280e0 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
280f0 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
28100 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
28110 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  L or fall throug
28120 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a  h if jumpIfNull.
28130 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ** is 0..*/.void
28140 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
28150 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
28160 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
28170 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
28180 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
28190 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
281a0 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
281b0 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
281c0 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
281d0 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
281e0 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
281f0 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
28200 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
28210 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
28220 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
28230 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
28240 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  n; /* Existence 
28250 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
28260 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
28270 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20  f( pExpr==0 )   
28280 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
28290 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70  he value of pExp
282a0 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65  r->op and op are
282b0 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c   related as foll
282c0 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
282d0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20       pExpr->op  
282e0 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a            op.  *
282f0 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  *       --------
28300 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  -          -----
28310 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20  -----.  **      
28320 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20   TK_ISNULL      
28330 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20      OP_NotNull. 
28340 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54   **       TK_NOT
28350 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f  NULL         OP_
28360 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  IsNull.  **     
28370 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20    TK_NE         
28380 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20       OP_Eq.  ** 
28390 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20        TK_EQ     
283a0 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20           OP_Ne. 
283b0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20   **       TK_GT 
283c0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
283d0 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Le.  **       TK
283e0 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _LE             
283f0 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Gt.  **     
28400 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20    TK_GE         
28410 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20       OP_Lt.  ** 
28420 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20        TK_LT     
28430 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20           OP_Ge. 
28440 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68   **.  ** For oth
28450 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78  er values of pEx
28460 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e  pr->op, op is un
28470 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73  defined and unus
28480 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  ed..  ** The val
28490 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  ue of TK_ and OP
284a0 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20  _ constants are 
284b0 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68  arranged such th
284c0 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63  at we.  ** can c
284d0 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69  ompute the mappi
284e0 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74  ng above using t
284f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
28500 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73  ression..  ** As
28510 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74  sert()s verify t
28520 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74  hat the computat
28530 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ion is correct..
28540 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45    */.  op = ((pE
28550 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55  xpr->op+(TK_ISNU
28560 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53  LL&1))^1)-(TK_IS
28570 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56  NULL&1);..  /* V
28580 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c  erify correct al
28590 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61  ignment of TK_ a
285a0 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
285b0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
285c0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53  pExpr->op!=TK_IS
285d0 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  NULL || op==OP_N
285e0 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  otNull );.  asse
285f0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
28600 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  K_NOTNULL || op=
28610 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
28620 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28630 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_NE || op==
28640 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72  OP_Eq );.  asser
28650 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
28660 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65  _EQ || op==OP_Ne
28670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
28680 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c  xpr->op!=TK_LT |
28690 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  | op==OP_Ge );. 
286a0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
286b0 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op!=TK_LE || op=
286c0 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
286d0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
286e0 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GT || op==OP_L
286f0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
28700 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20  Expr->op!=TK_GE 
28710 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  || op==OP_Lt );.
28720 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
28730 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
28740 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
28750 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
28760 20 45 78 70 72 20 2a 70 41 6c 74 20 3d 20 73 71   Expr *pAlt = sq
28770 6c 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66  lite3ExprSimplif
28780 69 65 64 41 6e 64 4f 72 28 70 45 78 70 72 29 3b  iedAndOr(pExpr);
28790 0a 20 20 20 20 20 20 69 66 28 20 70 41 6c 74 21  .      if( pAlt!
287a0 3d 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  =pExpr ){.      
287b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
287c0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 41 6c  alse(pParse, pAl
287d0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
287e0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ull);.      }els
287f0 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
28800 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20  =TK_AND ){.     
28810 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
28820 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28830 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28840 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
28850 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
28860 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
28870 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28880 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
28890 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
288a0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
288b0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Null);.      }el
288c0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
288d0 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
288e0 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
288f0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
28900 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
28910 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
28920 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
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 64 32 2c 0a 20 20 20 20 20 20  Left, d2,.      
28950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28960 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53      jumpIfNull^S
28970 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
28980 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28990 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
289a0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
289b0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
289c0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
289d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
289e0 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
289f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
28a00 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
28a10 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
28a20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
28a30 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
28a40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28a50 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
28a60 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
28a70 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
28a80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28a90 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
28aa0 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RUTH: {.      in
28ab0 74 20 69 73 4e 6f 74 3b 20 20 20 2f 2a 20 49 53  t isNot;   /* IS
28ac0 20 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20   NOT TRUE or IS 
28ad0 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20  NOT FALSE */.   
28ae0 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20     int isTrue;  
28af0 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
28b00 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20   NOT TRUE */.   
28b10 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
28b20 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28b30 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70      isNot = pExp
28b40 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54  r->op2==TK_ISNOT
28b50 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d  ;.      isTrue =
28b60 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74   sqlite3ExprTrut
28b70 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52  hValue(pExpr->pR
28b80 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73  ight);.      tes
28b90 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26  tcase( isTrue &&
28ba0 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20   isNot );.      
28bb0 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75  testcase( !isTru
28bc0 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20  e && isNot );.  
28bd0 20 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e      if( isTrue ^
28be0 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20   isNot ){.      
28bf0 20 20 2f 2a 20 49 53 20 54 52 55 45 20 61 6e 64    /* IS TRUE and
28c00 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f   IS NOT FALSE */
28c10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28c20 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
28c30 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
28c40 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20  , dest,.        
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c60 20 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53     isNot ? 0 : S
28c70 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
28c80 29 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  );..      }else{
28c90 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20 46  .        /* IS F
28ca0 41 4c 53 45 20 61 6e 64 20 49 53 20 4e 4f 54 20  ALSE and IS NOT 
28cb0 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  TRUE */.        
28cc0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
28cd0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
28ce0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20  >pLeft, dest,.  
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d00 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20          isNot ? 
28d10 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  0 : SQLITE_JUMPI
28d20 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
28d30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28d40 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
28d50 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
28d60 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
28d70 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
28d80 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
28d90 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
28da0 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
28db0 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78  .      op = (pEx
28dc0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f  pr->op==TK_IS) ?
28dd0 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a   TK_NE : TK_EQ;.
28de0 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c        jumpIfNull
28df0 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
28e00 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
28e10 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65  thru */.    case
28e20 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
28e30 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
28e40 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
28e50 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
28e60 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
28e70 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
28e80 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
28e90 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70  sVector(pExpr->p
28ea0 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66  Left) ) goto def
28eb0 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20  ault_expr;.     
28ec0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
28ed0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
28ee0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
28ef0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
28f00 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
28f10 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
28f20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
28f30 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
28f40 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
28f50 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
28f60 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
28f70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
28f80 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
28f90 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
28fa0 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
28fb0 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
28fc0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
28fd0 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
28fe0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
28ff0 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
29000 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
29010 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Lt);.      asser
29020 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
29030 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
29040 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
29050 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
29060 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29070 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
29080 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
29090 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
290a0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
290b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
290c0 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
290d0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
290e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
290f0 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
29100 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
29110 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
29120 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  ase(op==OP_Eq);.
29130 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
29140 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
29150 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  q && jumpIfNull!
29160 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
29170 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
29180 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
29190 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
291a0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
291b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
291c0 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
291d0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
291e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
291f0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
29200 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
29210 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
29220 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
29230 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
29240 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
29250 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
29260 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
29270 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
29280 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
29290 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
292a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
292b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
292c0 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
292d0 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
292e0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
292f0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
29300 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
29310 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
29320 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
29330 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
29340 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
29350 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
29360 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56  TK_ISNULL );   V
29370 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
29380 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
29390 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
293a0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
293b0 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
293c0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
293d0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
293e0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
293f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
29400 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
29410 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
29420 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29430 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
29440 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
29450 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
29460 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69  Expr, dest, sqli
29470 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c 20  te3ExprIfFalse, 
29480 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
29490 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
294a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
294b0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
294c0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
294d0 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e       if( jumpIfN
294e0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
294f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
29500 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
29510 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  dest, dest);.   
29520 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29530 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
29540 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
29550 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
29560 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29570 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
29580 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
29590 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
295a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
295b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
295c0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
295d0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
295e0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
295f0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
29600 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20    default_expr: 
29610 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 41  .      if( ExprA
29620 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
29630 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
29640 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
29650 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
29660 73 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79  se if( ExprAlway
29670 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a  sTrue(pExpr) ){.
29680 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70          /* no-op
29690 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
296a0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
296b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
296c0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
296d0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
296e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
296f0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
29700 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  ot, r1, dest, ju
29710 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
29720 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
29730 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  ge(v);.        t
29740 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
29750 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
29760 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
29770 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
29780 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
29790 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
297a0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
297b0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
297c0 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
297d0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
297e0 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
297f0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71  }../*.** Like sq
29800 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
29810 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 61  () except that a
29820 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
29830 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a   pExpr before.**
29840 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
29850 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20  , and that copy 
29860 69 73 20 64 65 6c 65 74 65 64 20 61 66 74 65 72  is deleted after
29870 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
29880 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65  . This.** ensure
29890 73 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  s that the origi
298a0 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63  nal pExpr is unc
298b0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  hanged..*/.void 
298c0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
298d0 73 65 44 75 70 28 50 61 72 73 65 20 2a 70 50 61  seDup(Parse *pPa
298e0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
298f0 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a  , int dest,int j
29900 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71  umpIfNull){.  sq
29910 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
29920 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
29930 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45  pCopy = sqlite3E
29940 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
29950 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  , 0);.  if( db->
29960 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
29970 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
29980 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
29990 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a  , pCopy, dest, j
299a0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  umpIfNull);.  }.
299b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
299c0 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a  ete(db, pCopy);.
299d0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73  }../*.** Express
299e0 69 6f 6e 20 70 56 61 72 20 69 73 20 67 75 61 72  ion pVar is guar
299f0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20  anteed to be an 
29a00 53 51 4c 20 76 61 72 69 61 62 6c 65 2e 20 70 45  SQL variable. pE
29a10 78 70 72 20 6d 61 79 20 62 65 20 61 6e 79 0a 2a  xpr may be any.*
29a20 2a 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73  * type of expres
29a30 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  sion..**.** If p
29a40 45 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65  Expr is a simple
29a50 20 53 51 4c 20 76 61 6c 75 65 20 2d 20 61 6e 20   SQL value - an 
29a60 69 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73  integer, real, s
29a70 74 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a 20 6f  tring, blob.** o
29a80 72 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2d 20 74  r NULL value - t
29a90 68 65 6e 20 74 68 65 20 56 44 42 45 20 63 75 72  hen the VDBE cur
29aa0 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 72 65  rently being pre
29ab0 70 61 72 65 64 20 69 73 20 63 6f 6e 66 69 67 75  pared is configu
29ac0 72 65 64 0a 2a 2a 20 74 6f 20 72 65 2d 70 72 65  red.** to re-pre
29ad0 70 61 72 65 20 65 61 63 68 20 74 69 6d 65 20 61  pare each time a
29ae0 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 62 6f   new value is bo
29af0 75 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20  und to variable 
29b00 70 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69  pVar..**.** Addi
29b10 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 70 45 78  tionally, if pEx
29b20 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53  pr is a simple S
29b30 51 4c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  QL value and the
29b40 20 76 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a   value is the.**
29b50 20 73 61 6d 65 20 61 73 20 74 68 61 74 20 63 75   same as that cu
29b60 72 72 65 6e 74 6c 79 20 62 6f 75 6e 64 20 74 6f  rrently bound to
29b70 20 76 61 72 69 61 62 6c 65 20 70 56 61 72 2c 20   variable pVar, 
29b80 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
29b90 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  rned..** Otherwi
29ba0 73 65 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65  se, if the value
29bb0 73 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61  s are not the sa
29bc0 6d 65 20 6f 72 20 69 66 20 70 45 78 70 72 20 69  me or if pExpr i
29bd0 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 0a 2a  s not a simple.*
29be0 2a 20 53 51 4c 20 76 61 6c 75 65 2c 20 7a 65 72  * SQL value, zer
29bf0 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  o is returned..*
29c00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
29c10 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65  rCompareVariable
29c20 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
29c30 45 78 70 72 20 2a 70 56 61 72 2c 20 45 78 70 72  Expr *pVar, Expr
29c40 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
29c50 72 65 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  res = 0;.  int i
29c60 56 61 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  Var;.  sqlite3_v
29c70 61 6c 75 65 20 2a 70 4c 2c 20 2a 70 52 20 3d 20  alue *pL, *pR = 
29c80 30 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 56  0;.  .  sqlite3V
29c90 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
29ca0 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
29cb0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
29cc0 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2c 20 26 70  ITE_AFF_BLOB, &p
29cd0 52 29 3b 0a 20 20 69 66 28 20 70 52 20 29 7b 0a  R);.  if( pR ){.
29ce0 20 20 20 20 69 56 61 72 20 3d 20 70 56 61 72 2d      iVar = pVar-
29cf0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  >iColumn;.    sq
29d00 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
29d10 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ask(pParse->pVdb
29d20 65 2c 20 69 56 61 72 29 3b 0a 20 20 20 20 70 4c  e, iVar);.    pL
29d30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
29d40 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 50 61 72  tBoundValue(pPar
29d50 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20  se->pReprepare, 
29d60 69 56 61 72 2c 20 53 51 4c 49 54 45 5f 41 46 46  iVar, SQLITE_AFF
29d70 5f 42 4c 4f 42 29 3b 0a 20 20 20 20 69 66 28 20  _BLOB);.    if( 
29d80 70 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  pL ){.      if( 
29d90 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
29da0 70 65 28 70 4c 29 3d 3d 53 51 4c 49 54 45 5f 54  pe(pL)==SQLITE_T
29db0 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  EXT ){.        s
29dc0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
29dd0 74 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65 20 73  t(pL); /* Make s
29de0 75 72 65 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  ure the encoding
29df0 20 69 73 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20   is UTF-8 */.   
29e00 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d     }.      res =
29e10 20 20 30 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 43    0==sqlite3MemC
29e20 6f 6d 70 61 72 65 28 70 4c 2c 20 70 52 2c 20 30  ompare(pL, pR, 0
29e30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
29e40 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52  ite3ValueFree(pR
29e50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
29e60 6c 75 65 46 72 65 65 28 70 4c 29 3b 0a 20 20 7d  lueFree(pL);.  }
29e70 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ..  return res;.
29e80 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
29e90 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
29ea0 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
29eb0 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30  trees.  Return 0
29ec0 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
29ed0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63  xpressions are c
29ee0 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69  ompletely identi
29ef0 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69  cal.  Return 1 i
29f00 66 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e  f they differ on
29f10 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41  ly.** by a COLLA
29f20 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74  TE operator at t
29f30 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52  he top level.  R
29f40 65 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65  eturn 2 if there
29f50 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73   are differences
29f60 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74  .** other than t
29f70 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c  he top-level COL
29f80 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LATE operator..*
29f90 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
29fa0 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
29fb0 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
29fc0 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
29fd0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
29fe0 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
29ff0 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
2a000 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
2a010 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
2a020 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69  .**.** The pA si
2a030 64 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e  de might be usin
2a040 67 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20  g TK_REGISTER.  
2a050 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
2a060 61 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a  ase and pB is.**
2a070 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45   not using TK_RE
2a080 47 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74  GISTER but is ot
2a090 68 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65  herwise equivale
2a0a0 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72  nt, then still r
2a0b0 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53  eturn 0..**.** S
2a0c0 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f  ometimes this ro
2a0d0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
2a0e0 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20  n 2 even if the 
2a0f0 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  two expressions.
2a100 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71  ** really are eq
2a110 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65  uivalent.  If we
2a120 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68   cannot prove th
2a130 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
2a140 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69  ns are.** identi
2a150 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32  cal, we return 2
2a160 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
2a170 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  .  So if this ro
2a180 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
2a190 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20   2, then you do 
2a1a0 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20  not really know 
2a1b0 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74  for certain if t
2a1c0 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
2a1d0 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
2a1e0 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20  me.  But if you 
2a1f0 67 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74  get a 0 or 1 ret
2a200 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a  urn, then you.**
2a210 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65   can be sure the
2a220 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
2a230 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74   the same.  In t
2a240 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a  he places where.
2a250 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
2a260 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73  is used, it does
2a270 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74   not hurt to get
2a280 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68   an extra 2 - th
2a290 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74  at.** just might
2a2a0 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20   result in some 
2a2b0 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20  slightly slower 
2a2c0 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72  code.  But retur
2a2d0 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72  ning.** an incor
2a2e0 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c  rect 0 or 1 coul
2a2f0 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66  d lead to a malf
2a300 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
2a310 66 20 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20  f pParse is not 
2a320 4e 55 4c 4c 20 74 68 65 6e 20 54 4b 5f 56 41 52  NULL then TK_VAR
2a330 49 41 42 4c 45 20 74 65 72 6d 73 20 69 6e 20 70  IABLE terms in p
2a340 41 20 77 69 74 68 20 62 69 6e 64 69 6e 67 73 20  A with bindings 
2a350 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 52  in.** pParse->pR
2a360 65 70 72 65 70 61 72 65 20 63 61 6e 20 62 65 20  eprepare can be 
2a370 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20  matched against 
2a380 6c 69 74 65 72 61 6c 73 20 69 6e 20 70 42 2e 20  literals in pB. 
2a390 20 54 68 65 20 0a 2a 2a 20 70 50 61 72 73 65 2d   The .** pParse-
2a3a0 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20  >pVdbe->expmask 
2a3b0 62 69 74 6d 61 73 6b 20 69 73 20 75 70 64 61 74  bitmask is updat
2a3c0 65 64 20 66 6f 72 20 65 61 63 68 20 76 61 72 69  ed for each vari
2a3d0 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 64 2e  able referenced.
2a3e0 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73  .** If pParse is
2a3f0 20 4e 55 4c 4c 20 28 74 68 65 20 6e 6f 72 6d 61   NULL (the norma
2a400 6c 20 63 61 73 65 29 20 74 68 65 6e 20 61 6e 79  l case) then any
2a410 20 54 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72   TK_VARIABLE ter
2a420 6d 20 69 6e 20 0a 2a 2a 20 41 72 67 75 6d 65 6e  m in .** Argumen
2a430 74 20 70 50 61 72 73 65 20 73 68 6f 75 6c 64 20  t pParse should 
2a440 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 4e 55 4c 4c  normally be NULL
2a450 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  . If it is not N
2a460 55 4c 4c 20 61 6e 64 20 70 41 20 6f 72 0a 2a 2a  ULL and pA or.**
2a470 20 70 42 20 63 61 75 73 65 73 20 61 20 72 65 74   pB causes a ret
2a480 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 2e 0a  urn value of 2..
2a490 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2a4a0 70 72 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20  prCompare(Parse 
2a4b0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
2a4c0 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74  A, Expr *pB, int
2a4d0 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f   iTab){.  u32 co
2a4e0 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69  mbinedFlags;.  i
2a4f0 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
2a500 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2a510 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a  pB==pA ? 0 : 2;.
2a520 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
2a530 20 26 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56   && pA->op==TK_V
2a540 41 52 49 41 42 4c 45 20 26 26 20 65 78 70 72 43  ARIABLE && exprC
2a550 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 70  ompareVariable(p
2a560 50 61 72 73 65 2c 20 70 41 2c 20 70 42 29 20 29  Parse, pA, pB) )
2a570 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2a580 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c    }.  combinedFl
2a590 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20  ags = pA->flags 
2a5a0 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  | pB->flags;.  i
2a5b0 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
2a5c0 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
2a5d0 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66  {.    if( (pA->f
2a5e0 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45  lags&pB->flags&E
2a5f0 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26  P_IntValue)!=0 &
2a600 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d  & pA->u.iValue==
2a610 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a  pB->u.iValue ){.
2a620 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2a630 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2a640 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   2;.  }.  if( pA
2a650 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 7c 7c 20  ->op!=pB->op || 
2a660 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 52 41 49 53 45  pA->op==TK_RAISE
2a670 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
2a680 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
2a690 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
2a6a0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d  pare(pParse, pA-
2a6b0 3e 70 4c 65 66 74 2c 70 42 2c 69 54 61 62 29 3c  >pLeft,pB,iTab)<
2a6c0 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
2a6d0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
2a6e0 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pB->op==TK_CO
2a6f0 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
2a700 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2a710 73 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65 66 74  se, pA,pB->pLeft
2a720 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20  ,iTab)<2 ){.    
2a730 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2a740 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  }.    return 2;.
2a750 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
2a760 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  !=TK_COLUMN && p
2a770 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  A->op!=TK_AGG_CO
2a780 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54  LUMN && pA->u.zT
2a790 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
2a7a0 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pA->op==TK_FUNCT
2a7b0 49 4f 4e 20 7c 7c 20 70 41 2d 3e 6f 70 3d 3d 54  ION || pA->op==T
2a7c0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
2a7d0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
2a7e0 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75  te3StrICmp(pA->u
2a7f0 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
2a800 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72  oken)!=0 ) retur
2a810 6e 20 32 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  n 2;.#ifndef SQL
2a820 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
2a830 55 4e 43 0a 20 20 20 20 20 20 61 73 73 65 72 74  UNC.      assert
2a840 28 20 70 41 2d 3e 6f 70 3d 3d 70 42 2d 3e 6f 70  ( pA->op==pB->op
2a850 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
2a860 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41  prHasProperty(pA
2a870 2c 45 50 5f 57 69 6e 46 75 6e 63 29 21 3d 45 78  ,EP_WinFunc)!=Ex
2a880 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42  prHasProperty(pB
2a890 2c 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a  ,EP_WinFunc) ){.
2a8a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32          return 2
2a8b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a8c0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
2a8d0 72 74 79 28 70 41 2c 45 50 5f 57 69 6e 46 75 6e  rty(pA,EP_WinFun
2a8e0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  c) ){.        if
2a8f0 28 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  ( sqlite3WindowC
2a900 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2a910 41 2d 3e 79 2e 70 57 69 6e 2c 20 70 42 2d 3e 79  A->y.pWin, pB->y
2a920 2e 70 57 69 6e 2c 20 31 29 21 3d 30 20 29 7b 0a  .pWin, 1)!=0 ){.
2a930 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2a940 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   2;.        }.  
2a950 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2a960 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f   }else if( pA->o
2a970 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20  p==TK_NULL ){.  
2a980 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2a990 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e    }else if( pA->
2a9a0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
2a9b0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
2a9c0 74 65 33 5f 73 74 72 69 63 6d 70 28 70 41 2d 3e  te3_stricmp(pA->
2a9d0 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
2a9e0 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75  Token)!=0 ) retu
2a9f0 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 2;.    }else 
2aa00 69 66 28 20 41 4c 57 41 59 53 28 70 42 2d 3e 75  if( ALWAYS(pB->u
2aa10 2e 7a 54 6f 6b 65 6e 21 3d 30 29 20 26 26 20 73  .zToken!=0) && s
2aa20 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b  trcmp(pA->u.zTok
2aa30 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  en,pB->u.zToken)
2aa40 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
2aa50 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 2;.    }.  }
2aa60 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67  .  if( (pA->flag
2aa70 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
2aa80 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
2aa90 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65  P_Distinct) ) re
2aaa0 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 28 63  turn 2;.  if( (c
2aab0 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
2aac0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 20  P_TokenOnly)==0 
2aad0 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69  ){.    if( combi
2aae0 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49  nedFlags & EP_xI
2aaf0 73 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  sSelect ) return
2ab00 20 32 3b 0a 20 20 20 20 69 66 28 20 28 63 6f 6d   2;.    if( (com
2ab10 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
2ab20 46 69 78 65 64 43 6f 6c 29 3d 3d 30 0a 20 20 20  FixedCol)==0.   
2ab30 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
2ab40 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
2ab50 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70  pA->pLeft, pB->p
2ab60 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20 72 65  Left, iTab) ) re
2ab70 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
2ab80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2ab90 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70  re(pParse, pA->p
2aba0 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
2abb0 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
2abc0 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
2abd0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
2abe0 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c  are(pA->x.pList,
2abf0 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54   pB->x.pList, iT
2ac00 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
2ac10 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d      if( pA->op!=
2ac20 54 4b 5f 53 54 52 49 4e 47 0a 20 20 20 20 20 26  TK_STRING.     &
2ac30 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 54 52 55  & pA->op!=TK_TRU
2ac40 45 46 41 4c 53 45 0a 20 20 20 20 20 26 26 20 28  EFALSE.     && (
2ac50 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
2ac60 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 0a 20  EP_Reduced)==0. 
2ac70 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
2ac80 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
2ac90 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
2aca0 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 2;.      if( p
2acb0 41 2d 3e 6f 70 32 21 3d 70 42 2d 3e 6f 70 32 20  A->op2!=pB->op2 
2acc0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2acd0 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
2ace0 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20  !=pB->iTable .  
2acf0 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61       && (pA->iTa
2ad00 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56  ble!=iTab || NEV
2ad10 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30  ER(pB->iTable>=0
2ad20 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  )) ) return 2;. 
2ad30 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2ad40 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
2ad50 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69  mpare two ExprLi
2ad60 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74  st objects.  Ret
2ad70 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72  urn 0 if they ar
2ad80 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
2ad90 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  .** non-zero if 
2ada0 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
2adb0 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  ny way..**.** If
2adc0 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20   any subelement 
2add0 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69  of pB has Expr.i
2ade0 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e  Table==(-1) then
2adf0 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a   it is allowed.*
2ae00 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75  * to compare equ
2ae10 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c  al to an equival
2ae20 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70  ent element in p
2ae30 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62  A with Expr.iTab
2ae40 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20  le==iTab..**.** 
2ae50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
2ae60 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ht return non-ze
2ae70 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e  ro for equivalen
2ae80 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68  t ExprLists.  Th
2ae90 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71  e.** only conseq
2aea0 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69  uence will be di
2aeb0 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74  sabled optimizat
2aec0 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20  ions.  But this 
2aed0 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20  routine.** must 
2aee0 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69  never return 0 i
2aef0 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69  f the two ExprLi
2af00 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64  st objects are d
2af10 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20  ifferent, or.** 
2af20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69  a malfunction wi
2af30 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  ll result..**.**
2af40 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   Two NULL pointe
2af50 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
2af60 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  d to be the same
2af70 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f  .  But a NULL po
2af80 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20  inter.** always 
2af90 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e  differs from a n
2afa0 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e  on-NULL pointer.
2afb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2afc0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45  xprListCompare(E
2afd0 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70  xprList *pA, Exp
2afe0 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69  rList *pB, int i
2aff0 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Tab){.  int i;. 
2b000 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42   if( pA==0 && pB
2b010 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2b020 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
2b030 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  B==0 ) return 1;
2b040 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72  .  if( pA->nExpr
2b050 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65  !=pB->nExpr ) re
2b060 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d  turn 1;.  for(i=
2b070 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20  0; i<pA->nExpr; 
2b080 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
2b090 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69  pExprA = pA->a[i
2b0a0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ].pExpr;.    Exp
2b0b0 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e  r *pExprB = pB->
2b0c0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
2b0d0 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72  if( pA->a[i].sor
2b0e0 74 46 6c 61 67 73 21 3d 70 42 2d 3e 61 5b 69 5d  tFlags!=pB->a[i]
2b0f0 2e 73 6f 72 74 46 6c 61 67 73 20 29 20 72 65 74  .sortFlags ) ret
2b100 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73  urn 1;.    if( s
2b110 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2b120 65 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45 78  e(0, pExprA, pEx
2b130 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74  prB, iTab) ) ret
2b140 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
2b150 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2b160 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  Like sqlite3Expr
2b170 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70 74  Compare() except
2b180 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
2b190 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65  rs at the top-le
2b1a0 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72  vel.** are ignor
2b1b0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2b1c0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
2b1d0 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  p(Expr *pA, Expr
2b1e0 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
2b1f0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2b200 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a  3ExprCompare(0,.
2b210 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2b220 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2b230 61 74 65 41 6e 64 4c 69 6b 65 6c 79 28 70 41 29  ateAndLikely(pA)
2b240 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73  ,.             s
2b250 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
2b260 6c 6c 61 74 65 41 6e 64 4c 69 6b 65 6c 79 28 70  llateAndLikely(p
2b270 42 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  B),.            
2b280 20 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iTab);.}../*.**
2b290 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
2b2a0 20 69 66 20 45 78 70 72 20 70 20 63 61 6e 20 6f   if Expr p can o
2b2b0 6e 6c 79 20 62 65 20 74 72 75 65 20 69 66 20 70  nly be true if p
2b2c0 4e 4e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a  NN is not NULL..
2b2d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
2b2e0 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c  prImpliesNotNull
2b2f0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2b300 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
2b310 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
2b320 45 78 70 72 20 2a 70 2c 20 20 20 20 20 20 20 20  Expr *p,        
2b330 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
2b340 73 73 69 6f 6e 20 74 6f 20 62 65 20 63 68 65 63  ssion to be chec
2b350 6b 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ked */.  Expr *p
2b360 4e 4e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  NN,          /* 
2b370 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
2b380 68 61 74 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 20  hat is NOT NULL 
2b390 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
2b3a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
2b3b0 65 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  e being evaluate
2b3c0 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 4e  d */.  int seenN
2b3d0 6f 74 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ot         /* Tr
2b3e0 75 65 20 69 66 20 70 20 69 73 20 61 6e 20 6f 70  ue if p is an op
2b3f0 65 72 61 6e 64 20 6f 66 20 4e 4f 54 20 2a 2f 0a  erand of NOT */.
2b400 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  ){.  assert( p )
2b410 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 4e 20  ;.  assert( pNN 
2b420 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2b430 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2b440 73 65 2c 20 70 2c 20 70 4e 4e 2c 20 69 54 61 62  se, p, pNN, iTab
2b450 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
2b460 72 6e 20 70 4e 4e 2d 3e 6f 70 21 3d 54 4b 5f 4e  rn pNN->op!=TK_N
2b470 55 4c 4c 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  ULL;.  }.  switc
2b480 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
2b490 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
2b4a0 20 20 20 20 69 66 28 20 73 65 65 6e 4e 6f 74 20      if( seenNot 
2b4b0 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
2b4c0 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
2b4d0 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ct) ) return 0;.
2b4e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
2b4f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
2b500 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20  EP_xIsSelect).  
2b510 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 2d 3e           || (p->
2b520 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 70 2d  x.pList!=0 && p-
2b530 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  >x.pList->nExpr>
2b540 30 29 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  0) );.      retu
2b550 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f  rn exprImpliesNo
2b560 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d  tNull(pParse, p-
2b570 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61  >pLeft, pNN, iTa
2b580 62 2c 20 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20  b, seenNot);.   
2b590 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
2b5a0 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
2b5b0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
2b5c0 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  = p->x.pList;.  
2b5d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
2b5e0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  t!=0 );.      as
2b5f0 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
2b600 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 20 20 69  pr==2 );.      i
2b610 66 28 20 73 65 65 6e 4e 6f 74 20 29 20 72 65 74  f( seenNot ) ret
2b620 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28  urn 0;.      if(
2b630 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e   exprImpliesNotN
2b640 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ull(pParse, pLis
2b650 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
2b660 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65 6e 4e 6f  NN, iTab, seenNo
2b670 74 29 0a 20 20 20 20 20 20 20 7c 7c 20 65 78 70  t).       || exp
2b680 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28  rImpliesNotNull(
2b690 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
2b6a0 5b 31 5d 2e 70 45 78 70 72 2c 20 70 4e 4e 2c 20  [1].pExpr, pNN, 
2b6b0 69 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29 0a 20  iTab, seenNot). 
2b6c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2b6d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2b6e0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 65  }.      return e
2b6f0 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c  xprImpliesNotNul
2b700 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65  l(pParse, p->pLe
2b710 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73  ft, pNN, iTab, s
2b720 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a 20  eenNot);.    }. 
2b730 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20     case TK_EQ:. 
2b740 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
2b750 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
2b760 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
2b770 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
2b780 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
2b790 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
2b7a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
2b7b0 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
2b7c0 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
2b7d0 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
2b7e0 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
2b7f0 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
2b800 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
2b810 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
2b820 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
2b830 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
2b840 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
2b850 20 20 20 20 20 20 69 66 28 20 65 78 70 72 49 6d        if( exprIm
2b860 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70 50 61  pliesNotNull(pPa
2b870 72 73 65 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  rse, p->pRight, 
2b880 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65 6e 4e  pNN, iTab, seenN
2b890 6f 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ot) ) return 1;.
2b8a0 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
2b8b0 72 75 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74  ru into the next
2b8c0 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
2b8d0 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a     case TK_SPAN:
2b8e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
2b8f0 4c 41 54 45 3a 0a 20 20 20 20 63 61 73 65 20 54  LATE:.    case T
2b900 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61  K_BITNOT:.    ca
2b910 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20  se TK_UPLUS:.   
2b920 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
2b930 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
2b940 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75  exprImpliesNotNu
2b950 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  ll(pParse, p->pL
2b960 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20  eft, pNN, iTab, 
2b970 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a  seenNot);.    }.
2b980 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54      case TK_TRUT
2b990 48 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  H: {.      if( s
2b9a0 65 65 6e 4e 6f 74 20 29 20 72 65 74 75 72 6e 20  eenNot ) return 
2b9b0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  0;.      if( p->
2b9c0 6f 70 32 21 3d 54 4b 5f 49 53 20 29 20 72 65 74  op2!=TK_IS ) ret
2b9d0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 72 65 74  urn 0;.      ret
2b9e0 75 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e  urn exprImpliesN
2b9f0 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70  otNull(pParse, p
2ba00 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54  ->pLeft, pNN, iT
2ba10 61 62 2c 20 73 65 65 6e 4e 6f 74 29 3b 0a 20 20  ab, seenNot);.  
2ba20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
2ba30 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  NOT: {.      ret
2ba40 75 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e  urn exprImpliesN
2ba50 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70  otNull(pParse, p
2ba60 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54  ->pLeft, pNN, iT
2ba70 61 62 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ab, 1);.    }.  
2ba80 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2ba90 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2baa0 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f  ue if we can pro
2bab0 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20  ve the pE2 will 
2bac0 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69  always be true i
2bad0 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65  f pE1 is.** true
2bae0 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
2baf0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d  if we cannot com
2bb00 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20  plete the proof 
2bb10 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a  or if pE2 might.
2bb20 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78  ** be false.  Ex
2bb30 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
2bb40 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20    pE1: x==5     
2bb50 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20    pE2: x==5     
2bb60 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20          Result: 
2bb70 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
2bb80 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a   x>0        pE2:
2bb90 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20   x==5           
2bba0 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a    Result: false.
2bbb0 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31  **     pE1: x=21
2bbc0 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31         pE2: x=21
2bbd0 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73   OR y=43     Res
2bbe0 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
2bbf0 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20   pE1: x!=123    
2bc00 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
2bc10 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74  ULL    Result: t
2bc20 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
2bc30 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20  x!=?1      pE2: 
2bc40 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
2bc50 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
2bc60 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e       pE1: x IS N
2bc70 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e  ULL  pE2: x IS N
2bc80 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
2bc90 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
2bca0 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20  pE1: x IS ?2    
2bcb0 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
2bcc0 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61  LL    Reuslt: fa
2bcd0 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63  lse.**.** When c
2bce0 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55  omparing TK_COLU
2bcf0 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e  MN nodes between
2bd00 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66   pE1 and pE2, if
2bd10 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72   pE2 has.** Expr
2bd20 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61  .iTable<0 then a
2bd30 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75  ssume a table nu
2bd40 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54  mber given by iT
2bd50 61 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61  ab..**.** If pPa
2bd60 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  rse is not NULL,
2bd70 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73   then the values
2bd80 20 6f 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62   of bound variab
2bd90 6c 65 73 20 69 6e 20 70 45 31 20 61 72 65 20 0a  les in pE1 are .
2bda0 2a 2a 20 63 6f 6d 70 61 72 65 64 20 61 67 61 69  ** compared agai
2bdb0 6e 73 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  nst literal valu
2bdc0 65 73 20 69 6e 20 70 45 32 20 61 6e 64 20 70 50  es in pE2 and pP
2bdd0 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70  arse->pVdbe->exp
2bde0 6d 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66  mask is.** modif
2bdf0 69 65 64 20 74 6f 20 72 65 63 6f 72 64 20 77 68  ied to record wh
2be00 69 63 68 20 62 6f 75 6e 64 20 76 61 72 69 61 62  ich bound variab
2be10 6c 65 73 20 61 72 65 20 72 65 66 65 72 65 6e 63  les are referenc
2be20 65 64 2e 20 20 49 66 20 70 50 61 72 73 65 20 0a  ed.  If pParse .
2be30 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  ** is NULL, then
2be40 20 66 61 6c 73 65 20 77 69 6c 6c 20 62 65 20 72   false will be r
2be50 65 74 75 72 6e 65 64 20 69 66 20 70 45 31 20 63  eturned if pE1 c
2be60 6f 6e 74 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e  ontains any boun
2be70 64 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  d variables..**.
2be80 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  ** When in doubt
2be90 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20  , return false. 
2bea0 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20   Returning true 
2beb0 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72  might give a per
2bec0 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72  formance.** impr
2bed0 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  ovement.  Return
2bee0 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20  ing false might 
2bef0 63 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61  cause a performa
2bf00 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62  nce reduction, b
2bf10 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c  ut.** it will al
2bf20 77 61 79 73 20 67 69 76 65 20 74 68 65 20 63 6f  ways give the co
2bf30 72 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64  rrect answer and
2bf40 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73   is hence always
2bf50 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   safe..*/.int sq
2bf60 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
2bf70 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72  Expr(Parse *pPar
2bf80 73 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45  se, Expr *pE1, E
2bf90 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54  xpr *pE2, int iT
2bfa0 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  ab){.  if( sqlit
2bfb0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
2bfc0 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2c 20  arse, pE1, pE2, 
2bfd0 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iTab)==0 ){.    
2bfe0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2bff0 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
2c000 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65  OR.   && (sqlite
2c010 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
2c020 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45  (pParse, pE1, pE
2c030 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a  2->pLeft, iTab).
2c040 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2c050 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
2c060 65 73 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  esExpr(pParse, p
2c070 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c  E1, pE2->pRight,
2c080 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20   iTab) ).  ){.  
2c090 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2c0a0 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54    if( pE2->op==T
2c0b0 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20  K_NOTNULL.   && 
2c0c0 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75  exprImpliesNotNu
2c0d0 6c 6c 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20  ll(pParse, pE1, 
2c0e0 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
2c0f0 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  , 0).  ){.    re
2c100 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2c110 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2c120 20 54 68 69 73 20 69 73 20 74 68 65 20 45 78 70   This is the Exp
2c130 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20  r node callback 
2c140 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72 49  for sqlite3ExprI
2c150 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77  mpliesNotNullRow
2c160 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ()..** If the ex
2c170 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
2c180 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65 20  quires that the 
2c190 74 61 62 6c 65 20 61 74 20 70 57 61 6c 6b 65 72  table at pWalker
2c1a0 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65 20 6f  ->iCur.** have o
2c1b0 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 6f 6e 2d 4e  ne or more non-N
2c1c0 55 4c 4c 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  ULL column, then
2c1d0 20 73 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43   set pWalker->eC
2c1e0 6f 64 65 20 74 6f 20 31 20 61 6e 64 20 61 62 6f  ode to 1 and abo
2c1f0 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  rt..**.** This r
2c200 6f 75 74 69 6e 65 20 63 6f 6e 74 72 6f 6c 73 20  outine controls 
2c210 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
2c220 20 20 46 61 6c 73 65 20 70 6f 73 69 74 69 76 65    False positive
2c230 73 20 28 73 65 74 74 69 6e 67 0a 2a 2a 20 70 57  s (setting.** pW
2c240 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20  alker->eCode to 
2c250 31 20 77 68 65 6e 20 69 74 20 73 68 6f 75 6c 64  1 when it should
2c260 20 6e 6f 74 20 62 65 29 20 61 72 65 20 64 65 61   not be) are dea
2c270 64 6c 79 2c 20 62 75 74 20 66 61 6c 73 65 2d 6e  dly, but false-n
2c280 65 67 61 74 69 76 65 73 0a 2a 2a 20 28 6e 65 76  egatives.** (nev
2c290 65 72 20 73 65 74 74 69 6e 67 20 70 57 61 6c 6b  er setting pWalk
2c2a0 65 72 2d 3e 65 43 6f 64 65 29 20 69 73 20 61 20  er->eCode) is a 
2c2b0 68 61 72 6d 6c 65 73 73 20 6d 69 73 73 65 64 20  harmless missed 
2c2c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f  optimization..*/
2c2d0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6d 70 6c  .static int impl
2c2e0 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57 61  iesNotNullRow(Wa
2c2f0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2c300 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 74  xpr *pExpr){.  t
2c310 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2c320 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
2c330 4e 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  N );.  testcase(
2c340 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
2c350 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
2c360 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
2c370 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
2c380 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
2c390 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 73  n WRC_Prune;.  s
2c3a0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
2c3b0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
2c3c0 49 53 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ISNOT:.    case 
2c3d0 54 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  TK_NOT:.    case
2c3e0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
2c3f0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
2c400 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
2c410 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
2c420 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
2c430 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  E:.    case TK_I
2c440 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  N:.    case TK_F
2c450 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 74  UNCTION:.      t
2c460 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2c470 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
2c480 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c490 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  pExpr->op==TK_NO
2c4a0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
2c4b0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2c4c0 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
2c4d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2c4e0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  pr->op==TK_NOTNU
2c4f0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
2c500 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2c510 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
2c520 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2c530 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20  >op==TK_OR );.  
2c540 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2c550 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53 45  xpr->op==TK_CASE
2c560 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2c570 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2c580 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IN );.      te
2c590 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c5a0 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
2c5b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
2c5c0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 63 61  RC_Prune;.    ca
2c5d0 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
2c5e0 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
2c5f0 3e 75 2e 69 43 75 72 3d 3d 70 45 78 70 72 2d 3e  >u.iCur==pExpr->
2c600 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
2c610 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2c620 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
2c630 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2c640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2c650 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2c660 0a 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20  .    /* Virtual 
2c670 74 61 62 6c 65 73 20 61 72 65 20 61 6c 6c 6f 77  tables are allow
2c680 65 64 20 74 6f 20 75 73 65 20 63 6f 6e 73 74 72  ed to use constr
2c690 61 69 6e 74 73 20 6c 69 6b 65 20 78 3d 4e 55 4c  aints like x=NUL
2c6a0 4c 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 61 20  L.  So.    ** a 
2c6b0 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
2c6c0 20 78 3d 79 20 64 6f 65 73 20 6e 6f 74 20 70 72   x=y does not pr
2c6d0 6f 76 65 20 74 68 61 74 20 79 20 69 73 20 6e 6f  ove that y is no
2c6e0 74 20 6e 75 6c 6c 20 69 66 20 78 0a 20 20 20 20  t null if x.    
2c6f0 2a 2a 20 69 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ** is the column
2c700 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61   of a virtual ta
2c710 62 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ble */.    case 
2c720 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65 20  TK_EQ:.    case 
2c730 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
2c740 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
2c750 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
2c760 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
2c770 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20 74 65 73  TK_GE:.      tes
2c780 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2c790 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==TK_EQ );.     
2c7a0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2c7b0 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ->op==TK_NE );. 
2c7c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2c7d0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
2c7e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2c7f0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2c800 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LE );.      tes
2c810 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2c820 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
2c830 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2c840 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op==TK_GE );. 
2c850 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d       if( (pExpr-
2c860 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  >pLeft->op==TK_C
2c870 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 72 74 75  OLUMN && IsVirtu
2c880 61 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  al(pExpr->pLeft-
2c890 3e 79 2e 70 54 61 62 29 29 0a 20 20 20 20 20 20  >y.pTab)).      
2c8a0 20 7c 7c 20 28 70 45 78 70 72 2d 3e 70 52 69 67   || (pExpr->pRig
2c8b0 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
2c8c0 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70  N && IsVirtual(p
2c8d0 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 79 2e  Expr->pRight->y.
2c8e0 70 54 61 62 29 29 0a 20 20 20 20 20 20 29 7b 0a  pTab)).      ){.
2c8f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2c900 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
2c910 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
2c920 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
2c930 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a  ontinue;.  }.}..
2c940 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
2c950 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  e (non-zero) if 
2c960 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 61 6e  expression p can
2c970 20 6f 6e 6c 79 20 62 65 20 74 72 75 65 20 69 66   only be true if
2c980 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65   at least.** one
2c990 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
2c9a0 20 69 54 61 62 20 69 73 20 6e 6f 6e 2d 6e 75 6c   iTab is non-nul
2c9b0 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  l.  In other wor
2c9c0 64 73 2c 20 72 65 74 75 72 6e 20 74 72 75 65 0a  ds, return true.
2c9d0 2a 2a 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e  ** if expression
2c9e0 20 70 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62   p will always b
2c9f0 65 20 4e 55 4c 4c 20 6f 72 20 66 61 6c 73 65 20  e NULL or false 
2ca00 69 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  if every column 
2ca10 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55  of iTab.** is NU
2ca20 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20  LL..**.** False 
2ca30 6e 65 67 61 74 69 76 65 73 20 61 72 65 20 61 63  negatives are ac
2ca40 63 65 70 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74  ceptable.  In ot
2ca50 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 69 73  her words, it is
2ca60 20 6f 6b 20 74 6f 20 72 65 74 75 72 6e 0a 2a 2a   ok to return.**
2ca70 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 65 78   zero even if ex
2ca80 70 72 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20  pression p will 
2ca90 6e 65 76 65 72 20 62 65 20 74 72 75 65 20 6f 66  never be true of
2caa0 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66   every column of
2cab0 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c   iTab.** is NULL
2cac0 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74  .  A false negat
2cad0 69 76 65 20 69 73 20 6d 65 72 65 6c 79 20 61 20  ive is merely a 
2cae0 6d 69 73 73 65 64 20 6f 70 74 69 6d 69 7a 61 74  missed optimizat
2caf0 69 6f 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e  ion opportunity.
2cb00 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 70 6f 73  .**.** False pos
2cb10 69 74 69 76 65 73 20 61 72 65 20 6e 6f 74 20 61  itives are not a
2cb20 6c 6c 6f 77 65 64 2c 20 68 6f 77 65 76 65 72 2e  llowed, however.
2cb30 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69    A false positi
2cb40 76 65 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a  ve may result.**
2cb50 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74   in an incorrect
2cb60 20 61 6e 73 77 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   answer..**.** T
2cb70 65 72 6d 73 20 6f 66 20 70 20 74 68 61 74 20 61  erms of p that a
2cb80 72 65 20 6d 61 72 6b 65 64 20 77 69 74 68 20 45  re marked with E
2cb90 50 5f 46 72 6f 6d 4a 6f 69 6e 20 28 61 6e 64 20  P_FromJoin (and 
2cba0 68 65 6e 63 65 20 74 68 61 74 20 63 6f 6d 65 20  hence that come 
2cbb0 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 4f 4e 20 6f  from.** the ON o
2cbc0 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
2cbd0 6f 66 20 4c 45 46 54 20 4a 4f 49 4e 53 29 20 61  of LEFT JOINS) a
2cbe0 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
2cbf0 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 0a 2a   the analysis..*
2cc00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2cc10 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
2cc20 63 6b 20 69 66 20 61 20 4c 45 46 54 20 4a 4f 49  ck if a LEFT JOI
2cc30 4e 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72 74  N can be convert
2cc40 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f 72  ed into.** an or
2cc50 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 20 20 54 68  dinary JOIN.  Th
2cc60 65 20 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20  e p argument is 
2cc70 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2cc80 2e 20 20 49 66 20 74 68 65 20 57 48 45 52 45 0a  .  If the WHERE.
2cc90 2a 2a 20 63 6c 61 75 73 65 20 72 65 71 75 69 72  ** clause requir
2cca0 65 73 20 74 68 61 74 20 73 6f 6d 65 20 63 6f 6c  es that some col
2ccb0 75 6d 6e 20 6f 66 20 74 68 65 20 72 69 67 68 74  umn of the right
2ccc0 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 4c 45   table of the LE
2ccd0 46 54 20 4a 4f 49 4e 0a 2a 2a 20 62 65 20 6e 6f  FT JOIN.** be no
2cce0 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  n-NULL, then the
2ccf0 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62   LEFT JOIN can b
2cd00 65 20 73 61 66 65 6c 79 20 63 6f 6e 76 65 72 74  e safely convert
2cd10 65 64 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 6f 72  ed into an.** or
2cd20 64 69 6e 61 72 79 20 6a 6f 69 6e 2e 0a 2a 2f 0a  dinary join..*/.
2cd30 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
2cd40 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77  mpliesNonNullRow
2cd50 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54  (Expr *p, int iT
2cd60 61 62 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ab){.  Walker w;
2cd70 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
2cd80 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64  prSkipCollateAnd
2cd90 4c 69 6b 65 6c 79 28 70 29 3b 0a 20 20 77 68 69  Likely(p);.  whi
2cda0 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
2cdb0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55   p->op==TK_NOTNU
2cdc0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  LL ){.      p = 
2cdd0 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 7d 65  p->pLeft;.    }e
2cde0 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  lse if( p->op==T
2cdf0 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 69  K_AND ){.      i
2ce00 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  f( sqlite3ExprIm
2ce10 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28  pliesNonNullRow(
2ce20 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20  p->pLeft, iTab) 
2ce30 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
2ce40 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
2ce50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ce60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2ce70 20 7d 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c   }.  w.xExprCall
2ce80 62 61 63 6b 20 3d 20 69 6d 70 6c 69 65 73 4e 6f  back = impliesNo
2ce90 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77 2e 78 53  tNullRow;.  w.xS
2cea0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2ceb0 30 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  0;.  w.xSelectCa
2cec0 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77  llback2 = 0;.  w
2ced0 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 77 2e  .eCode = 0;.  w.
2cee0 75 2e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20  u.iCur = iTab;. 
2cef0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2cf00 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
2cf10 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
2cf20 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2cf30 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2cf40 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
2cf50 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77  ed by the tree w
2cf60 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65  alker.** to dete
2cf70 72 6d 69 6e 65 20 69 66 20 61 6e 20 65 78 70 72  rmine if an expr
2cf80 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 65 76  ession can be ev
2cf90 61 6c 75 61 74 65 64 20 62 79 20 72 65 66 65 72  aluated by refer
2cfa0 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69  ence to the.** i
2cfb0 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f  ndex only, witho
2cfc0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 20  ut having to do 
2cfd0 61 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  a search for the
2cfe0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
2cff0 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 20  * table entry.  
2d000 54 68 65 20 49 64 78 43 6f 76 65 72 2e 70 49 64  The IdxCover.pId
2d010 78 20 66 69 65 6c 64 20 69 73 20 74 68 65 20 69  x field is the i
2d020 6e 64 65 78 2e 20 20 49 64 78 43 6f 76 65 72 2e  ndex.  IdxCover.
2d030 69 43 75 72 0a 2a 2a 20 69 73 20 74 68 65 20 63  iCur.** is the c
2d040 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61  ursor for the ta
2d050 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49  ble..*/.struct I
2d060 64 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65  dxCover {.  Inde
2d070 78 20 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a 20  x *pIdx;     /* 
2d080 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
2d090 74 65 73 74 65 64 20 66 6f 72 20 63 6f 76 65 72  tested for cover
2d0a0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  age */.  int iCu
2d0b0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  r;        /* Cur
2d0c0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
2d0d0 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
2d0e0 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
2d0f0 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  dex */.};../*.**
2d100 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2d110 20 74 68 65 72 65 20 61 72 65 20 72 65 66 65 72   there are refer
2d120 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2d130 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57   in table .** pW
2d140 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76  alker->u.pIdxCov
2d150 65 72 2d 3e 69 43 75 72 20 63 61 6e 20 62 65 20  er->iCur can be 
2d160 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
2d170 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61  the index.** pWa
2d180 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2d190 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  r->pIdx..*/.stat
2d1a0 69 63 20 69 6e 74 20 65 78 70 72 49 64 78 43 6f  ic int exprIdxCo
2d1b0 76 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ver(Walker *pWal
2d1c0 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
2d1d0 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  ){.  if( pExpr->
2d1e0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
2d1f0 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
2d200 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  e==pWalker->u.pI
2d210 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20  dxCover->iCur.  
2d220 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d   && sqlite3Colum
2d230 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b 65 72  nOfIndex(pWalker
2d240 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70  ->u.pIdxCover->p
2d250 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  Idx, pExpr->iCol
2d260 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20  umn)<0.  ){.    
2d270 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
2d280 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   1;.    return W
2d290 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
2d2a0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2d2b0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  nue;.}../*.** De
2d2c0 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e  termine if an in
2d2d0 64 65 78 20 70 49 64 78 20 6f 6e 20 74 61 62 6c  dex pIdx on tabl
2d2e0 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43  e with cursor iC
2d2f0 75 72 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c  ur contains will
2d300 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
2d310 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 74 75 72  on pExpr.  Retur
2d320 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 6e  n true if the in
2d330 64 65 78 20 64 6f 65 73 20 63 6f 76 65 72 20 74  dex does cover t
2d340 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2d350 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
2d360 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69  e pExpr expressi
2d370 6f 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74 61  on references ta
2d380 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74  ble columns.** t
2d390 68 61 74 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e  hat are not foun
2d3a0 64 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70  d in the index p
2d3b0 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  Idx..**.** An in
2d3c0 64 65 78 20 63 6f 76 65 72 69 6e 67 20 61 6e 20  dex covering an 
2d3d0 65 78 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73  expression means
2d3e0 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
2d3f0 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65  sion can be.** e
2d400 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6f  valuated using o
2d410 6e 6c 79 20 74 68 65 20 69 6e 64 65 78 20 61 6e  nly the index an
2d420 64 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  d without having
2d430 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a   to lookup the.*
2d440 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
2d450 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a  table entry..*/.
2d460 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
2d470 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28 0a 20  overedByIndex(. 
2d480 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
2d490 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2d4a0 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 2a  x to be tested *
2d4b0 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
2d4c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2d4d0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
2d4e0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2d4f0 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e  ng table */.  In
2d500 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2d510 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
2d520 68 61 74 20 6d 69 67 68 74 20 62 65 20 75 73 65  hat might be use
2d530 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a  d for coverage *
2d540 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  /.){.  Walker w;
2d550 0a 20 20 73 74 72 75 63 74 20 49 64 78 43 6f 76  .  struct IdxCov
2d560 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65  er xcov;.  memse
2d570 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
2d580 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72  w));.  xcov.iCur
2d590 20 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e   = iCur;.  xcov.
2d5a0 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 77  pIdx = pIdx;.  w
2d5b0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2d5c0 20 65 78 70 72 49 64 78 43 6f 76 65 72 3b 0a 20   exprIdxCover;. 
2d5d0 20 77 2e 75 2e 70 49 64 78 43 6f 76 65 72 20 3d   w.u.pIdxCover =
2d5e0 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65   &xcov;.  sqlite
2d5f0 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45  3WalkExpr(&w, pE
2d600 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 21  xpr);.  return !
2d610 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  w.eCode;.}.../*.
2d620 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
2d630 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2d640 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
2d650 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61  d by the tree wa
2d660 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74  lker.** to count
2d670 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
2d680 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  able columns in 
2d690 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66  the arguments of
2d6a0 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74   an .** aggregat
2d6b0 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f  e function, in o
2d6c0 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  rder to implemen
2d6d0 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  t the.** sqlite3
2d6e0 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28  FunctionThisSrc(
2d6f0 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
2d700 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a  ruct SrcCount {.
2d710 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
2d720 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63     /* One partic
2d730 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ular FROM clause
2d740 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65   in a nested que
2d750 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69  ry */.  int nThi
2d760 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
2d770 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
2d780 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70   to columns in p
2d790 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  SrcList */.  int
2d7a0 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a   nOther;      /*
2d7b0 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
2d7c0 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2d7d0 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63   in other FROM c
2d7e0 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lauses */.};../*
2d7f0 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
2d800 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2d810 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  es to columns..*
2d820 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
2d830 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72  rSrcCount(Walker
2d840 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2d850 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68  *pExpr){.  /* Th
2d860 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65  e NEVER() on the
2d870 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20   second term is 
2d880 62 65 63 61 75 73 65 20 73 71 6c 69 74 65 33 46  because sqlite3F
2d890 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
2d8a0 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77  rc().  ** is alw
2d8b0 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72  ays called befor
2d8c0 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
2d8d0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
2d8e0 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a   and so the.  **
2d8f0 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65   TK_COLUMNs have
2d900 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f   not yet been co
2d910 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f  nverted into TK_
2d920 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a  AGG_COLUMN.  If.
2d930 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63    ** sqlite3Func
2d940 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
2d950 29 20 69 73 20 75 73 65 64 20 64 69 66 66 65 72  ) is used differ
2d960 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74  ently in the fut
2d970 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45  ure, the.  ** NE
2d980 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20  VER() will need 
2d990 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a  to be removed. *
2d9a0 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
2d9b0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
2d9c0 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d  NEVER(pExpr->op=
2d9d0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20  =TK_AGG_COLUMN) 
2d9e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2d9f0 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e    struct SrcCoun
2da00 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  t *p = pWalker->
2da10 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20  u.pSrcCount;.   
2da20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
2da30 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e   p->pSrc;.    in
2da40 74 20 6e 53 72 63 20 3d 20 70 53 72 63 20 3f 20  t nSrc = pSrc ? 
2da50 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a  pSrc->nSrc : 0;.
2da60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2da70 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
2da80 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
2da90 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  le==pSrc->a[i].i
2daa0 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
2dab0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
2dac0 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d  nSrc ){.      p-
2dad0 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65  >nThis++;.    }e
2dae0 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  lse{.      p->nO
2daf0 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ther++;.    }.  
2db00 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2db10 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2db20 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
2db30 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ny of the argume
2db40 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70 72  nts to the pExpr
2db50 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65   Function refere
2db60 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e  nce.** pSrcList.
2db70 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
2db80 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20   they do.  Also 
2db90 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  return true if t
2dba0 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  he function.** h
2dbb0 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  as no arguments 
2dbc0 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73  or has only cons
2dbd0 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
2dbe0 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
2dbf0 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65   pExpr.** refere
2dc00 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74  nces columns but
2dc10 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   not columns of 
2dc20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20  tables found in 
2dc30 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74  pSrcList..*/.int
2dc40 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
2dc50 55 73 65 73 54 68 69 73 53 72 63 28 45 78 70 72  UsesThisSrc(Expr
2dc60 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74   *pExpr, SrcList
2dc70 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57   *pSrcList){.  W
2dc80 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63  alker w;.  struc
2dc90 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a  t SrcCount cnt;.
2dca0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
2dcb0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
2dcc0 54 49 4f 4e 20 29 3b 0a 20 20 77 2e 78 45 78 70  TION );.  w.xExp
2dcd0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
2dce0 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 78 53  SrcCount;.  w.xS
2dcf0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2dd00 30 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75  0;.  w.u.pSrcCou
2dd10 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74  nt = &cnt;.  cnt
2dd20 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74  .pSrc = pSrcList
2dd30 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20  ;.  cnt.nThis = 
2dd40 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20  0;.  cnt.nOther 
2dd50 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  = 0;.  sqlite3Wa
2dd60 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70  lkExprList(&w, p
2dd70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
2dd80 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68    return cnt.nTh
2dd90 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68  is>0 || cnt.nOth
2dda0 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  er==0;.}../*.** 
2ddb0 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
2ddc0 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
2ddd0 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  o->aCol[] array.
2dde0 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
2ddf0 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
2de00 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
2de10 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
2de20 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
2de30 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2de40 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c  nt addAggInfoCol
2de50 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  umn(sqlite3 *db,
2de60 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
2de70 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
2de80 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74  fo->aCol = sqlit
2de90 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
2dea0 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  .       db,.    
2deb0 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a     pInfo->aCol,.
2dec0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
2ded0 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20  nfo->aCol[0]),. 
2dee0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
2def0 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69  olumn,.       &i
2df00 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
2df10 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41  ;.}    ../*.** A
2df20 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
2df30 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
2df40 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e  ->aFunc[] array.
2df50 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
2df60 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
2df70 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
2df80 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
2df90 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
2dfa0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2dfb0 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e  nt addAggInfoFun
2dfc0 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  c(sqlite3 *db, A
2dfd0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
2dfe0 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
2dff0 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
2e000 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
2e010 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20         db, .    
2e020 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c     pInfo->aFunc,
2e030 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
2e040 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c  Info->aFunc[0]),
2e050 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
2e060 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69  nFunc,.       &i
2e070 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
2e080 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  ;.}    ../*.** T
2e090 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72  his is the xExpr
2e0a0 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74  Callback for a t
2e0b0 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20  ree walker.  It 
2e0c0 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d  is used to.** im
2e0d0 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45  plement sqlite3E
2e0e0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2e0f0 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c  ates().  See sql
2e100 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2e110 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72  ggregates.** for
2e120 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2e130 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
2e140 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
2e150 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a  gregate(Walker *
2e160 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2e170 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
2e180 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
2e190 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  NC = pWalker->u.
2e1a0 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pNC;.  Parse *pP
2e1b0 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
2e1c0 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
2e1d0 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
2e1e0 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
2e1f0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
2e200 4e 43 2d 3e 75 4e 43 2e 70 41 67 67 49 6e 66 6f  NC->uNC.pAggInfo
2e210 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  ;..  assert( pNC
2e220 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 55  ->ncFlags & NC_U
2e230 41 67 67 49 6e 66 6f 20 29 3b 0a 20 20 73 77 69  AggInfo );.  swi
2e240 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
2e250 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
2e260 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
2e270 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
2e280 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2e290 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
2e2a0 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
2e2b0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2e2c0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2e2d0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65   );.      /* Che
2e2e0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
2e2f0 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e   column is in on
2e300 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
2e310 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20  in the FROM.    
2e320 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
2e330 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
2e340 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ry */.      if( 
2e350 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21  ALWAYS(pSrcList!
2e360 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =0) ){.        s
2e370 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2e380 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
2e390 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
2e3a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
2e3b0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
2e3c0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2e3d0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2e3e0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
2e3f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2e400 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2e410 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
2e420 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
2e430 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
2e440 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
2e450 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
2e460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e470 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
2e480 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
2e490 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
2e4a0 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
2e4b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2e4c0 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
2e4d0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
2e4e0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
2e4f0 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
2e500 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
2e510 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
2e520 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
2e530 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
2e540 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
2e550 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
2e560 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
2e570 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
2e580 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2e590 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
2e5a0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
2e5b0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
2e5c0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2e5d0 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
2e5e0 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
2e5f0 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
2e600 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
2e610 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
2e620 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
2e630 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2e640 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
2e650 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
2e660 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2e670 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2e680 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2e690 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2e6a0 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e   (k>=pAggInfo->n
2e6b0 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20  Column).        
2e6c0 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64       && (k = add
2e6d0 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50  AggInfoColumn(pP
2e6e0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
2e6f0 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  fo))>=0 .       
2e700 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2e710 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41        pCol = &pA
2e720 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b  ggInfo->aCol[k];
2e730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2e740 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70  Col->pTab = pExp
2e750 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20  r->y.pTab;.     
2e760 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2e770 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
2e780 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
2e790 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
2e7a0 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
2e7b0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
2e7c0 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
2e7d0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2e7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2e7f0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2e800 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2e810 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
2e820 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
2e830 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
2e840 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
2e850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e860 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
2e870 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
2e880 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
2e890 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
2e8a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e8b0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2e8c0 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
2e8d0 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
2e8e0 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
2e8f0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
2e900 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2e910 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
2e920 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2e930 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2e940 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
2e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e960 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
2e970 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
2e980 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
2e990 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
2e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
2e9b0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
2e9c0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
2e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9e0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2e9f0 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
2ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2ea10 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2ea20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ea30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ea40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ea50 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
2ea60 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
2ea70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2ea80 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
2ea90 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
2eaa0 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
2eab0 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
2eac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ead0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2eae0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
2eaf0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
2eb00 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
2eb10 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
2eb20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
2eb30 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
2eb40 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
2eb50 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
2eb60 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
2eb70 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
2eb80 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
2eb90 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
2eba0 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
2ebb0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
2ebc0 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
2ebd0 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
2ebe0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2ebf0 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
2ec00 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2ec10 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2ec20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2ec30 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
2ec40 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
2ec50 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
2ec60 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
2ec70 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2ec80 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20  iAgg = (i16)k;. 
2ec90 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2eca0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
2ecb0 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
2ecc0 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
2ecd0 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
2ece0 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
2ecf0 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
2ed00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2ed10 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2ed20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
2ed30 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
2ed40 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d  .      if( (pNC-
2ed50 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e  >ncFlags & NC_In
2ed60 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20  AggFunc)==0.    
2ed70 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77     && pWalker->w
2ed80 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70  alkerDepth==pExp
2ed90 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a  r->op2.      ){.
2eda0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2edb0 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
2edc0 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
2edd0 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
2ede0 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
2edf0 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
2ee00 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2ee10 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
2ee20 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
2ee30 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2ee40 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
2ee50 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
2ee60 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
2ee70 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2ee80 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
2ee90 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2eea0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2eeb0 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 49 74 65  rCompare(0, pIte
2eec0 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c  m->pExpr, pExpr,
2eed0 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
2eee0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2eef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ef00 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2ef10 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  i>=pAggInfo->nFu
2ef20 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
2ef30 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67  /* pExpr is orig
2ef40 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65  inal.  Make a ne
2ef50 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49  w entry in pAggI
2ef60 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20  nfo->aFunc[].   
2ef70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2ef80 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
2ef90 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
2efa0 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41          i = addA
2efb0 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73  ggInfoFunc(pPars
2efc0 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
2efd0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2efe0 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
2eff0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2f000 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2f010 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2f020 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
2f030 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
2f040 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
2f050 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2f060 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
2f070 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2f080 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  m->iMem = ++pPar
2f090 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2f0a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2f0b0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2f0c0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
2f0d0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2f0e0 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
2f0f0 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
2f100 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
2f110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f120 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
2f130 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ken, .          
2f140 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2f150 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  x.pList ? pExpr-
2f160 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
2f170 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  : 0, enc, 0);.  
2f180 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2f190 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
2f1a0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2f1b0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2f1c0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  >iDistinct = pPa
2f1d0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2f1e0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2f1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2f200 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
2f210 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
2f220 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2f230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f240 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70   /* Make pExpr p
2f250 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72  oint to the appr
2f260 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f  opriate pAggInfo
2f270 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a  ->aFunc[] entry.
2f280 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f290 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2f2a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2f2b0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
2f2c0 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2f2d0 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56         ExprSetVV
2f2e0 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
2f2f0 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2f300 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
2f310 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20  gg = (i16)i;.   
2f320 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
2f330 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
2f340 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f350 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
2f360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f370 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2f380 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2f390 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2f3a0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2f3b0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
2f3c0 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2f3d0 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  lect(Walker *pWa
2f3e0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
2f3f0 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44  elect){.  UNUSED
2f400 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65  _PARAMETER(pSele
2f410 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ct);.  pWalker->
2f420 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b 0a 20  walkerDepth++;. 
2f430 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2f440 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76  inue;.}.static v
2f450 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  oid analyzeAggre
2f460 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64  gatesInSelectEnd
2f470 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2f480 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
2f490 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
2f4a0 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b  AMETER(pSelect);
2f4b0 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  .  pWalker->walk
2f4c0 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a  erDepth--;.}../*
2f4d0 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
2f4e0 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
2f4f0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
2f500 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
2f510 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
2f520 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
2f530 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41  to be added to A
2f540 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  ggInfo object th
2f550 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f  at pNC->pAggInfo
2f560 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  .** points to.  
2f570 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  Additional entri
2f580 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74  es are made on t
2f590 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  he AggInfo objec
2f5a0 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72  t as.** necessar
2f5b0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2f5c0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2f5d0 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
2f5e0 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
2f5f0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61   has been.** ana
2f600 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lyzed by sqlite3
2f610 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
2f620 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
2f630 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2f640 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
2f650 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
2f660 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
2f670 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
2f680 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
2f690 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
2f6a0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
2f6b0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2f6c0 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
2f6d0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2f6e0 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2f6f0 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 3b  atesInSelectEnd;
2f700 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68  .  w.walkerDepth
2f710 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20   = 0;.  w.u.pNC 
2f720 3d 20 70 4e 43 3b 0a 20 20 77 2e 70 50 61 72 73  = pNC;.  w.pPars
2f730 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  e = 0;.  assert(
2f740 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
2f750 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  0 );.  sqlite3Wa
2f760 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
2f770 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  );.}../*.** Call
2f780 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2f790 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
2f7a0 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
2f7b0 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
2f7c0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
2f7d0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2f7e0 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
2f7f0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
2f800 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
2f810 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
2f820 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
2f830 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2f840 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78  gList(NameContex
2f850 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74  t *pNC, ExprList
2f860 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75   *pList){.  stru
2f870 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2f880 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
2f890 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
2f8a0 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
2f8b0 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
2f8c0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
2f8d0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2f8e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2f8f0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2f900 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
2f910 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
2f920 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2f930 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67  a single new reg
2f940 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f  ister for use to
2f950 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72   hold some inter
2f960 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a  mediate result..
2f970 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
2f980 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  tTempReg(Parse *
2f990 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
2f9a0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d  Parse->nTempReg=
2f9b0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2f9c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2f9d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
2f9e0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d  arse->aTempReg[-
2f9f0 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  -pParse->nTempRe
2fa00 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  g];.}../*.** Dea
2fa10 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74  llocate a regist
2fa20 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c  er, making avail
2fa30 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66  able for reuse f
2fa40 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
2fa50 20 70 75 72 70 6f 73 65 2e 0a 2a 2f 0a 76 6f 69   purpose..*/.voi
2fa60 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2fa70 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
2fa80 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
2fa90 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20  {.  if( iReg && 
2faa0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2fab0 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
2fac0 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
2fad0 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
2fae0 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
2faf0 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
2fb00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
2fb10 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
2fb20 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
2fb30 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
2fb40 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69   registers..*/.i
2fb50 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
2fb60 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
2fb70 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
2fb80 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
2fb90 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74  f( nReg==1 ) ret
2fba0 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65  urn sqlite3GetTe
2fbb0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
2fbc0 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61   i = pParse->iRa
2fbd0 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50  ngeReg;.  n = pP
2fbe0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b  arse->nRangeReg;
2fbf0 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29  .  if( nReg<=n )
2fc00 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  {.    pParse->iR
2fc10 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b  angeReg += nReg;
2fc20 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
2fc30 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a  ngeReg -= nReg;.
2fc40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d    }else{.    i =
2fc50 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
2fc60 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
2fc70 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20  m += nReg;.  }. 
2fc80 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69   return i;.}.voi
2fc90 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2fca0 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
2fcb0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
2fcc0 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
2fcd0 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
2fce0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2fcf0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2fd00 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75   iReg);.    retu
2fd10 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  rn;.  }.  if( nR
2fd20 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg>pParse->nRang
2fd30 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72  eReg ){.    pPar
2fd40 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
2fd50 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
2fd60 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52  ->iRangeReg = iR
2fd70 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
2fd80 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72   Mark all tempor
2fd90 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73  ary registers as
2fda0 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62   being unavailab
2fdb0 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  le for reuse..*/
2fdc0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65  .void sqlite3Cle
2fdd0 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50  arTempRegCache(P
2fde0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
2fdf0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2fe00 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  g = 0;.  pParse-
2fe10 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a  >nRangeReg = 0;.
2fe20 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74  }../*.** Validat
2fe30 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72  e that no tempor
2fe40 61 72 79 20 72 65 67 69 73 74 65 72 20 66 61 6c  ary register fal
2fe50 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 72 61  ls within the ra
2fe60 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74  nge of.** iFirst
2fe70 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69  ..iLast, inclusi
2fe80 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ve.  This routin
2fe90 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66  e is only call f
2fea0 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72  rom within asser
2feb0 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
2fec0 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
2fed0 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71  ITE_DEBUG.int sq
2fee0 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61  lite3NoTempsInRa
2fef0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
2ff00 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69  e, int iFirst, i
2ff10 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74  nt iLast){.  int
2ff20 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   i;.  if( pParse
2ff30 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20  ->nRangeReg>0.  
2ff40 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e   && pParse->iRan
2ff50 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52  geReg+pParse->nR
2ff60 61 6e 67 65 52 65 67 20 3e 20 69 46 69 72 73 74  angeReg > iFirst
2ff70 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
2ff80 52 61 6e 67 65 52 65 67 20 3c 3d 20 69 4c 61 73  RangeReg <= iLas
2ff90 74 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75  t.  ){.     retu
2ffa0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
2ffb0 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
2ffc0 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20  TempReg; i++){. 
2ffd0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
2ffe0 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72  TempReg[i]>=iFir
2fff0 73 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54  st && pParse->aT
30000 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74  empReg[i]<=iLast
30010 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
30020 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
30030 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
30040 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
30050 55 47 20 2a 2f 0a                                UG */.