/ Hex Artifact Content
Login

Artifact 3dba8ac22b89b6af10cff7d672f8cab4a71c7ee75abb4cbc0a6a79d32f752a4a:


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 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a  >affinity;.}../*
0970: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
0980: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
0990: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  or expression pE
09a0: 78 70 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f  xpr to be the co
09b0: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
09c0: 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f  nce named by pTo
09d0: 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20  ken.   Return a 
09e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77  pointer to a new
09f0: 20 45 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a   Expr node that.
0a00: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
0a10: 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  e COLLATE operat
0a20: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  or..**.** If a m
0a30: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
0a40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
0a50: 68 61 74 20 66 61 63 74 20 69 73 20 72 65 63 6f  hat fact is reco
0a60: 72 64 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e  rded in pParse->
0a70: 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45  db.** and the pE
0a80: 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  xpr parameter is
0a90: 20 72 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e   returned unchan
0aa0: 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ged..*/.Expr *sq
0ab0: 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
0ac0: 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73  ateToken(.  Pars
0ad0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
0ae0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
0af0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
0b00: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
0b10: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
0b20: 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73   "COLLATE" claus
0b30: 65 20 74 6f 20 74 68 69 73 20 65 78 70 72 65 73  e to this expres
0b40: 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  sion */.  const 
0b50: 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65  Token *pCollName
0b60: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f  ,  /* Name of co
0b70: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0b80: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
0b90: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e              /
0ba0: 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74  * True to dequot
0bb0: 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29  e pCollName */.)
0bc0: 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d  {.  if( pCollNam
0bd0: 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78  e->n>0 ){.    Ex
0be0: 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
0bf0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72  e3ExprAlloc(pPar
0c00: 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41  se->db, TK_COLLA
0c10: 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64  TE, pCollName, d
0c20: 65 71 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28  equote);.    if(
0c30: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70   pNew ){.      p
0c40: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78  New->pLeft = pEx
0c50: 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pr;.      pNew->
0c60: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c  flags |= EP_Coll
0c70: 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20  ate|EP_Skip;.   
0c80: 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b     pExpr = pNew;
0c90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0ca0: 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70  urn pExpr;.}.Exp
0cb0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64  r *sqlite3ExprAd
0cc0: 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50  dCollateString(P
0cd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
0ce0: 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74  pr *pExpr, const
0cf0: 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f   char *zC){.  To
0d00: 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28  ken s;.  assert(
0d10: 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69   zC!=0 );.  sqli
0d20: 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c  te3TokenInit(&s,
0d30: 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72   (char*)zC);.  r
0d40: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0d50: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
0d60: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
0d70: 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &s, 0);.}../*.**
0d80: 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54   Skip over any T
0d90: 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  K_COLLATE operat
0da0: 6f 72 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69  ors and any unli
0db0: 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b  kely().** or lik
0dc0: 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69  elihood() functi
0dd0: 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f  on at the root o
0de0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  f an expression.
0df0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
0e00: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
0e10: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
0e20: 20 77 68 69 6c 65 28 20 70 45 78 70 72 20 26 26   while( pExpr &&
0e30: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
0e40: 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 7c  (pExpr, EP_Skip|
0e50: 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a  EP_Unlikely) ){.
0e60: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
0e70: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
0e80: 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20  P_Unlikely) ){. 
0e90: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
0ea0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0eb0: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
0ec0: 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  t) );.      asse
0ed0: 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  rt( pExpr->x.pLi
0ee0: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
0ef0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
0f00: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pr->op==TK_FUNCT
0f10: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ION );.      pEx
0f20: 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  pr = pExpr->x.pL
0f30: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
0f40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
0f50: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0f60: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
0f70: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  );.      pExpr =
0f80: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
0f90: 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65     }.  }   .  re
0fa0: 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f  turn pExpr;.}../
0fb0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0fc0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
0fd0: 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ce for the expre
0fe0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a  ssion pExpr. If.
0ff0: 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  ** there is no d
1000: 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  efined collating
1010: 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72   sequence, retur
1020: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  n NULL..**.** Se
1030: 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 45  e also: sqlite3E
1040: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29 0a 2a  xprNNCollSeq().*
1050: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
1060: 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29 20  ExprNNCollSeq() 
1070: 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 65  works the same e
1080: 78 61 63 74 20 74 68 61 74 20 69 74 20 72 65 74  xact that it ret
1090: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65 66 61  urns the.** defa
10a0: 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 66  ult collation if
10b0: 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20 64 65   pExpr has no de
10c0: 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 2e  fined collation.
10d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
10e0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 69  ting sequence mi
10f0: 67 68 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65  ght be determine
1100: 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f  d by a COLLATE o
1110: 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20 62 79  perator.** or by
1120: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
1130: 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61   a column with a
1140: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
1150: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20  ng sequence..** 
1160: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
1170: 73 20 74 61 6b 65 20 66 69 72 73 74 20 70 72 65  s take first pre
1180: 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74 20 6f  cedence.  Left o
1190: 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a 2a 20  perands take.** 
11a0: 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20  precedence over 
11b0: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73 2e 0a  right operands..
11c0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
11d0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50  te3ExprCollSeq(P
11e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
11f0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71  pr *pExpr){.  sq
1200: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1210: 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c 53 65  se->db;.  CollSe
1220: 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
1230: 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70 72 3b  Expr *p = pExpr;
1240: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
1250: 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e 6f     int op = p->o
1260: 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  p;.    if( p->fl
1270: 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72 69 63  ags & EP_Generic
1280: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
1290: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
12a0: 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b  R ) op = p->op2;
12b0: 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b  .    if( (op==TK
12c0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f  _AGG_COLUMN || o
12d0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
12e0: 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a  op==TK_TRIGGER).
12f0: 20 20 20 20 20 26 26 20 70 2d 3e 79 2e 70 54 61       && p->y.pTa
1300: 62 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  b!=0.    ){.    
1310: 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49    /* op==TK_REGI
1320: 53 54 45 52 20 26 26 20 70 2d 3e 79 2e 70 54 61  STER && p->y.pTa
1330: 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65  b!=0 happens whe
1340: 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67  n pExpr was orig
1350: 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  inally.      ** 
1360: 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20  a TK_COLUMN but 
1370: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65  was previously e
1380: 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63  valuated and cac
1390: 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65  hed in a registe
13a0: 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  r */.      int j
13b0: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
13c0: 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b       if( j>=0 ){
13d0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
13e0: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e  har *zColl = p->
13f0: 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  y.pTab->aCol[j].
1400: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
1410: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
1420: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
1430: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
1440: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1450: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1460: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54   if( op==TK_CAST
1470: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   || op==TK_UPLUS
1480: 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d   ){.      p = p-
1490: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63 6f  >pLeft;.      co
14a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
14b0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c    if( op==TK_COL
14c0: 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 70 43  LATE ){.      pC
14d0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
14e0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
14f0: 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75  ENC(db), 0, p->u
1500: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1510: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1520: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
1530: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
1540: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
1550: 20 26 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66   && (p->pLeft->f
1560: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1570: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
1580: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
1590: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15a0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 78 74 20      Expr *pNext 
15b0: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
15c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70        /* The Exp
15d0: 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76  r.x union is nev
15e0: 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20 73  er used at the s
15f0: 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70 72  ame time as Expr
1600: 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  .pRight */.     
1610: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e     assert( p->x.
1620: 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pList==0 || p->p
1630: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
1640: 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20      /* p->flags 
1650: 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65  holds EP_Collate
1660: 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66   and p->pLeft->f
1670: 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20  lags does not.  
1680: 41 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  And.        ** p
1690: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e  ->x.pSelect cann
16a0: 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e  ot.  So if p->x.
16b0: 70 4c 65 66 74 20 65 78 69 73 74 73 2c 20 69 74  pLeft exists, it
16c0: 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 0a 20 20   must hold at.  
16d0: 20 20 20 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f        ** least o
16e0: 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54  ne EP_Collate. T
16f0: 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hus the followin
1700: 67 20 74 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f  g two ALWAYS. */
1710: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1720: 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 41 4c  x.pList!=0 && AL
1730: 57 41 59 53 28 21 45 78 70 72 48 61 73 50 72 6f  WAYS(!ExprHasPro
1740: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
1750: 65 6c 65 63 74 29 29 20 29 7b 0a 20 20 20 20 20  elect)) ){.     
1760: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1770: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 41        for(i=0; A
1780: 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69  LWAYS(i<p->x.pLi
1790: 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29  st->nExpr); i++)
17a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
17b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
17c0: 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  y(p->x.pList->a[
17d0: 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c  i].pExpr, EP_Col
17e0: 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  late) ){.       
17f0: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
1800: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1810: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
1820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1830: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1840: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1850: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
1860: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1870: 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61  else{.      brea
1880: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
1890: 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43  f( sqlite3CheckC
18a0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
18b0: 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43  Coll) ){ .    pC
18c0: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  oll = 0;.  }.  r
18d0: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
18e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1900: 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  nce for the expr
1910: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66  ession pExpr. If
1920: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20  .** there is no 
1930: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
1940: 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75  g sequence, retu
1950: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1960: 74 68 65 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63  the.** defautl c
1970: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1980: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
1990: 6f 3a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  o: sqlite3ExprCo
19a0: 6c 6c 53 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68  llSeq().**.** Th
19b0: 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  e sqlite3ExprCol
19c0: 6c 53 65 71 28 29 20 72 6f 75 74 69 6e 65 20 77  lSeq() routine w
19d0: 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 65 78  orks the same ex
19e0: 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
19f0: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
1a00: 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66 69  there is no defi
1a10: 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a  ned collation..*
1a20: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
1a30: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
1a40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1a50: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43  xpr *pExpr){.  C
1a60: 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 73 71 6c 69  ollSeq *p = sqli
1a70: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1a80: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
1a90: 20 69 66 28 20 70 3d 3d 30 20 29 20 70 20 3d 20   if( p==0 ) p = 
1aa0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
1ab0: 74 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  tColl;.  assert(
1ac0: 20 70 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p!=0 );.  retur
1ad0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
1ae0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1af0: 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
1b00: 20 68 61 76 65 20 65 71 75 69 76 61 6c 65 6e 74   have equivalent
1b10: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1b20: 6e 63 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nces..*/.int sql
1b30: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d  ite3ExprCollSeqM
1b40: 61 74 63 68 28 50 61 72 73 65 20 2a 70 50 61 72  atch(Parse *pPar
1b50: 73 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45  se, Expr *pE1, E
1b60: 78 70 72 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c  xpr *pE2){.  Col
1b70: 6c 53 65 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73  lSeq *pColl1 = s
1b80: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
1b90: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 31 29  Seq(pParse, pE1)
1ba0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
1bb0: 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ll2 = sqlite3Exp
1bc0: 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  rNNCollSeq(pPars
1bd0: 65 2c 20 70 45 32 29 3b 0a 20 20 72 65 74 75 72  e, pE2);.  retur
1be0: 6e 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  n sqlite3StrICmp
1bf0: 28 70 43 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20  (pColl1->zName, 
1c00: 70 43 6f 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d  pColl2->zName)==
1c10: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  0;.}../*.** pExp
1c20: 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20  r is an operand 
1c30: 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  of a comparison 
1c40: 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20  operator.  aff2 
1c50: 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61  is the.** type a
1c60: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f  ffinity of the o
1c70: 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54  ther operand.  T
1c80: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1c90: 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20  rns the.** type 
1ca0: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
1cb0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
1cc0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1cd0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61  operator..*/.cha
1ce0: 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  r sqlite3Compare
1cf0: 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70  Affinity(Expr *p
1d00: 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32 29  Expr, char aff2)
1d10: 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d 20  {.  char aff1 = 
1d20: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
1d30: 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ity(pExpr);.  if
1d40: 28 20 61 66 66 31 20 26 26 20 61 66 66 32 20 29  ( aff1 && aff2 )
1d50: 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69  {.    /* Both si
1d60: 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  des of the compa
1d70: 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e  rison are column
1d80: 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75  s. If one has nu
1d90: 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66  meric.    ** aff
1da0: 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e  inity, use that.
1db0: 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 6e   Otherwise use n
1dc0: 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  o affinity..    
1dd0: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
1de0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1df0: 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c  ity(aff1) || sql
1e00: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1e10: 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20  inity(aff2) ){. 
1e20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e30: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
1e40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
1e60: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20  FF_BLOB;.    }. 
1e70: 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66 31   }else if( !aff1
1e80: 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20   && !aff2 ){.   
1e90: 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65   /* Neither side
1ea0: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1eb0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
1ec0: 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20   Compare the.   
1ed0: 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65   ** results dire
1ee0: 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctly..    */.   
1ef0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
1f00: 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65  FF_BLOB;.  }else
1f10: 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64  {.    /* One sid
1f20: 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  e is a column, t
1f30: 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e  he other is not.
1f40: 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73   Use the columns
1f50: 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
1f60: 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d    assert( aff1==
1f70: 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a  0 || aff2==0 );.
1f80: 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31      return (aff1
1f90: 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a   + aff2);.  }.}.
1fa0: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
1fb0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1fc0: 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74  rator.  Return t
1fd0: 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  he type affinity
1fe0: 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
1ff0: 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f  be applied to bo
2000: 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f  th operands prio
2010: 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63  r to doing the c
2020: 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74  omparison..*/.st
2030: 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72  atic char compar
2040: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70  isonAffinity(Exp
2050: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61  r *pExpr){.  cha
2060: 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28  r aff;.  assert(
2070: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
2080: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
2090: 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IN || pExpr->
20a0: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20  op==TK_LT ||.   
20b0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
20c0: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72  ==TK_GT || pExpr
20d0: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70  ->op==TK_GE || p
20e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
20f0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
2100: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c  pr->op==TK_NE ||
2110: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2120: 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  S || pExpr->op==
2130: 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73  TK_ISNOT );.  as
2140: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
2150: 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71  ft );.  aff = sq
2160: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
2170: 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  y(pExpr->pLeft);
2180: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52  .  if( pExpr->pR
2190: 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20  ight ){.    aff 
21a0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
21b0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
21c0: 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20  pRight, aff);.  
21d0: 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61  }else if( ExprHa
21e0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
21f0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2200: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
2210: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
2220: 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  ty(pExpr->x.pSel
2230: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ect->pEList->a[0
2240: 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20  ].pExpr, aff);. 
2250: 20 7d 65 6c 73 65 20 69 66 28 20 61 66 66 3d 3d   }else if( aff==
2260: 30 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53  0 ){.    aff = S
2270: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
2280: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66    }.  return aff
2290: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
22a0: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
22b0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e   expression, eg.
22c0: 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e   '=', '<', IN(..
22d0: 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61  .) etc..** idx_a
22e0: 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61  ffinity is the a
22f0: 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e  ffinity of an in
2300: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65  dexed column. Re
2310: 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20  turn true.** if 
2320: 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61  the index with a
2330: 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69  ffinity idx_affi
2340: 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64  nity may be used
2350: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
2360: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
2370: 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74  in pExpr..*/.int
2380: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
2390: 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45  inityOk(Expr *pE
23a0: 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66  xpr, char idx_af
23b0: 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20  finity){.  char 
23c0: 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  aff = comparison
23d0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
23e0: 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29  .  switch( aff )
23f0: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
2400: 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20  E_AFF_BLOB:.    
2410: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2420: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
2430: 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75  TEXT:.      retu
2440: 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d  rn idx_affinity=
2450: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
2460: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
2470: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
2480: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
2490: 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74  nity(idx_affinit
24a0: 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  y);.  }.}../*.**
24b0: 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76   Return the P5 v
24c0: 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64  alue that should
24d0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62   be used for a b
24e0: 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e  inary comparison
24f0: 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45  .** opcode (OP_E
2500: 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75  q, OP_Ge etc.) u
2510: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70  sed to compare p
2520: 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32  Expr1 and pExpr2
2530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62  ..*/.static u8 b
2540: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45  inaryCompareP5(E
2550: 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70  xpr *pExpr1, Exp
2560: 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a  r *pExpr2, int j
2570: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38  umpIfNull){.  u8
2580: 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c   aff = (char)sql
2590: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
25a0: 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20  (pExpr2);.  aff 
25b0: 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d  = (u8)sqlite3Com
25c0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
25d0: 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29  pr1, aff) | (u8)
25e0: 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65  jumpIfNull;.  re
25f0: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
2600: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
2610: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61  ter to the colla
2620: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68  tion sequence th
2630: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
2640: 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79  d by.** a binary
2650: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
2660: 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70  ator comparing p
2670: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
2680: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65  .**.** If the le
2690: 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ft hand expressi
26a0: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
26b0: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65  ng sequence type
26c0: 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
26d0: 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  used. Otherwise 
26e0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
26f0: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
2700: 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73  ight hand expres
2710: 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c  sion.** is used,
2720: 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20   or the default 
2730: 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74  (BINARY) if neit
2740: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68  her expression h
2750: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  as a collating.*
2760: 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72  * type..**.** Ar
2770: 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62  gument pRight (b
2780: 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61  ut not pLeft) ma
2790: 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  y be a null poin
27a0: 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ter. In this cas
27b0: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  e,.** it is not 
27c0: 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43  considered..*/.C
27d0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42  ollSeq *sqlite3B
27e0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
27f0: 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Seq(.  Parse *pP
2800: 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70  arse, .  Expr *p
2810: 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70  Left, .  Expr *p
2820: 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53  Right.){.  CollS
2830: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73  eq *pColl;.  ass
2840: 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
2850: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
2860: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
2870: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2880: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2890: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
28a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
28b0: 68 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66  ht && (pRight->f
28c0: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
28d0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  e)!=0 ){.    pCo
28e0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
28f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2900: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
2910: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
2920: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2930: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
2940: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
2950: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  ){.      pColl =
2960: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2970: 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67  Seq(pParse, pRig
2980: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ht);.    }.  }. 
2990: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
29a0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
29b0: 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
29c0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
29d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
29e0: 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61  odeCompare(.  Pa
29f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2a00: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28  /* The parsing (
2a10: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
2a20: 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ing) context */.
2a30: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
2a40: 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
2a50: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
2a60: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f  r *pRight,     /
2a70: 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72  * The right oper
2a80: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63  and */.  int opc
2a90: 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ode,       /* Th
2aa0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63  e comparison opc
2ab0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31  ode */.  int in1
2ac0: 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65  , int in2, /* Re
2ad0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f  gister holding o
2ae0: 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74  perands */.  int
2af0: 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
2b00: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
2b10: 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a  rue.  */.  int j
2b20: 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
2b30: 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66  If true, jump if
2b40: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
2b50: 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  is NULL */.){.  
2b60: 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64  int p5;.  int ad
2b70: 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dr;.  CollSeq *p
2b80: 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74  4;..  p4 = sqlit
2b90: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
2ba0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2bb0: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
2bc0: 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70   p5 = binaryComp
2bd0: 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69  areP5(pLeft, pRi
2be0: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
2bf0: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
2c00: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61  e3VdbeAddOp4(pPa
2c10: 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f  rse->pVdbe, opco
2c20: 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69  de, in2, dest, i
2c30: 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n1,.            
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2c50: 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c  void*)p4, P4_COL
2c60: 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33  LSEQ);.  sqlite3
2c70: 56 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61  VdbeChangeP5(pPa
2c80: 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29  rse->pVdbe, (u8)
2c90: 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  p5);.  return ad
2ca0: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dr;.}../*.** Ret
2cb0: 75 72 6e 20 74 72 75 65 20 69 66 20 65 78 70 72  urn true if expr
2cc0: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
2cd0: 61 20 76 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c  a vector, or fal
2ce0: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  se otherwise..**
2cf0: 0a 2a 2a 20 41 20 76 65 63 74 6f 72 20 69 73 20  .** A vector is 
2d00: 64 65 66 69 6e 65 64 20 61 73 20 61 6e 79 20 65  defined as any e
2d10: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 72  xpression that r
2d20: 65 73 75 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72  esults in two or
2d30: 20 6d 6f 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73   more.** columns
2d40: 20 6f 66 20 72 65 73 75 6c 74 2e 20 20 45 76 65   of result.  Eve
2d50: 72 79 20 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64  ry TK_VECTOR nod
2d60: 65 20 69 73 20 61 6e 20 76 65 63 74 6f 72 20 62  e is an vector b
2d70: 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61  ecause the.** pa
2d80: 72 73 65 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65  rser will not ge
2d90: 6e 65 72 61 74 65 20 61 20 54 4b 5f 56 45 43 54  nerate a TK_VECT
2da0: 4f 52 20 77 69 74 68 20 66 65 77 65 72 20 74 68  OR with fewer th
2db0: 61 6e 20 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a  an two entries..
2dc0: 2a 2a 20 42 75 74 20 61 20 54 4b 5f 53 45 4c 45  ** But a TK_SELE
2dd0: 43 54 20 6d 69 67 68 74 20 62 65 20 65 69 74 68  CT might be eith
2de0: 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61  er a vector or a
2df0: 20 73 63 61 6c 61 72 2e 20 49 74 20 69 73 20 6f   scalar. It is o
2e00: 6e 6c 79 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  nly.** considere
2e10: 64 20 61 20 76 65 63 74 6f 72 20 69 66 20 69 74  d a vector if it
2e20: 20 68 61 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65   has two or more
2e30: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e   result columns.
2e40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2e50: 78 70 72 49 73 56 65 63 74 6f 72 28 45 78 70 72  xprIsVector(Expr
2e60: 20 2a 70 45 78 70 72 29 7b 0a 20 20 72 65 74 75   *pExpr){.  retu
2e70: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 56 65  rn sqlite3ExprVe
2e80: 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3e  ctorSize(pExpr)>
2e90: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  1;.}../*.** If t
2ea0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  he expression pa
2eb0: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
2ec0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20   argument is of 
2ed0: 74 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a  type TK_VECTOR .
2ee0: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ** return the nu
2ef0: 6d 62 65 72 20 6f 66 20 65 78 70 72 65 73 73 69  mber of expressi
2f00: 6f 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f  ons in the vecto
2f10: 72 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 65 78  r. Or, if the ex
2f20: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61  pression.** is a
2f30: 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 72 65 74   sub-select, ret
2f40: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2f50: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
2f60: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72   sub-select. For
2f70: 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 74 79  .** any other ty
2f80: 70 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  pe of expression
2f90: 2c 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69  , return 1..*/.i
2fa0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 56 65  nt sqlite3ExprVe
2fb0: 63 74 6f 72 53 69 7a 65 28 45 78 70 72 20 2a 70  ctorSize(Expr *p
2fc0: 45 78 70 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d  Expr){.  u8 op =
2fd0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
2fe0: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
2ff0: 52 20 29 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  R ) op = pExpr->
3000: 6f 70 32 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  op2;.  if( op==T
3010: 4b 5f 56 45 43 54 4f 52 20 29 7b 0a 20 20 20 20  K_VECTOR ){.    
3020: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e  return pExpr->x.
3030: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
3040: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
3050: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72  _SELECT ){.    r
3060: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70  eturn pExpr->x.p
3070: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
3080: 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nExpr;.  }else{.
3090: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
30a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
30b0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
30c0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 6f   subexpression o
30d0: 66 20 70 56 65 63 74 6f 72 20 74 68 61 74 20 69  f pVector that i
30e0: 73 20 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f  s the i-th.** co
30f0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
3100: 6f 72 20 28 6e 75 6d 62 65 72 65 64 20 73 74 61  or (numbered sta
3110: 72 74 69 6e 67 20 77 69 74 68 20 30 29 2e 20 20  rting with 0).  
3120: 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a  The caller must.
3130: 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 69  ** ensure that i
3140: 20 69 73 20 77 69 74 68 69 6e 20 72 61 6e 67 65   is within range
3150: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74  ..**.** If pVect
3160: 6f 72 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73  or is really a s
3170: 63 61 6c 61 72 20 28 61 6e 64 20 22 73 63 61 6c  calar (and "scal
3180: 61 72 22 20 68 65 72 65 20 69 6e 63 6c 75 64 65  ar" here include
3190: 73 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20  s subqueries.** 
31a0: 74 68 61 74 20 72 65 74 75 72 6e 20 61 20 73 69  that return a si
31b0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68  ngle column!) th
31c0: 65 6e 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f  en return pVecto
31d0: 72 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a  r unmodified..**
31e0: 0a 2a 2a 20 70 56 65 63 74 6f 72 20 72 65 74 61  .** pVector reta
31f0: 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  ins ownership of
3200: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 75   the returned su
3210: 62 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a  bexpression..**.
3220: 2a 2a 20 49 66 20 74 68 65 20 76 65 63 74 6f 72  ** If the vector
3230: 20 69 73 20 61 20 28 53 45 4c 45 43 54 20 2e 2e   is a (SELECT ..
3240: 2e 29 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  .) then the expr
3250: 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  ession returned 
3260: 69 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20 65  is.** just the e
3270: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68  xpression for th
3280: 65 20 69 2d 74 68 20 74 65 72 6d 20 6f 66 20 74  e i-th term of t
3290: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61  he result set, a
32a0: 6e 64 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65  nd may.** not be
32b0: 20 72 65 61 64 79 20 66 6f 72 20 65 76 61 6c 75   ready for evalu
32c0: 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68  ation because th
32d0: 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 68  e table cursor h
32e0: 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65  as not yet.** be
32f0: 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a  en positioned..*
3300: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 56  /.Expr *sqlite3V
3310: 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
3320: 72 28 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c  r(Expr *pVector,
3330: 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72   int i){.  asser
3340: 74 28 20 69 3c 73 71 6c 69 74 65 33 45 78 70 72  t( i<sqlite3Expr
3350: 56 65 63 74 6f 72 53 69 7a 65 28 70 56 65 63 74  VectorSize(pVect
3360: 6f 72 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  or) );.  if( sql
3370: 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
3380: 28 70 56 65 63 74 6f 72 29 20 29 7b 0a 20 20 20  (pVector) ){.   
3390: 20 61 73 73 65 72 74 28 20 70 56 65 63 74 6f 72   assert( pVector
33a0: 2d 3e 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63  ->op2==0 || pVec
33b0: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  tor->op==TK_REGI
33c0: 53 54 45 52 20 29 3b 0a 20 20 20 20 69 66 28 20  STER );.    if( 
33d0: 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f  pVector->op==TK_
33e0: 53 45 4c 45 43 54 20 7c 7c 20 70 56 65 63 74 6f  SELECT || pVecto
33f0: 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43  r->op2==TK_SELEC
3400: 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T ){.      retur
3410: 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65  n pVector->x.pSe
3420: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
3430: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65  i].pExpr;.    }e
3440: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
3450: 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69  n pVector->x.pLi
3460: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
3470: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3480: 72 6e 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f  rn pVector;.}../
3490: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
34a0: 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20 45 78   return a new Ex
34b0: 70 72 20 6f 62 6a 65 63 74 20 77 68 69 63 68 20  pr object which 
34c0: 77 68 65 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a  when passed to.*
34d0: 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  * sqlite3ExprCod
34e0: 65 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  e() will generat
34f0: 65 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20  e all necessary 
3500: 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a  code to compute.
3510: 2a 2a 20 74 68 65 20 69 46 69 65 6c 64 2d 74 68  ** the iField-th
3520: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76   column of the v
3530: 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
3540: 20 70 56 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20   pVector..**.** 
3550: 49 74 20 69 73 20 6f 6b 20 66 6f 72 20 70 56 65  It is ok for pVe
3560: 63 74 6f 72 20 74 6f 20 62 65 20 61 20 73 63 61  ctor to be a sca
3570: 6c 61 72 20 28 61 73 20 6c 6f 6e 67 20 61 73 20  lar (as long as 
3580: 69 46 69 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a  iField==0).  .**
3590: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
35a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
35b0: 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78  s like sqlite3Ex
35c0: 70 72 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  prDup()..**.** T
35d0: 68 65 20 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74  he caller owns t
35e0: 68 65 20 72 65 74 75 72 6e 65 64 20 45 78 70 72  he returned Expr
35f0: 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 73 20 72   object and is r
3600: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a  esponsible for.*
3610: 2a 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  * ensuring that 
3620: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
3630: 75 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  ue eventually ge
3640: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
3650: 54 68 65 20 63 61 6c 6c 65 72 20 72 65 74 61 69  The caller retai
3660: 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  ns ownership of 
3670: 70 56 65 63 74 6f 72 2e 20 20 49 66 20 70 56 65  pVector.  If pVe
3680: 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c  ctor is a TK_SEL
3690: 45 43 54 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ECT,.** then the
36a0: 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74   returned object
36b0: 20 77 69 6c 6c 20 72 65 66 65 72 65 6e 63 65 20   will reference 
36c0: 70 56 65 63 74 6f 72 20 61 6e 64 20 73 6f 20 70  pVector and so p
36d0: 56 65 63 74 6f 72 20 6d 75 73 74 20 72 65 6d 61  Vector must rema
36e0: 69 6e 0a 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20  in.** valid for 
36f0: 74 68 65 20 6c 69 66 65 20 6f 66 20 74 68 65 20  the life of the 
3700: 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e  returned object.
3710: 20 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20    If pVector is 
3720: 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f  a TK_VECTOR.** o
3730: 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  r a scalar expre
3740: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63  ssion, then it c
3750: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 20 61 73  an be deleted as
3760: 20 73 6f 6f 6e 20 61 73 20 74 68 69 73 20 72 6f   soon as this ro
3770: 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
3780: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20  ..**.** A trick 
3790: 74 6f 20 63 61 75 73 65 20 61 20 54 4b 5f 53 45  to cause a TK_SE
37a0: 4c 45 43 54 20 70 56 65 63 74 6f 72 20 74 6f 20  LECT pVector to 
37b0: 62 65 20 64 65 6c 65 74 65 64 20 74 6f 67 65 74  be deleted toget
37c0: 68 65 72 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  her with.** the 
37d0: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
37e0: 6a 65 63 74 20 69 73 20 74 6f 20 61 74 74 61 63  ject is to attac
37f0: 68 20 74 68 65 20 70 56 65 63 74 6f 72 20 74 6f  h the pVector to
3800: 20 74 68 65 20 70 52 69 67 68 74 20 66 69 65 6c   the pRight fiel
3810: 64 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75  d.** of the retu
3820: 72 6e 65 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43  rned TK_SELECT_C
3830: 4f 4c 55 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63  OLUMN Expr objec
3840: 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  t..*/.Expr *sqli
3850: 74 65 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72  te3ExprForVector
3860: 46 69 65 6c 64 28 0a 20 20 50 61 72 73 65 20 2a  Field(.  Parse *
3870: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
3880: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
3890: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63   */.  Expr *pVec
38a0: 74 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  tor,       /* Th
38b0: 65 20 76 65 63 74 6f 72 2e 20 20 4c 69 73 74 20  e vector.  List 
38c0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  of expressions o
38d0: 72 20 61 20 73 75 62 2d 53 45 4c 45 43 54 20 2a  r a sub-SELECT *
38e0: 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 20 20  /.  int iField  
38f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
3900: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
3910: 76 65 63 74 6f 72 20 74 6f 20 72 65 74 75 72 6e  vector to return
3920: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
3930: 52 65 74 3b 0a 20 20 69 66 28 20 70 56 65 63 74  Ret;.  if( pVect
3940: 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  or->op==TK_SELEC
3950: 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  T ){.    assert(
3960: 20 70 56 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20   pVector->flags 
3970: 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
3980: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f  ;.    /* The TK_
3990: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78  SELECT_COLUMN Ex
39a0: 70 72 20 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a  pr node:.    **.
39b0: 20 20 20 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20      ** pLeft:   
39c0: 20 20 20 20 20 20 20 20 70 56 65 63 74 6f 72 20          pVector 
39d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45  containing TK_SE
39e0: 4c 45 43 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74  LECT.  Not delet
39f0: 65 64 2e 0a 20 20 20 20 2a 2a 20 70 52 69 67 68  ed..    ** pRigh
3a00: 74 3a 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20  t:          not 
3a10: 75 73 65 64 2e 20 20 42 75 74 20 72 65 63 75 72  used.  But recur
3a20: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a  sively deleted..
3a30: 20 20 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20      ** iColumn: 
3a40: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 6f 66          Index of
3a50: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65   a column in pVe
3a60: 63 74 6f 72 0a 20 20 20 20 2a 2a 20 69 54 61 62  ctor.    ** iTab
3a70: 6c 65 3a 20 20 20 20 20 20 20 20 20 20 30 20 6f  le:          0 o
3a80: 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
3a90: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c  columns on the L
3aa0: 48 53 20 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d  HS of an assignm
3ab0: 65 6e 74 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74  ent.    ** pLeft
3ac0: 2d 3e 69 54 61 62 6c 65 3a 20 20 20 46 69 72 73  ->iTable:   Firs
3ad0: 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  t in an array of
3ae0: 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
3af0: 67 20 72 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20  g result, or 0. 
3b00: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
3b10: 20 20 20 20 20 20 20 69 66 20 74 68 65 20 72 65         if the re
3b20: 73 75 6c 74 20 69 73 20 6e 6f 74 20 79 65 74 20  sult is not yet 
3b30: 63 6f 6d 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a  computed..    **
3b40: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45  .    ** sqlite3E
3b50: 78 70 72 44 65 6c 65 74 65 28 29 20 73 70 65 63  xprDelete() spec
3b60: 69 66 69 63 61 6c 6c 79 20 73 6b 69 70 73 20 74  ifically skips t
3b70: 68 65 20 72 65 63 75 72 73 69 76 65 20 64 65 6c  he recursive del
3b80: 65 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c  ete of.    ** pL
3b90: 65 66 74 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54  eft on TK_SELECT
3ba0: 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20  _COLUMN nodes.  
3bb0: 42 75 74 20 70 52 69 67 68 74 20 69 73 20 66 6f  But pRight is fo
3bc0: 6c 6c 6f 77 65 64 2c 20 73 6f 20 70 56 65 63 74  llowed, so pVect
3bd0: 6f 72 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  or.    ** can be
3be0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 70 52 69   attached to pRi
3bf0: 67 68 74 20 74 6f 20 63 61 75 73 65 20 74 68 69  ght to cause thi
3c00: 73 20 6e 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f  s node to take o
3c10: 77 6e 65 72 73 68 69 70 20 6f 66 0a 20 20 20 20  wnership of.    
3c20: 2a 2a 20 70 56 65 63 74 6f 72 2e 20 20 54 79 70  ** pVector.  Typ
3c30: 69 63 61 6c 6c 79 20 74 68 65 72 65 20 77 69 6c  ically there wil
3c40: 6c 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b  l be multiple TK
3c50: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e  _SELECT_COLUMN n
3c60: 6f 64 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68  odes.    ** with
3c70: 20 74 68 65 20 73 61 6d 65 20 70 4c 65 66 74 20   the same pLeft 
3c80: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
3c90: 56 65 63 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79  Vector, but only
3ca0: 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 20 20 20   one of them.   
3cb0: 20 2a 2a 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65   ** will own the
3cc0: 20 70 56 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f   pVector..    */
3cd0: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
3ce0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
3cf0: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
3d00: 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  N, 0, 0);.    if
3d10: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
3d20: 70 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pRet->iColumn = 
3d30: 69 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52  iField;.      pR
3d40: 65 74 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63  et->pLeft = pVec
3d50: 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
3d60: 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c  ssert( pRet==0 |
3d70: 7c 20 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d  | pRet->iTable==
3d80: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
3d90: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3da0: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70  p==TK_VECTOR ) p
3db0: 56 65 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72  Vector = pVector
3dc0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
3dd0: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
3de0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
3df0: 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
3e00: 2c 20 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20  , pVector, 0);. 
3e10: 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
3e20: 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73  TokenRemap(pPars
3e30: 65 2c 20 70 52 65 74 2c 20 70 56 65 63 74 6f 72  e, pRet, pVector
3e40: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
3e50: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pRet;.}../*.** I
3e60: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
3e70: 70 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b  pr is of type TK
3e80: 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74  _SELECT, generat
3e90: 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
3ea0: 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74 75 72 6e  te.** it. Return
3eb0: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
3ec0: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
3ed0: 74 20 69 73 20 73 74 6f 72 65 64 20 28 6f 72 2c  t is stored (or,
3ee0: 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d   if the .** sub-
3ef0: 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 6d  select returns m
3f00: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c  ore than one col
3f10: 75 6d 6e 2c 20 74 68 65 20 66 69 72 73 74 20 69  umn, the first i
3f20: 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20 6f 66  n an array.** of
3f30: 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 77 68   registers in wh
3f40: 69 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 69  ich the result i
3f50: 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a 2a 2a  s stored)..**.**
3f60: 20 49 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74   If pExpr is not
3f70: 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70   a TK_SELECT exp
3f80: 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20  ression, return 
3f90: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
3fa0: 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65   exprCodeSubsele
3fb0: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
3fc0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
3fd0: 20 20 69 6e 74 20 72 65 67 20 3d 20 30 3b 0a 23    int reg = 0;.#
3fe0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3ff0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
4000: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
4010: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65  SELECT ){.    re
4020: 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  g = sqlite3CodeS
4030: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
4040: 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 23 65 6e   pExpr);.  }.#en
4050: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67  dif.  return reg
4060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
4070: 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e  ent pVector poin
4080: 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65  ts to a vector e
4090: 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68  xpression - eith
40a0: 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a  er a TK_VECTOR.*
40b0: 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74  * or TK_SELECT t
40c0: 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65  hat returns more
40d0: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
40e0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
40f0: 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72  returns.** the r
4100: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f  egister number o
4110: 66 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  f a register tha
4120: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
4130: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65  alue of.** eleme
4140: 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65  nt iField of the
4150: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   vector..**.** I
4160: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
4170: 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73  K_SELECT express
4180: 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66  ion, then code f
4190: 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20  or it must have 
41a0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
41b0: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
41c0: 20 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62   the exprCodeSub
41d0: 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65  select() routine
41e0: 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
41f0: 65 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53  e parameter regS
4200: 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20  elect should be 
4210: 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
4220: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
4230: 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  rs.** containing
4240: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
4250: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  the sub-select. 
4260: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f  .**.** If pVecto
4270: 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f  r is of type TK_
4280: 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64  VECTOR, then cod
4290: 65 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73  e for the reques
42a0: 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20  ted field.** is 
42b0: 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68  generated. In th
42c0: 69 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72  is case (*pRegFr
42d0: 65 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74  ee) may be set t
42e0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
42f0: 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  ** a temporary r
4300: 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72  egister to be fr
4310: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
4320: 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
4330: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ng..**.** Before
4340: 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70   returning, outp
4350: 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  ut parameter (*p
4360: 70 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f  pExpr) is set to
4370: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
4380: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72   Expr object cor
4390: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c  responding to el
43a0: 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74  ement iElem of t
43b0: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74  he vector..*/.st
43c0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63  atic int exprVec
43d0: 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50  torRegister(.  P
43e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4400: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
4410: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74  */.  Expr *pVect
4420: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
4430: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74       /* Vector t
4440: 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e  o extract elemen
4450: 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
4460: 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20  iField,         
4470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4480: 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20  ield to extract 
4490: 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a  from pVector */.
44a0: 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c    int regSelect,
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44c0: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
44d0: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
44e0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
44f0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
4500: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78        /* OUT: Ex
4510: 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74  pression element
4520: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46   */.  int *pRegF
4530: 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
4540: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65        /* OUT: Te
4550: 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
4560: 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f  ree */.){.  u8 o
4570: 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b  p = pVector->op;
4580: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
4590: 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d  K_VECTOR || op==
45a0: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
45b0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
45c0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
45d0: 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70  ISTER ){.    *pp
45e0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65  Expr = sqlite3Ve
45f0: 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
4600: 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64  (pVector, iField
4610: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56  );.    return pV
4620: 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46  ector->iTable+iF
4630: 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ield;.  }.  if( 
4640: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
4650: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70  .    *ppExpr = p
4660: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
4670: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69  t->pEList->a[iFi
4680: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
4690: 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63   return regSelec
46a0: 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20  t+iField;.  }.  
46b0: 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f  *ppExpr = pVecto
46c0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46  r->x.pList->a[iF
46d0: 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72  ield].pExpr;.  r
46e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
46f0: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
4700: 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46  , *ppExpr, pRegF
4710: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ree);.}../*.** E
4720: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
4730: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
4740: 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74  between two vect
4750: 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75  or values. Compu
4760: 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  te.** the result
4770: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
4780: 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c  on (1, 0, or NUL
4790: 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  L) and write tha
47a0: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f  t.** result into
47b0: 20 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a   register dest..
47c0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
47d0: 20 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68   must satisfy th
47e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63  e following prec
47f0: 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  onditions:.**.**
4800: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
4810: 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70  ==TK_IS:      op
4820: 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d  ==TK_EQ and p5==
4830: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
4840: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
4850: 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70  ==TK_ISNOT:   op
4860: 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d  ==TK_NE and p5==
4870: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
4880: 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20      otherwise:  
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
48a0: 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  ==pExpr->op and 
48b0: 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20  p5==0.*/.static 
48c0: 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43  void codeVectorC
48d0: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
48e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
48f0: 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f  /* Code generato
4900: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
4910: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
4920: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
4930: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
4940: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
4950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
4960: 72 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74  rite results int
4970: 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
4980: 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20  */.  u8 op,     
4990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
49a0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
49b0: 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  r */.  u8 p5    
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49d0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72  SQLITE_NULLEQ or
49e0: 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64   zero */.){.  Vd
49f0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
4a00: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
4a10: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
4a20: 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69  eft;.  Expr *pRi
4a30: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
4a40: 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74  ght;.  int nLeft
4a50: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
4a60: 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
4a70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4a80: 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69  regLeft = 0;.  i
4a90: 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b  nt regRight = 0;
4aa0: 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a  .  u8 opx = op;.
4ab0: 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d    int addrDone =
4ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4ad0: 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  Label(pParse);..
4ae0: 20 20 69 66 28 20 6e 4c 65 66 74 21 3d 73 71 6c    if( nLeft!=sql
4af0: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
4b00: 7a 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  ze(pRight) ){.  
4b10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4b20: 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
4b30: 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
4b40: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
4b50: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
4b60: 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45  >op==TK_EQ || pE
4b70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 0a  xpr->op==TK_NE .
4b80: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
4b90: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45  >op==TK_IS || pE
4ba0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4bb0: 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78  T .       || pEx
4bc0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pr->op==TK_LT ||
4bd0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
4be0: 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78  T .       || pEx
4bf0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
4c00: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
4c10: 45 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  E .  );.  assert
4c20: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20  ( pExpr->op==op 
4c30: 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  || (pExpr->op==T
4c40: 4b 5f 49 53 20 26 26 20 6f 70 3d 3d 54 4b 5f 45  K_IS && op==TK_E
4c50: 51 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  Q).            |
4c60: 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  | (pExpr->op==TK
4c70: 5f 49 53 4e 4f 54 20 26 26 20 6f 70 3d 3d 54 4b  _ISNOT && op==TK
4c80: 5f 4e 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  _NE) );.  assert
4c90: 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78 70 72  ( p5==0 || pExpr
4ca0: 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20 61 73  ->op!=op );.  as
4cb0: 73 65 72 74 28 20 70 35 3d 3d 53 51 4c 49 54 45  sert( p5==SQLITE
4cc0: 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78 70 72  _NULLEQ || pExpr
4cd0: 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20 20 70  ->op==op );..  p
4ce0: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 53 54 4f 52  5 |= SQLITE_STOR
4cf0: 45 50 32 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d  EP2;.  if( opx==
4d00: 54 4b 5f 4c 45 20 29 20 6f 70 78 20 3d 20 54 4b  TK_LE ) opx = TK
4d10: 5f 4c 54 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d  _LT;.  if( opx==
4d20: 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20 54 4b  TK_GE ) opx = TK
4d30: 5f 47 54 3b 0a 0a 20 20 72 65 67 4c 65 66 74 20  _GT;..  regLeft 
4d40: 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c  = exprCodeSubsel
4d50: 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ect(pParse, pLef
4d60: 74 29 3b 0a 20 20 72 65 67 52 69 67 68 74 20 3d  t);.  regRight =
4d70: 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65   exprCodeSubsele
4d80: 63 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  ct(pParse, pRigh
4d90: 74 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t);..  for(i=0; 
4da0: 31 20 2f 2a 4c 6f 6f 70 20 65 78 69 74 73 20 62  1 /*Loop exits b
4db0: 79 20 22 62 72 65 61 6b 22 2a 2f 3b 20 69 2b 2b  y "break"*/; i++
4dc0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 46 72  ){.    int regFr
4dd0: 65 65 31 20 3d 20 30 2c 20 72 65 67 46 72 65 65  ee1 = 0, regFree
4de0: 32 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 72 20  2 = 0;.    Expr 
4df0: 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20 20 69  *pL, *pR; .    i
4e00: 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 61  nt r1, r2;.    a
4e10: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
4e20: 3c 6e 4c 65 66 74 20 29 3b 0a 20 20 20 20 72 31  <nLeft );.    r1
4e30: 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67   = exprVectorReg
4e40: 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c  ister(pParse, pL
4e50: 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c  eft, i, regLeft,
4e60: 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29   &pL, &regFree1)
4e70: 3b 0a 20 20 20 20 72 32 20 3d 20 65 78 70 72 56  ;.    r2 = exprV
4e80: 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50  ectorRegister(pP
4e90: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69 2c  arse, pRight, i,
4ea0: 20 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c 20   regRight, &pR, 
4eb0: 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
4ec0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
4ed0: 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f 70 78 2c  se, pL, pR, opx,
4ee0: 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 70   r1, r2, dest, p
4ef0: 35 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  5);.    testcase
4f00: 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
4f10: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4f20: 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 74 65  ==OP_Lt);.    te
4f30: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
4f40: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4f50: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
4f60: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4f70: 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
4f80: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f90: 5f 47 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Gt);.    testca
4fa0: 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
4fb0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4fc0: 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
4fd0: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4fe0: 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
4ff0: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
5000: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
5010: 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43  p==OP_Ne); VdbeC
5020: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
5030: 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71 6c 69  OP_Ne);.    sqli
5040: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5050: 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
5060: 65 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e1);.    sqlite3
5070: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5080: 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
5090: 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65  ;.    if( i==nLe
50a0: 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62 72  ft-1 ){.      br
50b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
50c0: 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29 7b  f( opx==TK_EQ ){
50d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
50e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
50f0: 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64 72  fNot, dest, addr
5100: 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Done); VdbeCover
5110: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35  age(v);.      p5
5120: 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e   |= SQLITE_KEEPN
5130: 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ULL;.    }else i
5140: 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b  f( opx==TK_NE ){
5150: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5160: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5170: 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e  f, dest, addrDon
5180: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
5190: 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d  (v);.      p5 |=
51a0: 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c   SQLITE_KEEPNULL
51b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
51c0: 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54     assert( op==T
51d0: 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LT || op==TK_G
51e0: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  T || op==TK_LE |
51f0: 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  | op==TK_GE );. 
5200: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5210: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c 73  AddOp2(v, OP_Els
5220: 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72 44  eNotEq, 0, addrD
5230: 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  one);.      Vdbe
5240: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
5250: 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20  ==TK_LT);.      
5260: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
5270: 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20  , op==TK_GT);.  
5280: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
5290: 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29  If(v, op==TK_LE)
52a0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
52b0: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
52c0: 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  _GE);.      if( 
52d0: 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70 78  i==nLeft-2 ) opx
52e0: 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d   = op;.    }.  }
52f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
5300: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
5310: 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66 20  drDone);.}..#if 
5320: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
5330: 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  DEPTH>0./*.** Ch
5340: 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e  eck that argumen
5350: 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73  t nHeight is les
5360: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
5370: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a  to the maximum.*
5380: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  * expression dep
5390: 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69  th allowed. If i
53a0: 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20  t is not, leave 
53b0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
53c0: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a   in.** pParse..*
53d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
53e0: 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72  rCheckHeight(Par
53f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
5400: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20  nHeight){.  int 
5410: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5420: 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d    int mxHeight =
5430: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
5440: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
5450: 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20  _EXPR_DEPTH];.  
5460: 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65  if( nHeight>mxHe
5470: 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
5480: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5490: 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70  se, .       "Exp
54a0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20  ression tree is 
54b0: 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d  too large (maxim
54c0: 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d  um depth %d)", m
54d0: 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20  xHeight.    );. 
54e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
54f0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
5500: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  rn rc;.}../* The
5510: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65   following three
5520: 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67   functions, heig
5530: 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67  htOfExpr(), heig
5540: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a  htOfExprList().*
5550: 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65  * and heightOfSe
5560: 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64  lect(), are used
5570: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
5580: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
5590: 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65  .** of any expre
55a0: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
55b0: 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72  enced by the str
55c0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
55d0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72   the.** first ar
55e0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
55f0: 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65   this maximum he
5600: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
5610: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
5620: 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a   value pointed.*
5630: 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74  * to by pnHeight
5640: 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  , the second par
5650: 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74  ameter, then set
5660: 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68   *pnHeight to th
5670: 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a  at.** value..*/.
5680: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5690: 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70  htOfExpr(Expr *p
56a0: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
56b0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
56c0: 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e   if( p->nHeight>
56d0: 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20  *pnHeight ){.   
56e0: 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70     *pnHeight = p
56f0: 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d  ->nHeight;.    }
5700: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
5710: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  id heightOfExprL
5720: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  ist(ExprList *p,
5730: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5740: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5750: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
5760: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
5770: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67  i++){.      heig
5780: 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d  htOfExpr(p->a[i]
5790: 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74  .pExpr, pnHeight
57a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  );.    }.  }.}.s
57b0: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
57c0: 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74  tOfSelect(Select
57d0: 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20 2a   *pSelect, int *
57e0: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53 65 6c  pnHeight){.  Sel
57f0: 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  ect *p;.  for(p=
5800: 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d 70 2d  pSelect; p; p=p-
5810: 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 68 65  >pPrior){.    he
5820: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57  ightOfExpr(p->pW
5830: 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b  here, pnHeight);
5840: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5850: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e  r(p->pHaving, pn
5860: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5870: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69  ghtOfExpr(p->pLi
5880: 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  mit, pnHeight);.
5890: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
58a0: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
58b0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
58c0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
58d0: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48  p->pGroupBy, pnH
58e0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
58f0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5900: 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67  pOrderBy, pnHeig
5910: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
5920: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
5930: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
5940: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
5950: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a   passed as an .*
5960: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65  * argument. An e
5970: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e  xpression with n
5980: 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72  o children, Expr
5990: 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78  .pList or .** Ex
59a0: 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65  pr.pSelect membe
59b0: 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f  r has a height o
59c0: 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65  f 1. Any other e
59d0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73  xpression.** has
59e0: 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20   a height equal 
59f0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  to the maximum h
5a00: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68  eight of any oth
5a10: 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  er .** reference
5a20: 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e  d Expr plus one.
5a30: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
5a40: 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61  agate EP_Propaga
5a50: 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d  te flags up from
5a60: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f   Expr.x.pList to
5a70: 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20   Expr.flags,.** 
5a80: 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  if appropriate..
5a90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5aa0: 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70  xprSetHeight(Exp
5ab0: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  r *p){.  int nHe
5ac0: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
5ad0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66  htOfExpr(p->pLef
5ae0: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5af0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5b00: 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74  pRight, &nHeight
5b10: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
5b20: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
5b30: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
5b40: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5b50: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e  p->x.pSelect, &n
5b60: 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  Height);.  }else
5b70: 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20   if( p->x.pList 
5b80: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
5b90: 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69  xprList(p->x.pLi
5ba0: 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  st, &nHeight);. 
5bb0: 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45     p->flags |= E
5bc0: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71  P_Propagate & sq
5bd0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
5be0: 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  gs(p->x.pList);.
5bf0: 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74    }.  p->nHeight
5c00: 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a   = nHeight + 1;.
5c10: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
5c20: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
5c30: 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65  riable using the
5c40: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29   exprSetHeight()
5c50: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a   function. If.**
5c60: 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67   the height is g
5c70: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
5c80: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  maximum allowed 
5c90: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
5ca0: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
5cb0: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
5cc0: 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67  *.** Also propag
5cd0: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
5ce0: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
5cf0: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
5d00: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
5d10: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
5d20: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
5d30: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
5d40: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
5d50: 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p){.  if( pParse
5d60: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
5d70: 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74  .  exprSetHeight
5d80: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (p);.  sqlite3Ex
5d90: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
5da0: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
5db0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
5dc0: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  rn the maximum h
5dd0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70  eight of any exp
5de0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5df0: 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68  erenced.** by th
5e00: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5e10: 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
5e20: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
5e30: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
5e40: 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20  prHeight(Select 
5e50: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
5e60: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
5e70: 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65  OfSelect(p, &nHe
5e80: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
5e90: 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65  nHeight;.}.#else
5ea0: 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67   /* ABOVE:  Heig
5eb0: 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65  ht enforcement e
5ec0: 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20  nabled.  BELOW: 
5ed0: 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65  Height enforceme
5ee0: 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20  nt off */./*.** 
5ef0: 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  Propagate all EP
5f00: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
5f10: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5f20: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5f30: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5f40: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5f50: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5f60: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5f70: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5f80: 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  p && p->x.pList 
5f90: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
5fa0: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
5fb0: 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66  ect) ){.    p->f
5fc0: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
5fd0: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
5fe0: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5ff0: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23  .pList);.  }.}.#
6000: 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65  define exprSetHe
6010: 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f  ight(y).#endif /
6020: 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  * SQLITE_MAX_EXP
6030: 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a  R_DEPTH>0 */../*
6040: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6050: 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c   is the core all
6060: 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20  ocator for Expr 
6070: 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e  nodes..**.** Con
6080: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
6090: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64  ression node and
60a0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
60b0: 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79  r to it.  Memory
60c0: 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64  .** for this nod
60d0: 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54  e and for the pT
60e0: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  oken argument is
60f0: 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   a single alloca
6100: 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  tion.** obtained
6110: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
6120: 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61  alloc().  The ca
6130: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
6140: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
6150: 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
6160: 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75   the node eventu
6170: 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e  ally gets freed.
6180: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74  .**.** If dequot
6190: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
61a0: 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74  the token (if it
61b0: 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75   exists) is dequ
61c0: 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75  oted..** If dequ
61d0: 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f  ote is false, no
61e0: 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65   dequoting is pe
61f0: 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64 65  rformed.  The de
6200: 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74  Quote.** paramet
6210: 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
6220: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20   pToken is NULL 
6230: 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20  or if the token 
6240: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65  does not.** appe
6250: 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ar to be quoted.
6260: 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20    If the quotes 
6270: 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  were of the form
6280: 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71   "..." (double-q
6290: 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74  uotes).** then t
62a0: 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20  he EP_DblQuoted 
62b0: 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
62c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
62d0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61  de..**.** Specia
62e0: 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d  l case:  If op==
62f0: 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70  TK_INTEGER and p
6300: 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Token points to 
6310: 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a  a string that.**
6320: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74   can be translat
6330: 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74  ed into a 32-bit
6340: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
6350: 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a  he token is not.
6360: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a  ** stored in u.z
6370: 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c  Token.  Instead,
6380: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
6390: 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ues is written.*
63a0: 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20  * into u.iValue 
63b0: 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61  and the EP_IntVa
63c0: 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e  lue flag is set.
63d0: 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61    No extra stora
63e0: 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74  ge.** is allocat
63f0: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69  ed to hold the i
6400: 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20  nteger text and 
6410: 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67  the dequote flag
6420: 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
6430: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
6440: 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65  rAlloc(.  sqlite
6450: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
6460: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
6470: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6480: 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  awNN() */.  int 
6490: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
64a0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
64b0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
64c0: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
64d0: 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61  n,    /* Token a
64e0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
64f0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
6500: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
6510: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
6520: 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20  dequote */.){.  
6530: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
6540: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
6550: 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a  int iValue = 0;.
6560: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
6570: 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e   );.  if( pToken
6580: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
6590: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
65a0: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
65b0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
65c0: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
65d0: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
65e0: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
65f0: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
6600: 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c      assert( iVal
6610: 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ue>=0 );.    }. 
6620: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
6630: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
6640: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
6650: 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  )+nExtra);.  if(
6660: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   pNew ){.    mem
6670: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
6680: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
6690: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
66a0: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
66b0: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
66c0: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
66d0: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
66e0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
66f0: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
6700: 6c 75 65 7c 45 50 5f 4c 65 61 66 7c 28 69 56 61  lue|EP_Leaf|(iVa
6710: 6c 75 65 3f 45 50 5f 49 73 54 72 75 65 3a 45 50  lue?EP_IsTrue:EP
6720: 5f 49 73 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  _IsFalse);.     
6730: 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
6740: 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20  e = iValue;.    
6750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6760: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
6770: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
6780: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
6790: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
67a0: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
67b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
67c0: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
67d0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
67e0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
67f0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
6800: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
6810: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
6820: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
6830: 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33 49 73  ote && sqlite3Is
6840: 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54  quote(pNew->u.zT
6850: 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20  oken[0]) ){.    
6860: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
6870: 75 6f 74 65 45 78 70 72 28 70 4e 65 77 29 3b 0a  uoteExpr(pNew);.
6880: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6890: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  }.    }.#if SQLI
68a0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
68b0: 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48  H>0.    pNew->nH
68c0: 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69  eight = 1;.#endi
68d0: 66 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f  .  }.  return
68e0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
68f0: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  Allocate a new e
6900: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
6910: 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69  rom a zero-termi
6920: 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74  nated token that
6930: 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   has.** already 
6940: 62 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a  been dequoted..*
6950: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
6960: 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
6970: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
6980: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c  * Handle for sql
6990: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
69a0: 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29  () (may be null)
69b0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
69d0: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
69e0: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
69f0: 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20  ar *zToken      
6a00: 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  /* Token argumen
6a10: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
6a20: 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20  L */.){.  Token 
6a30: 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65  x;.  x.z = zToke
6a40: 6e 3b 0a 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74  n;.  x.n = sqlit
6a50: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65  e3Strlen30(zToke
6a60: 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  n);.  return sql
6a70: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
6a80: 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a  , op, &x, 0);.}.
6a90: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75  ./*.** Attach su
6aa0: 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64  btrees pLeft and
6ab0: 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20 45   pRight to the E
6ac0: 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a  xpr node pRoot..
6ad0: 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d  **.** If pRoot==
6ae0: 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
6af0: 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c  that a memory al
6b00: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
6b10: 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  as occurred..** 
6b20: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 65  In that case, de
6b30: 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65 65  lete the subtree
6b40: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
6b50: 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ht..*/.void sqli
6b60: 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62  te3ExprAttachSub
6b70: 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33  trees(.  sqlite3
6b80: 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52   *db,.  Expr *pR
6b90: 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65  oot,.  Expr *pLe
6ba0: 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft,.  Expr *pRig
6bb0: 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f  ht.){.  if( pRoo
6bc0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  t==0 ){.    asse
6bd0: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
6be0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69  iled );.    sqli
6bf0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6c00: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  , pLeft);.    sq
6c10: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6c20: 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  db, pRight);.  }
6c30: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52  else{.    if( pR
6c40: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52  ight ){.      pR
6c50: 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 52  oot->pRight = pR
6c60: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  ight;.      pRoo
6c70: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  t->flags |= EP_P
6c80: 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67 68  ropagate & pRigh
6c90: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
6ca0: 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b      if( pLeft ){
6cb0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c  .      pRoot->pL
6cc0: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  eft = pLeft;.   
6cd0: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
6ce0: 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  |= EP_Propagate 
6cf0: 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a  & pLeft->flags;.
6d00: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
6d10: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
6d20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
6d30: 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e 6f  ocate an Expr no
6d40: 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61  de which joins a
6d50: 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75  s many as two su
6d60: 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  btrees..**.** On
6d70: 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
6d80: 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65   subtrees can be
6d90: 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61   NULL.  Return a
6da0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6db0: 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65  new.** Expr node
6dc0: 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d  .  Or, if an OOM
6dd0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
6de0: 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  et pParse->db->m
6df0: 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20  allocFailed,.** 
6e00: 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65  free the subtree
6e10: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
6e20: 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  L..*/.Expr *sqli
6e30: 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73  te3PExpr(.  Pars
6e40: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6e50: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
6e60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
6e70: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6e80: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6e90: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78  n opcode */.  Ex
6ea0: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
6eb0: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70        /* Left op
6ec0: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
6ed0: 2a 70 52 69 67 68 74 20 20 20 20 20 20 20 20 20  *pRight         
6ee0: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
6ef0: 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  and */.){.  Expr
6f00: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
6f10: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
6f20: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
6f30: 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 69 66 28  of(Expr));.  if(
6f40: 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74   p ){.    memset
6f50: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  (p, 0, sizeof(Ex
6f60: 70 72 29 29 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  pr));.    p->op 
6f70: 3d 20 6f 70 20 26 20 30 78 66 66 3b 0a 20 20 20  = op & 0xff;.   
6f80: 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20   p->iAgg = -1;. 
6f90: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74     sqlite3ExprAt
6fa0: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
6fb0: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
6fc0: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
6fd0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
6fe0: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
6ff0: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65  ->nHeight);.  }e
7000: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
7010: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
7020: 65 2d 3e 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20  e->db, pLeft);. 
7030: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
7040: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7050: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20   pRight);.  }.  
7060: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
7070: 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74 20 74  ** Add pSelect t
7080: 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70 53 65  o the Expr.x.pSe
7090: 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c  lect field.  Or,
70a0: 20 69 66 20 70 45 78 70 72 20 69 73 20 4e 55 4c   if pExpr is NUL
70b0: 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d  L (due.** do a m
70c0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
70d0: 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e 20 64   failure) then d
70e0: 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c 65 63  elete the pSelec
70f0: 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69  t object..*/.voi
7100: 64 20 73 71 6c 69 74 65 33 50 45 78 70 72 41 64  d sqlite3PExprAd
7110: 64 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  dSelect(Parse *p
7120: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7130: 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  pr, Select *pSel
7140: 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70  ect){.  if( pExp
7150: 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  r ){.    pExpr->
7160: 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  x.pSelect = pSel
7170: 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ect;.    ExprSet
7180: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
7190: 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50 5f  EP_xIsSelect|EP_
71a0: 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 73  Subquery);.    s
71b0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
71c0: 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72  ghtAndFlags(pPar
71d0: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 65  se, pExpr);.  }e
71e0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
71f0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
7200: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
7210: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
7220: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7230: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d   pSelect);.  }.}
7240: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  .../*.** Join tw
7250: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
7260: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
7270: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
7280: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
7290: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
72a0: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
72b0: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
72c0: 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20  .** If one side 
72d0: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
72e0: 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e  the AND is known
72f0: 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68   to be false, th
7300: 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  en instead.** of
7310: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e   returning an AN
7320: 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75  D expression, ju
7330: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73  st return a cons
7340: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
7350: 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20  with.** a value 
7360: 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70  of false..*/.Exp
7370: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e  r *sqlite3ExprAn
7380: 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
7390: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
73a0: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 73  pr *pRight){.  s
73b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
73c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
73d0: 4c 65 66 74 3d 3d 30 20 20 29 7b 0a 20 20 20 20  Left==0  ){.    
73e0: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
73f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
7400: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
7410: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
7420: 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73  e if( ExprAlways
7430: 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20  False(pLeft) || 
7440: 45 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  ExprAlwaysFalse(
7450: 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73  pRight) ){.    s
7460: 71 6c 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41  qlite3ExprUnmapA
7470: 6e 64 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c  ndDelete(pParse,
7480: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c   pLeft);.    sql
7490: 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41 6e 64  ite3ExprUnmapAnd
74a0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70  Delete(pParse, p
74b0: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
74c0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
74d0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
74e0: 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
74f0: 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20  okens[0], 0);.  
7500: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
7510: 6e 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  n sqlite3PExpr(p
7520: 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 70  Parse, TK_AND, p
7530: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
7540: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
7550: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
7560: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
7570: 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  a function with 
7580: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75  multiple.** argu
7590: 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ments..*/.Expr *
75a0: 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74  sqlite3ExprFunct
75b0: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
75c0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
75d0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
75e0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
75f0: 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 41 72  List,      /* Ar
7600: 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20  gument list */. 
7610: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20   Token *pToken, 
7620: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
7630: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  f the function *
7640: 2f 0a 20 20 69 6e 74 20 65 44 69 73 74 69 6e 63  /.  int eDistinc
7650: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 46 5f  t         /* SF_
7660: 44 69 73 74 69 6e 63 74 20 6f 72 20 53 46 5f 41  Distinct or SF_A
7670: 4c 4c 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20 20  LL or 0 */.){.  
7680: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71  Expr *pNew;.  sq
7690: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
76a0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
76b0: 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e  ( pToken );.  pN
76c0: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
76d0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e  Alloc(db, TK_FUN
76e0: 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31  CTION, pToken, 1
76f0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
7700: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
7710: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
7720: 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f  , pList); /* Avo
7730: 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77  id memory leak w
7740: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
7750: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
7760: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
7770: 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 45 78 70  t && pList->nExp
7780: 72 20 3e 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  r > pParse->db->
7790: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
77a0: 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MIT_FUNCTION_ARG
77b0: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
77c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
77d0: 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75 6d   "too many argum
77e0: 65 6e 74 73 20 6f 6e 20 66 75 6e 63 74 69 6f 6e  ents on function
77f0: 20 25 54 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20   %T", pToken);. 
7800: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
7810: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45 78  st = pList;.  Ex
7820: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e  prSetProperty(pN
7830: 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29 3b  ew, EP_HasFunc);
7840: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
7850: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
7860: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
7870: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
7880: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
7890: 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b  s(pParse, pNew);
78a0: 0a 20 20 69 66 28 20 65 44 69 73 74 69 6e 63 74  .  if( eDistinct
78b0: 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  ==SF_Distinct ) 
78c0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
78d0: 70 4e 65 77 2c 20 45 50 5f 44 69 73 74 69 6e 63  pNew, EP_Distinc
78e0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  t);.  return pNe
78f0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
7900: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
7910: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
7920: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
7930: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
7940: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
7950: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
7960: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
7970: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
7980: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
7990: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
79a0: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
79b0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
79c0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
79d0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
79e0: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
79f0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
7a00: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
7a10: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
7a20: 74 20 74 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f  t too big to avo
7a30: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
7a40: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
7a50: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
7a60: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
7a70: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
7a80: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
7a90: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
7aa0: 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61  rm ":aaa", "@aaa
7ab0: 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65  ", or "$aaa" are
7ac0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61   assigned the sa
7ad0: 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20  me number.** as 
7ae0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73  the previous ins
7af0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  tance of the sam
7b00: 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20  e wildcard.  Or 
7b10: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
7b20: 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65  irst.** instance
7b30: 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64   of the wildcard
7b40: 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  , the next seque
7b50: 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  ntial variable n
7b60: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
7b70: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
7b80: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
7b90: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
7ba0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
7bb0: 78 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73  xpr, u32 n){.  s
7bc0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7bd0: 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74  rse->db;.  const
7be0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61   char *z;.  ynVa
7bf0: 72 20 78 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  r x;..  if( pExp
7c00: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
7c10: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
7c20: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
7c30: 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f   EP_IntValue|EP_
7c40: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
7c50: 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70  Only) );.  z = p
7c60: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
7c70: 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
7c80: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d  ;.  assert( z[0]
7c90: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7ca0: 20 6e 3d 3d 28 75 33 32 29 73 71 6c 69 74 65 33   n==(u32)sqlite3
7cb0: 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20  Strlen30(z) );. 
7cc0: 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a   if( z[1]==0 ){.
7cd0: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
7ce0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e  of the form "?".
7cf0: 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78    Assign the nex
7d00: 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  t variable numbe
7d10: 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  r */.    assert(
7d20: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20   z[0]=='?' );.  
7d30: 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b    x = (ynVar)(++
7d40: 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20  pParse->nVar);. 
7d50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
7d60: 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20 20 69  doAdd = 0;.    i
7d70: 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[0]=='?' ){.
7d80: 20 20 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: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
7db0: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
7dc0: 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  er and.      ** 
7dd0: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
7de0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
7df0: 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20  .      i64 i;.  
7e00: 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20      int bOk;.   
7e10: 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f     if( n==2 ){ /
7e20: 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46  *OPTIMIZATION-IF
7e30: 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 20 20  -TRUE*/.        
7e40: 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f  i = z[1]-'0';  /
7e50: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
7e60: 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73 69  e of ?N for a si
7e70: 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a  ngle digit N */.
7e80: 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b          bOk = 1;
7e90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7ea0: 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73        bOk = 0==s
7eb0: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b  qlite3Atoi64(&z[
7ec0: 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c  1], &i, n-1, SQL
7ed0: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
7ee0: 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
7ef0: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( i==0 );.     
7f00: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20   testcase( i==1 
7f10: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7f20: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
7f30: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7f40: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31  RIABLE_NUMBER]-1
7f50: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7f60: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
7f70: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7f80: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
7f90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b  );.      if( bOk
7fa0: 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e  ==0 || i<1 || i>
7fb0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7fc0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
7fd0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
7fe0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7ff0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
8000: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
8010: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
8020: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
8030: 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74        db->aLimit
8040: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
8050: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b  RIABLE_NUMBER]);
8060: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
8070: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 78  .      }.      x
8080: 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20   = (ynVar)i;.   
8090: 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d     if( x>pParse-
80a0: 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20  >nVar ){.       
80b0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
80c0: 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20 20 20  (int)x;.        
80d0: 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20  doAdd = 1;.     
80e0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
80f0: 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65  e3VListNumToName
8100: 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c  (pParse->pVList,
8110: 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   x)==0 ){.      
8120: 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20    doAdd = 1;.   
8130: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
8140: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
8150: 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20  ds like ":aaa", 
8160: 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61 22  "$aaa" or "@aaa"
8170: 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d  .  Reuse the sam
8180: 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20  e variable.     
8190: 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68   ** number as th
81a0: 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e  e prior appearan
81b0: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ce of the same n
81c0: 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e  ame, or if the n
81d0: 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ame.      ** has
81e0: 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20   never appeared 
81f0: 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68  before, reuse th
8200: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20  e same variable 
8210: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a  number.      */.
8220: 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72        x = (ynVar
8230: 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d  )sqlite3VListNam
8240: 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70  eToNum(pParse->p
8250: 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20  VList, z, n);.  
8260: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a      if( x==0 ){.
8270: 20 20 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56          x = (ynV
8280: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
8290: 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64 6f 41  ar);.        doA
82a0: 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  dd = 1;.      }.
82b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f      }.    if( do
82c0: 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Add ){.      pPa
82d0: 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71  rse->pVList = sq
82e0: 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28 64 62  lite3VListAdd(db
82f0: 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  , pParse->pVList
8300: 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20  , z, n, x);.    
8310: 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69  }.  }.  pExpr->i
8320: 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66  Column = x;.  if
8330: 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  ( x>db->aLimit[S
8340: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8350: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
8360: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8370: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
8380: 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62   many SQL variab
8390: 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  les");.  }.}../*
83a0: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
83b0: 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73  delete an expres
83c0: 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74  sion tree..*/.st
83d0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
83e0: 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65  LINE void sqlite
83f0: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71  3ExprDeleteNN(sq
8400: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
8410: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
8420: 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69  !=0 );.  /* Sani
8430: 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74  ty check: Assert
8440: 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c   that the IntVal
8450: 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  ue is non-negati
8460: 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  ve if it exists 
8470: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  */.  assert( !Ex
8480: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8490: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
84a0: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20   p->u.iValue>=0 
84b0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45  );..  assert( !E
84c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
84d0: 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 7c 7c  , EP_WinFunc) ||
84e0: 20 70 2d 3e 79 2e 70 57 69 6e 21 3d 30 20 7c 7c   p->y.pWin!=0 ||
84f0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
8500: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  d );.  assert( p
8510: 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op!=TK_FUNCTIO
8520: 4e 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  N || ExprHasProp
8530: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
8540: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
8550: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d  .          || p-
8560: 3e 79 2e 70 57 69 6e 3d 3d 30 20 7c 7c 20 45 78  >y.pWin==0 || Ex
8570: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8580: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a   EP_WinFunc) );.
8590: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
85a0: 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48 61  BUG.  if( ExprHa
85b0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
85c0: 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48 61  Leaf) && !ExprHa
85d0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
85e0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
85f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 65    assert( p->pLe
8600: 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ft==0 );.    ass
8610: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
8620: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8630: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30   p->x.pSelect==0
8640: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
8650: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
8660: 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f 6b  perty(p, (EP_Tok
8670: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29  enOnly|EP_Leaf))
8680: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45   ){.    /* The E
8690: 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e  xpr.x union is n
86a0: 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65  ever used at the
86b0: 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78   same time as Ex
86c0: 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20  pr.pRight */.   
86d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c   assert( p->x.pL
86e0: 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ist==0 || p->pRi
86f0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
8700: 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70 2d  ( p->pLeft && p-
8710: 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op!=TK_SELECT_C
8720: 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33 45  OLUMN ) sqlite3E
8730: 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20  xprDeleteNN(db, 
8740: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  p->pLeft);.    i
8750: 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a  f( p->pRight ){.
8760: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
8770: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8780: 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b  , EP_WinFunc) );
8790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
87a0: 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70  prDeleteNN(db, p
87b0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  ->pRight);.    }
87c0: 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73  else if( ExprHas
87d0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
87e0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
87f0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
8800: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8810: 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a 20 20  P_WinFunc) );.  
8820: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
8830: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
8840: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d  .pSelect);.    }
8850: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
8860: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
8870: 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  e(db, p->x.pList
8880: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
8890: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
88a0: 43 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  C.      if( Expr
88b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
88c0: 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20  P_WinFunc) ){.  
88d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e        sqlite3Win
88e0: 64 6f 77 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  dowDelete(db, p-
88f0: 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20 20 20 20  >y.pWin);.      
8900: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
8910: 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73   }.  if( ExprHas
8920: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
8930: 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74  emToken) ) sqlit
8940: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
8950: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  u.zToken);.  if(
8960: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
8970: 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20  y(p, EP_Static) 
8980: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
8990: 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20  FreeNN(db, p);. 
89a0: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
89b0: 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69  3ExprDelete(sqli
89c0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
89d0: 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71 6c  ){.  if( p ) sql
89e0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e  ite3ExprDeleteNN
89f0: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 20 49  (db, p);.}../* I
8a00: 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 52 65 6e  nvoke sqlite3Ren
8a10: 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 29 20 61  ameExprUnmap() a
8a20: 6e 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  nd sqlite3ExprDe
8a30: 6c 65 74 65 28 29 20 6f 6e 20 74 68 65 0a 2a 2a  lete() on the.**
8a40: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
8a50: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8a60: 55 6e 6d 61 70 41 6e 64 44 65 6c 65 74 65 28 50  UnmapAndDelete(P
8a70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
8a80: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  pr *p){.  if( p 
8a90: 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45  ){.    if( IN_RE
8aa0: 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
8ab0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61       sqlite3Rena
8ac0: 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50 61 72  meExprUnmap(pPar
8ad0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  se, p);.    }.  
8ae0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8af0: 65 74 65 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62  eteNN(pParse->db
8b00: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
8b10: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
8b20: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
8b30: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
8b40: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
8b50: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
8b60: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
8b70: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
8b80: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
8b90: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
8ba0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
8bb0: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
8bc0: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
8bd0: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
8be0: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
8bf0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
8c00: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
8c10: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
8c20: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8c30: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
8c40: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
8c50: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
8c60: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8c70: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
8c80: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
8c90: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
8ca0: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
8cb0: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
8cc0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
8cd0: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
8ce0: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
8cf0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
8d00: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8d10: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
8d20: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
8d30: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
8d40: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
8d50: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8d60: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
8d70: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
8d80: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
8d90: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
8da0: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
8db0: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
8dc0: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
8dd0: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
8de0: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
8df0: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
8e00: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
8e10: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
8e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
8e60: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
8e70: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
8e80: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
8e90: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
8ea0: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
8eb0: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
8ec0: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
8ed0: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
8ee0: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
8ef0: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
8f00: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
8f10: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
8f20: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
8f30: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
8f40: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
8f50: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
8f60: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
8f70: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
8f80: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
8f90: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
8fa0: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
8fb0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
8fc0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
8fd0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8fe0: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
8ff0: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
9000: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
9010: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
9020: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
9030: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
9040: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
9050: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
9060: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
9070: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
9080: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
9090: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
90a0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
90b0: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
90c0: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
90d0: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
90e0: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
90f0: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
9100: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
9110: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
9120: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
9130: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
9140: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
9150: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
9160: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
9170: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
9180: 20 74 68 65 20 45 78 70 72 20 6f 62 6a 65 63 74   the Expr object
9190: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
91a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
91b0: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
91c0: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
91d0: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
91e0: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
91f0: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
9200: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
9210: 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  n EXPRDUP_REDUCE
9220: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
9230: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
9240: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
9250: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
9260: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
9270: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
9280: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
9290: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
92a0: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
92b0: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
92c0: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
92d0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
92e0: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
92f0: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
9300: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
9310: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
9320: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
9330: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
9340: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
9350: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
9360: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
9370: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
9380: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
9390: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
93a0: 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46    assert( EXPR_F
93b0: 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29  ULLSIZE<=0xfff )
93c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66  ;.  assert( (0xf
93d0: 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ff & (EP_Reduced
93e0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d  |EP_TokenOnly))=
93f0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66  =0 );.  if( 0==f
9400: 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  lags || p->op==T
9410: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
9420: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9430: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
9440: 20 20 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f     || ExprHasPro
9450: 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46  perty(p, EP_WinF
9460: 75 6e 63 29 0a 23 65 6e 64 69 66 0a 20 20 29 7b  unc).#endif.  ){
9470: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50  .    nSize = EXP
9480: 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65  R_FULLSIZE;.  }e
9490: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
94a0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
94b0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
94c0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
94d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
94e0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
94f0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b   EP_FromJoin) );
9500: 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45   .    assert( !E
9510: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9520: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
9530: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
9540: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9550: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29  , EP_NoReduce) )
9560: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65  ;.    if( p->pLe
9570: 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74  ft || p->x.pList
9580: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
9590: 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  = EXPR_REDUCEDSI
95a0: 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b  ZE | EP_Reduced;
95b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
95c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
95d0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
95e0: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b  nSize = EXPR_TOK
95f0: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
9600: 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d  TokenOnly;.    }
9610: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53  .  }.  return nS
9620: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
9630: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
9640: 72 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e  rns the space in
9650: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
9660: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
9670: 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70  y .** of the Exp
9680: 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
9690: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
96a0: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  pr.u.zToken stri
96b0: 6e 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73  ng (if that.** s
96c0: 74 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64  tring is defined
96d0: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
96e0: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
96f0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
9700: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
9710: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53  yte = dupedExprS
9720: 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61  tructSize(p, fla
9730: 67 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69  gs) & 0xfff;.  i
9740: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
9750: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
9760: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
9770: 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  en ){.    nByte 
9780: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
9790: 33 30 4e 4e 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  30NN(p->u.zToken
97a0: 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  )+1;.  }.  retur
97b0: 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  n ROUND8(nByte);
97c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
97d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
97e0: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
97f0: 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69 63   create a duplic
9800: 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65  ate of the .** e
9810: 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64  xpression passed
9820: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
9830: 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f  gument. The seco
9840: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
9850: 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  .** mask contain
9860: 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58 20  ing EXPRDUP_XXX 
9870: 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
9880: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
9890: 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20 74  includes space t
98a0: 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  o create a copy 
98b0: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
98c0: 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64  ct.** itself and
98d0: 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66 65   the buffer refe
98e0: 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e  rred to by Expr.
98f0: 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79  u.zToken, if any
9900: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
9910: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c  XPRDUP_REDUCE fl
9920: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
9930: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
9940: 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70   includes .** sp
9950: 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65  ace to duplicate
9960: 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20   all Expr nodes 
9970: 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d  in the tree form
9980: 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74  ed by Expr.pLeft
9990: 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52   .** and Expr.pR
99a0: 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20 28  ight variables (
99b0: 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20  but not for any 
99c0: 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74  structures point
99d0: 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73  ed to or .** des
99e0: 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cended from the 
99f0: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20  Expr.x.pList or 
9a00: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76  Expr.x.pSelect v
9a10: 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74  ariables)..*/.st
9a20: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
9a30: 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  prSize(Expr *p, 
9a40: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
9a50: 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69  t nByte = 0;.  i
9a60: 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74  f( p ){.    nByt
9a70: 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64  e = dupedExprNod
9a80: 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  eSize(p, flags);
9a90: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 45  .    if( flags&E
9aa0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b  XPRDUP_REDUCE ){
9ab0: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
9ac0: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d  dupedExprSize(p-
9ad0: 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b  >pLeft, flags) +
9ae0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
9af0: 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29  ->pRight, flags)
9b00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9b10: 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f  turn nByte;.}../
9b20: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9b30: 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
9b40: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9b50: 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
9b60: 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69  f pzBuffer .** i
9b70: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
9b80: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73 73  *pzBuffer is ass
9b90: 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  umed to point to
9ba0: 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20   a buffer large 
9bb0: 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74  enough .** to st
9bc0: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20  ore the copy of 
9bd0: 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68  expression p, th
9be0: 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75  e copies of p->u
9bf0: 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61  .zToken.** (if a
9c00: 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20  pplicable), and 
9c10: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  the copies of th
9c20: 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  e p->pLeft and p
9c30: 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73 73  ->pRight express
9c40: 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  ions,.** if any.
9c50: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
9c60: 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  g, *pzBuffer is 
9c70: 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  set to the first
9c80: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a   byte past the.*
9c90: 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  * portion of the
9ca0: 20 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69   buffer copied i
9cb0: 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63  nto by this func
9cc0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
9cd0: 45 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71  Expr *exprDup(sq
9ce0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
9cf0: 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67 73  *p, int dupFlags
9d00: 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29  , u8 **pzBuffer)
9d10: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20  {.  Expr *pNew; 
9d20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
9d30: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
9d40: 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20    u8 *zAlloc;   
9d50: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
9d60: 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68 69  y space from whi
9d70: 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70 72  ch to build Expr
9d80: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32   object */.  u32
9d90: 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20 20   staticFlag;    
9da0: 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63 20     /* EP_Static 
9db0: 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62 74  if space not obt
9dc0: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
9dd0: 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  c */..  assert( 
9de0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
9df0: 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74  t( p );.  assert
9e00: 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c  ( dupFlags==0 ||
9e10: 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44   dupFlags==EXPRD
9e20: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 61  UP_REDUCE );.  a
9e30: 73 73 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d  ssert( pzBuffer=
9e40: 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d  =0 || dupFlags==
9e50: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
9e60: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
9e70: 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74  ut where to writ
9e80: 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73  e the new Expr s
9e90: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69  tructure. */.  i
9ea0: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
9eb0: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42     zAlloc = *pzB
9ec0: 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74 69  uffer;.    stati
9ed0: 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69  cFlag = EP_Stati
9ee0: 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
9ef0: 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  zAlloc = sqlite3
9f00: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
9f10: 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  , dupedExprSize(
9f20: 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a 20  p, dupFlags));. 
9f30: 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20     staticFlag = 
9f40: 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20  0;.  }.  pNew = 
9f50: 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a  (Expr *)zAlloc;.
9f60: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
9f70: 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69     /* Set nNewSi
9f80: 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61  ze to the size a
9f90: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
9fa0: 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
9fb0: 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20  ed to.    ** by 
9fc0: 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69  pNew. This is ei
9fd0: 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49  ther EXPR_FULLSI
9fe0: 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44  ZE, EXPR_REDUCED
9ff0: 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45  SIZE or.    ** E
a000: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
a010: 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74  E. nToken is set
a020: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
a030: 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64  f bytes consumed
a040: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63  .    ** by the c
a050: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
a060: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
a070: 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20  f any)..    */. 
a080: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
a090: 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20  d nStructSize = 
a0a0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
a0b0: 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29  ize(p, dupFlags)
a0c0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
a0d0: 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75  nNewSize = nStru
a0e0: 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a  ctSize & 0xfff;.
a0f0: 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a      int nToken;.
a100: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a110: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
a120: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
a130: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20  .zToken ){.     
a140: 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65   nToken = sqlite
a150: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
a160: 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20  Token) + 1;.    
a170: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f  }else{.      nTo
a180: 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ken = 0;.    }. 
a190: 20 20 20 69 66 28 20 64 75 70 46 6c 61 67 73 20     if( dupFlags 
a1a0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
a1b0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a1c0: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d  (p, EP_Reduced)=
a1d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  =0 );.      memc
a1e0: 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e  py(zAlloc, p, nN
a1f0: 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  ewSize);.    }el
a200: 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 53  se{.      u32 nS
a210: 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72 53  ize = (u32)exprS
a220: 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20 20  tructSize(p);.  
a230: 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f      memcpy(zAllo
a240: 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  c, p, nSize);.  
a250: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45 58      if( nSize<EX
a260: 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a  PR_FULLSIZE ){ .
a270: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
a280: 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30  zAlloc[nSize], 0
a290: 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d  , EXPR_FULLSIZE-
a2a0: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nSize);.      }.
a2b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
a2c0: 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64  t the EP_Reduced
a2d0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20  , EP_TokenOnly, 
a2e0: 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c  and EP_Static fl
a2f0: 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ags appropriatel
a300: 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  y. */.    pNew->
a310: 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65  flags &= ~(EP_Re
a320: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
a330: 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f  ly|EP_Static|EP_
a340: 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70  MemToken);.    p
a350: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53  New->flags |= nS
a360: 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f  tructSize & (EP_
a370: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a380: 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d  Only);.    pNew-
a390: 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63  >flags |= static
a3a0: 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  Flag;..    /* Co
a3b0: 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  py the p->u.zTok
a3c0: 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e  en string, if an
a3d0: 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54  y. */.    if( nT
a3e0: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 68  oken ){.      ch
a3f0: 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65  ar *zToken = pNe
a400: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
a410: 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65  har*)&zAlloc[nNe
a420: 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65  wSize];.      me
a430: 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e  mcpy(zToken, p->
a440: 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  u.zToken, nToken
a450: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
a460: 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c  ( 0==((p->flags|
a470: 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 28  pNew->flags) & (
a480: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
a490: 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20 20  Leaf)) ){.      
a4a0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
a4b0: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f  New->x.pSelect o
a4c0: 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20  r pNew->x.pList 
a4d0: 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20  member. */.     
a4e0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
a4f0: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
a500: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
a510: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
a520: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
a530: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  Dup(db, p->x.pSe
a540: 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29 3b  lect, dupFlags);
a550: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a560: 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c        pNew->x.pL
a570: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
a580: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
a590: 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61 67  x.pList, dupFlag
a5a0: 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
a5b0: 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69  }..    /* Fill i
a5c0: 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e  n pNew->pLeft an
a5d0: 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20  d pNew->pRight. 
a5e0: 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  */.    if( ExprH
a5f0: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
a600: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
a610: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 57 69 6e 46  okenOnly|EP_WinF
a620: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  unc) ){.      zA
a630: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a640: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a650: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a660: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a670: 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65  ty(pNew, EP_Toke
a680: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29  nOnly|EP_Leaf) )
a690: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a6a0: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a6b0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a6c0: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a6d0: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
a6e0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a6f0: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a700: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
a710: 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a  t = p->pRight ?.
a720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a730: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a740: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58  b, p->pRight, EX
a750: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a760: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a770: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
a780: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
a790: 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  NC.      if( Exp
a7a0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
a7b0: 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20  EP_WinFunc) ){. 
a7c0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70         pNew->y.p
a7d0: 57 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e  Win = sqlite3Win
a7e0: 64 6f 77 44 75 70 28 64 62 2c 20 70 4e 65 77 2c  dowDup(db, pNew,
a7f0: 20 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20   p->y.pWin);.   
a800: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
a810: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
a820: 77 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  w, EP_WinFunc) )
a830: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
a840: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
a850: 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20  WINDOWFUNC */.  
a860: 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72      if( pzBuffer
a870: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 42   ){.        *pzB
a880: 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a  uffer = zAlloc;.
a890: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
a8a0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  e{.      if( !Ex
a8b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
a8c0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
a8d0: 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20  _Leaf) ){.      
a8e0: 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d    if( pNew->op==
a8f0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
a900: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
a910: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70  ew->pLeft = p->p
a920: 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
a930: 61 73 73 65 72 74 28 20 70 2d 3e 69 43 6f 6c 75  assert( p->iColu
a940: 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  mn==0 || p->pRig
a950: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
a960: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
a970: 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d 3e 70  ight==0  || p->p
a980: 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66 74 20  Right==p->pLeft 
a990: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
a9a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
a9b0: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
a9c0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
a9d0: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
a9e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65     }.        pNe
a9f0: 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  w->pRight = sqli
aa00: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
aa10: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
aa20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
aa30: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
aa40: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
aa50: 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 65 70  nd return a deep
aa60: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62 6a   copy of the obj
aa70: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
aa80: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67  e second .** arg
aa90: 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d  ument. If an OOM
aaa0: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e   condition is en
aab0: 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20  countered, NULL 
aac0: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
aad0: 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  nd the db->mallo
aae0: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  cFailed flag set
aaf0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
ab00: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61  ITE_OMIT_CTE.sta
ab10: 74 69 63 20 57 69 74 68 20 2a 77 69 74 68 44 75  tic With *withDu
ab20: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  p(sqlite3 *db, W
ab30: 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68 20  ith *p){.  With 
ab40: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
ab50: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
ab60: 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20  3_int64 nByte = 
ab70: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a  sizeof(*p) + siz
ab80: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
ab90: 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20  p->nCte-1);.    
aba0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  pRet = sqlite3Db
abb0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
abc0: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
abd0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Ret ){.      int
abe0: 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   i;.      pRet->
abf0: 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a  nCte = p->nCte;.
ac00: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ac10: 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
ac20: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
ac30: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
ac40: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
ac50: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  , p->a[i].pSelec
ac60: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 0);.        p
ac70: 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20  Ret->a[i].pCols 
ac80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
ac90: 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  tDup(db, p->a[i]
aca0: 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20  .pCols, 0);.    
acb0: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a      pRet->a[i].z
acc0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
acd0: 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  StrDup(db, p->a[
ace0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
acf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
ad00: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
ad10: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74  lse.# define wit
ad20: 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64  hDup(x,y) 0.#end
ad30: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
ad40: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
ad50: 4e 43 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 61 74  NC./*.** The gat
ad60: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
ad70: 28 29 20 70 72 6f 63 65 64 75 72 65 20 61 6e 64  () procedure and
ad80: 20 69 74 73 20 68 65 6c 70 65 72 20 72 6f 75 74   its helper rout
ad90: 69 6e 65 0a 2a 2a 20 67 61 74 68 65 72 53 65 6c  ine.** gatherSel
ada0: 65 63 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62 61  ectWindowsCallba
adb0: 63 6b 28 29 20 61 72 65 20 75 73 65 64 20 74 6f  ck() are used to
adc0: 20 73 63 61 6e 20 61 6c 6c 20 74 68 65 20 65 78   scan all the ex
add0: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 6e 20  pressions.** an 
ade0: 61 20 6e 65 77 6c 79 20 64 75 70 6c 69 63 61 74  a newly duplicat
adf0: 65 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ed SELECT statem
ae00: 65 6e 74 20 61 6e 64 20 67 61 74 68 65 72 20 61  ent and gather a
ae10: 6c 6c 20 6f 66 20 74 68 65 20 57 69 6e 64 6f 77  ll of the Window
ae20: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 66 6f 75 6e  .** objects foun
ae30: 64 20 74 68 65 72 65 2c 20 61 73 73 65 6d 62 6c  d there, assembl
ae40: 69 6e 67 20 74 68 65 6d 20 6f 6e 74 6f 20 74 68  ing them onto th
ae50: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 61 74  e linked list at
ae60: 20 53 65 6c 65 63 74 2d 3e 70 57 69 6e 2e 0a 2a   Select->pWin..*
ae70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 61 74  /.static int gat
ae80: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
ae90: 43 61 6c 6c 62 61 63 6b 28 57 61 6c 6b 65 72 20  Callback(Walker 
aea0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
aeb0: 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
aec0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
aed0: 54 49 4f 4e 20 26 26 20 45 78 70 72 48 61 73 50  TION && ExprHasP
aee0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
aef0: 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20  P_WinFunc) ){.  
af00: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
af10: 74 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  t = pWalker->u.p
af20: 53 65 6c 65 63 74 3b 0a 20 20 20 20 57 69 6e 64  Select;.    Wind
af30: 6f 77 20 2a 70 57 69 6e 20 3d 20 70 45 78 70 72  ow *pWin = pExpr
af40: 2d 3e 79 2e 70 57 69 6e 3b 0a 20 20 20 20 61 73  ->y.pWin;.    as
af50: 73 65 72 74 28 20 70 57 69 6e 20 29 3b 0a 20 20  sert( pWin );.  
af60: 20 20 61 73 73 65 72 74 28 20 49 73 57 69 6e 64    assert( IsWind
af70: 6f 77 46 75 6e 63 28 70 45 78 70 72 29 20 29 3b  owFunc(pExpr) );
af80: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
af90: 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20  ->pWin ){.      
afa0: 2a 70 53 65 6c 65 63 74 2d 3e 70 57 69 6e 2d 3e  *pSelect->pWin->
afb0: 70 70 54 68 69 73 20 3d 20 70 53 65 6c 65 63 74  ppThis = pSelect
afc0: 2d 3e 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  ->pWin->pNextWin
afd0: 3b 0a 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d  ;.      pSelect-
afe0: 3e 70 57 69 6e 2d 3e 70 70 54 68 69 73 20 3d 20  >pWin->ppThis = 
aff0: 26 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 3b  &pWin->pNextWin;
b000: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 2d  .    }.    pWin-
b010: 3e 70 4e 65 78 74 57 69 6e 20 3d 20 70 53 65 6c  >pNextWin = pSel
b020: 65 63 74 2d 3e 70 57 69 6e 3b 0a 20 20 20 20 70  ect->pWin;.    p
b030: 57 69 6e 2d 3e 70 70 54 68 69 73 20 3d 20 26 70  Win->ppThis = &p
b040: 53 65 6c 65 63 74 2d 3e 70 57 69 6e 3b 0a 20 20  Select->pWin;.  
b050: 20 20 70 53 65 6c 65 63 74 2d 3e 70 57 69 6e 20    pSelect->pWin 
b060: 3d 20 70 57 69 6e 3b 0a 20 20 7d 0a 20 20 72 65  = pWin;.  }.  re
b070: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
b080: 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  e;.}.static int 
b090: 67 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64  gatherSelectWind
b0a0: 6f 77 73 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  owsSelectCallbac
b0b0: 6b 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  k(Walker *pWalke
b0c0: 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
b0d0: 20 72 65 74 75 72 6e 20 70 3d 3d 70 57 61 6c 6b   return p==pWalk
b0e0: 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 20 3f 20  er->u.pSelect ? 
b0f0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 3a 20 57  WRC_Continue : W
b100: 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 73 74 61 74  RC_Prune;.}.stat
b110: 69 63 20 76 6f 69 64 20 67 61 74 68 65 72 53 65  ic void gatherSe
b120: 6c 65 63 74 57 69 6e 64 6f 77 73 28 53 65 6c 65  lectWindows(Sele
b130: 63 74 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72  ct *p){.  Walker
b140: 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
b150: 6c 62 61 63 6b 20 3d 20 67 61 74 68 65 72 53 65  lback = gatherSe
b160: 6c 65 63 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62  lectWindowsCallb
b170: 61 63 6b 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ack;.  w.xSelect
b180: 43 61 6c 6c 62 61 63 6b 20 3d 20 67 61 74 68 65  Callback = gathe
b190: 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 53 65  rSelectWindowsSe
b1a0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 3b 0a 20 20  lectCallback;.  
b1b0: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
b1c0: 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 70 50 61 72  k2 = 0;.  w.pPar
b1d0: 73 65 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53  se = 0;.  w.u.pS
b1e0: 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c  elect = p;.  sql
b1f0: 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
b200: 77 2c 20 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  w, p);.}.#endif.
b210: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
b220: 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72  owing group of r
b230: 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65  outines make dee
b240: 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72  p copies of expr
b250: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72  essions,.** expr
b260: 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44  ession lists, ID
b270: 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65   lists, and sele
b280: 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
b290: 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a  The copies can.*
b2a0: 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79  * be deleted (by
b2b0: 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f   being passed to
b2c0: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
b2d0: 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f  e ...Delete() ro
b2e0: 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f  utines).** witho
b2f0: 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65  ut effecting the
b300: 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a   originals..**.*
b310: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
b320: 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73   list, ID, and s
b330: 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75  ource lists retu
b340: 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  rn by sqlite3Exp
b350: 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73  rListDup(),.** s
b360: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
b370: 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72  ), and sqlite3Sr
b380: 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e  cListDup() can n
b390: 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78  ot be further ex
b3a0: 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75  panded .** by su
b3b0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
b3c0: 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70  o sqlite*ListApp
b3d0: 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a  end() routines..
b3e0: 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73  **.** Any tables
b3f0: 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73   that the SrcLis
b400: 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  t might point to
b410: 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61   are not duplica
b420: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ted..**.** The f
b430: 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63  lags parameter c
b440: 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e  ontains a combin
b450: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50  ation of the EXP
b460: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
b470: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
b480: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
b490: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73   set, then the s
b4a0: 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
b4b0: 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61  d is a.** trunca
b4c0: 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ted version of t
b4d0: 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74  he usual Expr st
b4e0: 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
b4f0: 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a  l be stored as.*
b500: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  * part of the in
b510: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
b520: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
b530: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
b540: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
b550: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
b560: 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  db, Expr *p, int
b570: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
b580: 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
b590: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
b5a0: 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  DUCE );.  return
b5b0: 20 70 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c   p ? exprDup(db,
b5c0: 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20   p, flags, 0) : 
b5d0: 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73  0;.}.ExprList *s
b5e0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
b5f0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
b600: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
b610: 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69  flags){.  ExprLi
b620: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75  st *pNew;.  stru
b630: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
b640: 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74   *pItem, *pOldIt
b650: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  em;.  int i;.  E
b660: 78 70 72 20 2a 70 50 72 69 6f 72 53 65 6c 65 63  xpr *pPriorSelec
b670: 74 43 6f 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65  tCol = 0;.  asse
b680: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
b690: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
b6a0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
b6b0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
b6c0: 4e 28 64 62 2c 20 73 71 6c 69 74 65 33 44 62 4d  N(db, sqlite3DbM
b6d0: 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 29  allocSize(db, p)
b6e0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
b6f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b700: 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e  New->nExpr = p->
b710: 6e 45 78 70 72 3b 0a 20 20 70 49 74 65 6d 20 3d  nExpr;.  pItem =
b720: 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64   pNew->a;.  pOld
b730: 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66  Item = p->a;.  f
b740: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
b750: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
b760: 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20  , pOldItem++){. 
b770: 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70     Expr *pOldExp
b780: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45  r = pOldItem->pE
b790: 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
b7a0: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 70 49 74  NewExpr;.    pIt
b7b0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  em->pExpr = sqli
b7c0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b7d0: 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b  OldExpr, flags);
b7e0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70  .    if( pOldExp
b7f0: 72 20 0a 20 20 20 20 20 26 26 20 70 4f 6c 64 45  r .     && pOldE
b800: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
b810: 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26  CT_COLUMN.     &
b820: 26 20 28 70 4e 65 77 45 78 70 72 20 3d 20 70 49  & (pNewExpr = pI
b830: 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d 30 20 0a  tem->pExpr)!=0 .
b840: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
b850: 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69  ert( pNewExpr->i
b860: 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30  Column==0 || i>0
b870: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e   );.      if( pN
b880: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
b890: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
b8a0: 73 65 72 74 28 20 70 4f 6c 64 45 78 70 72 2d 3e  sert( pOldExpr->
b8b0: 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78 70 72 2d  pLeft==pOldExpr-
b8c0: 3e 70 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20  >pRight );.     
b8d0: 20 20 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43     pPriorSelectC
b8e0: 6f 6c 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70  ol = pNewExpr->p
b8f0: 4c 65 66 74 20 3d 20 70 4e 65 77 45 78 70 72 2d  Left = pNewExpr-
b900: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 7d  >pRight;.      }
b910: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
b920: 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
b930: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
b940: 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 21 3d 30 20  em[-1].pExpr!=0 
b950: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
b960: 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f  t( pNewExpr->iCo
b970: 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e  lumn==pItem[-1].
b980: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31  pExpr->iColumn+1
b990: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
b9a0: 72 74 28 20 70 50 72 69 6f 72 53 65 6c 65 63 74  rt( pPriorSelect
b9b0: 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70  Col==pItem[-1].p
b9c0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  Expr->pLeft );. 
b9d0: 20 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 2d         pNewExpr-
b9e0: 3e 70 4c 65 66 74 20 3d 20 70 50 72 69 6f 72 53  >pLeft = pPriorS
b9f0: 65 6c 65 63 74 43 6f 6c 3b 0a 20 20 20 20 20 20  electCol;.      
ba00: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65  }.    }.    pIte
ba10: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
ba20: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
ba30: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
ba40: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
ba50: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
ba60: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
ba70: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
ba80: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d  tem->sortOrder =
ba90: 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f   pOldItem->sortO
baa0: 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  rder;.    pItem-
bab0: 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70  >done = 0;.    p
bac0: 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62  Item->bSpanIsTab
bad0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70   = pOldItem->bSp
bae0: 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74  anIsTab;.    pIt
baf0: 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 3d  em->bSorterRef =
bb00: 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 6f 72 74   pOldItem->bSort
bb10: 65 72 52 65 66 3b 0a 20 20 20 20 70 49 74 65 6d  erRef;.    pItem
bb20: 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ->u = pOldItem->
bb30: 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  u;.  }.  return 
bb40: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pNew;.}../*.** I
bb50: 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67  f cursors, trigg
bb60: 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73  ers, views and s
bb70: 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c  ubqueries are al
bb80: 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a  l omitted from.*
bb90: 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65  * the build, the
bba0: 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  n none of the fo
bbb0: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
bbc0: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a  , except for .**
bbd0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
bbe0: 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c  p(), can be call
bbf0: 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ed. sqlite3Selec
bc00: 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69  tDup() is someti
bc10: 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  mes.** called wi
bc20: 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65  th a NULL argume
bc30: 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  nt..*/.#if !defi
bc40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
bc50: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
bc60: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
bc70: 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65  IGGER) \. || !de
bc80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
bc90: 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c  T_SUBQUERY).SrcL
bca0: 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
bcb0: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
bcc0: 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  db, SrcList *p, 
bcd0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72  int flags){.  Sr
bce0: 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  cList *pNew;.  i
bcf0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74  nt i;.  int nByt
bd00: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  e;.  assert( db!
bd10: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
bd20: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
bd30: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
bd40: 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f  ) + (p->nSrc>0 ?
bd50: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29   sizeof(p->a[0])
bd60: 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a   * (p->nSrc-1) :
bd70: 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71   0);.  pNew = sq
bd80: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
bd90: 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  NN(db, nByte );.
bda0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
bdb0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
bdc0: 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e  ->nSrc = pNew->n
bdd0: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  Alloc = p->nSrc;
bde0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
bdf0: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
be00: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
be10: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
be20: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
be30: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
be40: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
be50: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
be60: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
be70: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65   pNewItem->pSche
be80: 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ma = pOldItem->p
be90: 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77  Schema;.    pNew
bea0: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
beb0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
bec0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
bed0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
bee0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
bef0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
bf00: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
bf10: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
bf20: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
bf30: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
bf40: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c  b, pOldItem->zAl
bf50: 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ias);.    pNewIt
bf60: 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65  em->fg = pOldIte
bf70: 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77 49  m->fg;.    pNewI
bf80: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
bf90: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
bfa0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
bfb0: 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f  addrFillSub = pO
bfc0: 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  ldItem->addrFill
bfd0: 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Sub;.    pNewIte
bfe0: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70  m->regReturn = p
bff0: 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  OldItem->regRetu
c000: 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  rn;.    if( pNew
c010: 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
c020: 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20 70 4e  edBy ){.      pN
c030: 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65  ewItem->u1.zInde
c040: 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 44  xedBy = sqlite3D
c050: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
c060: 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
c070: 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  dBy);.    }.    
c080: 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64  pNewItem->pIBInd
c090: 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ex = pOldItem->p
c0a0: 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  IBIndex;.    if(
c0b0: 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73   pNewItem->fg.is
c0c0: 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  TabFunc ){.     
c0d0: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46   pNewItem->u1.pF
c0e0: 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20 20 20  uncArg = .      
c0f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
c100: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
c110: 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
c120: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  , flags);.    }.
c130: 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49      pTab = pNewI
c140: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64  tem->pTab = pOld
c150: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
c160: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
c170: 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b    pTab->nTabRef+
c180: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  +;.    }.    pNe
c190: 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  wItem->pSelect =
c1a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
c1b0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
c1c0: 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b  pSelect, flags);
c1d0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
c1e0: 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  On = sqlite3Expr
c1f0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c200: 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20  ->pOn, flags);. 
c210: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
c220: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
c230: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
c240: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
c250: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55    pNewItem->colU
c260: 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sed = pOldItem->
c270: 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72  colUsed;.  }.  r
c280: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64  eturn pNew;.}.Id
c290: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
c2a0: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
c2b0: 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a  db, IdList *p){.
c2c0: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
c2d0: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
c2e0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
c2f0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
c300: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
c310: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
c320: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
c330: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
c340: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
c350: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d    pNew->nId = p-
c360: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
c370: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c380: 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49  cRawNN(db, p->nI
c390: 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  d*sizeof(p->a[0]
c3a0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ) );.  if( pNew-
c3b0: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  >a==0 ){.    sql
c3c0: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
c3d0: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
c3e0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e  rn 0;.  }.  /* N
c3f0: 6f 74 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ote that because
c400: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
c410: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
c420: 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20  p->a[] is not.  
c430: 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61  ** necessarily a
c440: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73   power of two, s
c450: 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
c460: 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20  nd() may not be 
c470: 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74  called.  ** on t
c480: 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 72 65  he duplicate cre
c490: 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
c4a0: 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28  ction. */.  for(
c4b0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69  i=0; i<p->nId; i
c4c0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
c4d0: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  IdList_item *pNe
c4e0: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
c4f0: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
c500: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  IdList_item *pOl
c510: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
c520: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
c530: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
c540: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
c550: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
c560: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20    pNewItem->idx 
c570: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b  = pOldItem->idx;
c580: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
c590: 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71  ew;.}.Select *sq
c5a0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
c5b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
c5c0: 63 74 20 2a 70 44 75 70 2c 20 69 6e 74 20 66 6c  ct *pDup, int fl
c5d0: 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  ags){.  Select *
c5e0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65  pRet = 0;.  Sele
c5f0: 63 74 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ct *pNext = 0;. 
c600: 20 53 65 6c 65 63 74 20 2a 2a 70 70 20 3d 20 26   Select **pp = &
c610: 70 52 65 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  pRet;.  Select *
c620: 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  p;..  assert( db
c630: 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  !=0 );.  for(p=p
c640: 44 75 70 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72  Dup; p; p=p->pPr
c650: 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
c660: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
c670: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
c680: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  , sizeof(*p) );.
c690: 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
c6a0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4e 65  ) break;.    pNe
c6b0: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
c6c0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
c6d0: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c  b, p->pEList, fl
c6e0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
c6f0: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
c700: 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  cListDup(db, p->
c710: 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20  pSrc, flags);.  
c720: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
c730: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
c740: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66  db, p->pWhere, f
c750: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d  lags);.    pNew-
c760: 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
c770: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
c780: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
c790: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c7a0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
c7b0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
c7c0: 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73  ->pHaving, flags
c7d0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72  );.    pNew->pOr
c7e0: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
c7f0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
c800: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67  ->pOrderBy, flag
c810: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70  s);.    pNew->op
c820: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e   = p->op;.    pN
c830: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78  ew->pNext = pNex
c840: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  t;.    pNew->pPr
c850: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  ior = 0;.    pNe
c860: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
c870: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
c880: 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29  ->pLimit, flags)
c890: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  ;.    pNew->iLim
c8a0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  it = 0;.    pNew
c8b0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
c8c0: 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67     pNew->selFlag
c8d0: 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  s = p->selFlags 
c8e0: 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65  & ~SF_UsesEpheme
c8f0: 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ral;.    pNew->a
c900: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
c910: 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61   -1;.    pNew->a
c920: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
c930: 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e   -1;.    pNew->n
c940: 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e  SelectRow = p->n
c950: 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 70  SelectRow;.    p
c960: 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74  New->pWith = wit
c970: 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74  hDup(db, p->pWit
c980: 68 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  h);.#ifndef SQLI
c990: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
c9a0: 4e 43 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69  NC.    pNew->pWi
c9b0: 6e 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  n = 0;.    pNew-
c9c0: 3e 70 57 69 6e 44 65 66 6e 20 3d 20 73 71 6c 69  >pWinDefn = sqli
c9d0: 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 75 70  te3WindowListDup
c9e0: 28 64 62 2c 20 70 2d 3e 70 57 69 6e 44 65 66 6e  (db, p->pWinDefn
c9f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57  );.    if( p->pW
ca00: 69 6e 20 29 20 67 61 74 68 65 72 53 65 6c 65 63  in ) gatherSelec
ca10: 74 57 69 6e 64 6f 77 73 28 70 4e 65 77 29 3b 0a  tWindows(pNew);.
ca20: 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65 77 2d  #endif.    pNew-
ca30: 3e 73 65 6c 49 64 20 3d 20 70 2d 3e 73 65 6c 49  >selId = p->selI
ca40: 64 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 4e 65  d;.    *pp = pNe
ca50: 77 3b 0a 20 20 20 20 70 70 20 3d 20 26 70 4e 65  w;.    pp = &pNe
ca60: 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  w->pPrior;.    p
ca70: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  Next = pNew;.  }
ca80: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
ca90: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
caa0: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
cab0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
cac0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c  elect *p, int fl
cad0: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
cae0: 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  p==0 );.  return
caf0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   0;.}.#endif.../
cb00: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
cb10: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
cb20: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
cb30: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
cb40: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
cb50: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
cb60: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
cb70: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
cb80: 2a 20 54 68 65 20 70 4c 69 73 74 20 61 72 67 75  * The pList argu
cb90: 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 69 74  ment must be eit
cba0: 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20 70 6f  her NULL or a po
cbb0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 45 78 70 72  inter to an Expr
cbc0: 4c 69 73 74 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  List.** obtained
cbd0: 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 61   from a prior ca
cbe0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ll to sqlite3Exp
cbf0: 72 4c 69 73 74 41 70 70 65 6e 64 28 29 2e 20 20  rListAppend().  
cc00: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
cc10: 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20  may not be used 
cc20: 77 69 74 68 20 61 6e 20 45 78 70 72 4c 69 73 74  with an ExprList
cc30: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
cc40: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
cc50: 70 28 29 2e 0a 2a 2a 20 52 65 61 73 6f 6e 3a 20  p()..** Reason: 
cc60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
cc70: 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 6e  sumes that the n
cc80: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 69  umber of slots i
cc90: 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 0a 2a 2a 20  n pList->a[].** 
cca0: 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  is a power of tw
ccb0: 6f 2e 20 20 54 68 61 74 20 69 73 20 74 72 75 65  o.  That is true
ccc0: 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72   for sqlite3Expr
ccd0: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 65 74  ListAppend() ret
cce0: 75 72 6e 73 0a 2a 2a 20 62 75 74 20 69 73 20 6e  urns.** but is n
ccf0: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74  ot necessarily t
cd00: 72 75 65 20 66 72 6f 6d 20 74 68 65 20 72 65 74  rue from the ret
cd10: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  urn value of sql
cd20: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
cd30: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  )..**.** If a me
cd40: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
cd50: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
cd60: 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73  e entire list is
cd70: 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55   freed and.** NU
cd80: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  LL is returned. 
cd90: 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20   If non-NULL is 
cda0: 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69  returned, then i
cdb0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  t is guaranteed.
cdc0: 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ** that the new 
cdd0: 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65 73  entry was succes
cde0: 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e  sfully appended.
cdf0: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
ce00: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
ce10: 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  end(.  Parse *pP
ce20: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
ce30: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
ce40: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
ce50: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
ce60: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
ce70: 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74  to append. Might
ce80: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
ce90: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
cea0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
ceb0: 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ion to be append
cec0: 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  ed. Might be NUL
ced0: 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  L */.){.  struct
cee0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
cef0: 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
cf00: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
cf10: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
cf20: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
cf30: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
cf40: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
cf50: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
cf60: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
cf70: 0a 20 20 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 20 20 67 6f 74 6f 20  0 ){.      goto 
cf90: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
cfa0: 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d    pList->nExpr =
cfb0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
cfc0: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20  (pList->nExpr & 
cfd0: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  (pList->nExpr-1)
cfe0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  )==0 ){.    Expr
cff0: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
d000: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
d010: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73  Realloc(db, pLis
d020: 74 2c 20 0a 20 20 20 20 20 20 20 20 20 73 69 7a  t, .         siz
d030: 65 6f 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a 28  eof(*pList)+(2*(
d040: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 4c  sqlite3_int64)pL
d050: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 2a 73 69  ist->nExpr-1)*si
d060: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
d070: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ));.    if( pNew
d080: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
d090: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
d0a0: 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77      pList = pNew
d0b0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
d0c0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
d0d0: 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61 73 73  >nExpr++];.  ass
d0e0: 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73 74  ert( offsetof(st
d0f0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
d100: 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65 6f  em,zName)==sizeo
d110: 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20  f(pItem->pExpr) 
d120: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
d130: 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70  setof(struct Exp
d140: 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78 70 72  rList_item,pExpr
d150: 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74  )==0 );.  memset
d160: 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 30  (&pItem->zName,0
d170: 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 2d  ,sizeof(*pItem)-
d180: 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20  offsetof(struct 
d190: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e  ExprList_item,zN
d1a0: 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  ame));.  pItem->
d1b0: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
d1c0: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
d1d0: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
d1e0: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
d1f0: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
d200: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
d210: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
d220: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
d230: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
d240: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
d250: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
d260: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e  }../*.** pColumn
d270: 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72 6d  s and pExpr form
d280: 20 61 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e   a vector assign
d290: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 70 61  ment which is pa
d2a0: 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a 2a 2a  rt of the SET.**
d2b0: 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55 50   clause of an UP
d2c0: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  DATE statement. 
d2d0: 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
d2e0: 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c 63 29  *        (a,b,c)
d2f0: 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c   = (expr1,expr2,
d300: 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20 20  expr3).** Or:   
d310: 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c 45   (a,b,c) = (SELE
d320: 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e  CT x,y,z FROM ..
d330: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ..).**.** For ea
d340: 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 76  ch term of the v
d350: 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74  ector assignment
d360: 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65 6e 74  , append new ent
d370: 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65  ries to the.** e
d380: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
d390: 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20 63 61  List.  In the ca
d3a0: 73 65 20 6f 66 20 61 20 73 75 62 71 75 65 72 79  se of a subquery
d3b0: 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61 70 70   on the RHS, app
d3c0: 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54  end.** TK_SELECT
d3d0: 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69  _COLUMN expressi
d3e0: 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ons..*/.ExprList
d3f0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
d400: 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28 0a 20  tAppendVector(. 
d410: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d420: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
d430: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
d440: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
d450: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
d460: 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e  o which to appen
d470: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
d480: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43   */.  IdList *pC
d490: 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20  olumns,      /* 
d4a0: 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66  List of names of
d4b0: 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73 73 69   LHS of the assi
d4c0: 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  gnment */.  Expr
d4d0: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
d4e0: 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65 78 70     /* Vector exp
d4f0: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
d500: 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65  pended. Might be
d510: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71   NULL */.){.  sq
d520: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
d530: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b  se->db;.  int n;
d540: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
d550: 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74 20 3f  iFirst = pList ?
d560: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
d570: 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73  0;.  /* pColumns
d580: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55 4c   can only be NUL
d590: 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 20  L due to an OOM 
d5a0: 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20  but an OOM will 
d5b0: 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65 78  cause an.  ** ex
d5c0: 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  it prior to this
d5d0: 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67 20 69   routine being i
d5e0: 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28 20  nvoked */.  if( 
d5f0: 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d  NEVER(pColumns==
d600: 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72  0) ) goto vector
d610: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20  _append_error;. 
d620: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
d630: 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65  goto vector_appe
d640: 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  nd_error;..  /* 
d650: 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20  If the RHS is a 
d660: 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77 65 20  vector, then we 
d670: 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  can immediately 
d680: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61  check to see tha
d690: 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a 65  t .  ** the size
d6a0: 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e 64 20   of the RHS and 
d6b0: 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75 74 20  LHS match.  But 
d6c0: 69 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20  if the RHS is a 
d6d0: 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20 77 69  SELECT, .  ** wi
d6e0: 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20 69 6e  ldcards ("*") in
d6f0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d700: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 6d 75  of the SELECT mu
d710: 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62  st be expanded b
d720: 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 63 61  efore.  ** we ca
d730: 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20 63 68  n do the size ch
d740: 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20 74 68  eck, so defer th
d750: 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75 6e 74  e size check unt
d760: 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
d770: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  on..  */.  if( p
d780: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c  Expr->op!=TK_SEL
d790: 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e 73 2d  ECT && pColumns-
d7a0: 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74 65 33  >nId!=(n=sqlite3
d7b0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
d7c0: 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20 73 71  Expr)) ){.    sq
d7d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d7e0: 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e  arse, "%d column
d7f0: 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61  s assigned %d va
d800: 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20  lues",.         
d810: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 75             pColu
d820: 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20  mns->nId, n);.  
d830: 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70    goto vector_ap
d840: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  pend_error;.  }.
d850: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
d860: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b  olumns->nId; i++
d870: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 75  ){.    Expr *pSu
d880: 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  bExpr = sqlite3E
d890: 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c  xprForVectorFiel
d8a0: 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  d(pParse, pExpr,
d8b0: 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d   i);.    pList =
d8c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d8d0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
d8e0: 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72 29 3b  List, pSubExpr);
d8f0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
d900: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d910: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 69 46  pList->nExpr==iF
d920: 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20 20 20  irst+i+1 );.    
d930: 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74    pList->a[pList
d940: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
d950: 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69   = pColumns->a[i
d960: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70  ].zName;.      p
d970: 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e  Columns->a[i].zN
d980: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ame = 0;.    }. 
d990: 20 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d   }..  if( !db->m
d9a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 70  allocFailed && p
d9b0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
d9c0: 45 43 54 20 26 26 20 41 4c 57 41 59 53 28 70 4c  ECT && ALWAYS(pL
d9d0: 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 45  ist!=0) ){.    E
d9e0: 78 70 72 20 2a 70 46 69 72 73 74 20 3d 20 70 4c  xpr *pFirst = pL
d9f0: 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70  ist->a[iFirst].p
da00: 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
da10: 28 20 70 46 69 72 73 74 21 3d 30 20 29 3b 0a 20  ( pFirst!=0 );. 
da20: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73     assert( pFirs
da30: 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  t->op==TK_SELECT
da40: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
da50: 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
da60: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
da70: 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73 6f 20  nt in pRight so 
da80: 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  it will be delet
da90: 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 73  ed when.    ** s
daa0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
dab0: 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lete() is called
dac0: 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e   */.    pFirst->
dad0: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 3b 0a  pRight = pExpr;.
dae0: 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 0a      pExpr = 0;..
daf0: 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20      /* Remember 
db00: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
db10: 4c 48 53 20 69 6e 20 69 54 61 62 6c 65 20 73 6f  LHS in iTable so
db20: 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 68 65   that we can che
db30: 63 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ck that.    ** t
db40: 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 73  he RHS and LHS s
db50: 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72 69 6e  izes match durin
db60: 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  g code generatio
db70: 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74  n. */.    pFirst
db80: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f 6c 75  ->iTable = pColu
db90: 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76  mns->nId;.  }..v
dba0: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
dbb0: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  or:.  sqlite3Exp
dbc0: 72 55 6e 6d 61 70 41 6e 64 44 65 6c 65 74 65 28  rUnmapAndDelete(
dbd0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
dbe0: 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
dbf0: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d  elete(db, pColum
dc00: 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  ns);.  return pL
dc10: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ist;.}../*.** Se
dc20: 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72  t the sort order
dc30: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6c   for the last el
dc40: 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69 76  ement on the giv
dc50: 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a  en ExprList..*/.
dc60: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
dc70: 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72  ListSetSortOrder
dc80: 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e  (ExprList *p, in
dc90: 74 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20  t iSortOrder){. 
dca0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
dcb0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51  rn;.  assert( SQ
dcc0: 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45  LITE_SO_UNDEFINE
dcd0: 44 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f  D<0 && SQLITE_SO
dce0: 5f 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49 54  _ASC>=0 && SQLIT
dcf0: 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20  E_SO_DESC>0 );. 
dd00: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78 70   assert( p->nExp
dd10: 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f  r>0 );.  if( iSo
dd20: 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20 20  rtOrder<0 ){.   
dd30: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d   assert( p->a[p-
dd40: 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72  >nExpr-1].sortOr
dd50: 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  der==SQLITE_SO_A
dd60: 53 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  SC );.    return
dd70: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e  ;.  }.  p->a[p->
dd80: 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64  nExpr-1].sortOrd
dd90: 65 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72  er = (u8)iSortOr
dda0: 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  der;.}../*.** Se
ddb0: 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  t the ExprList.a
ddc0: 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74  [].zName element
ddd0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
dde0: 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d  ently added item
ddf0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65  .** on the expre
de00: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
de10: 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65  * pList might be
de20: 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20   NULL following 
de30: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
de40: 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20  ut pName should 
de50: 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c  never be.** NULL
de60: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
de70: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
de80: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d   the pParse->db-
de90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
dea0: 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f  ag.** is set..*/
deb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
dec0: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20  rListSetName(.  
ded0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
dee0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
def0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
df00: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
df10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
df20: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20  to which to add 
df30: 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54  the span. */.  T
df40: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
df50: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74         /* Name t
df60: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20  o be added */.  
df70: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
df80: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
df90: 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d  to cause the nam
dfa0: 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64  e to be dequoted
dfb0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
dfc0: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61   pList!=0 || pPa
dfd0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
dfe0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
dff0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
e000: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
e010: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
e020: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
e030: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49  Expr>0 );.    pI
e040: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
e050: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
e060: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
e070: 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a  em->zName==0 );.
e080: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
e090: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
e0a0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
e0b0: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
e0c0: 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71  >n);.    if( deq
e0d0: 75 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44 65  uote ) sqlite3De
e0e0: 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  quote(pItem->zNa
e0f0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 49 4e 5f  me);.    if( IN_
e100: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
e110: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
e120: 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61  nameTokenMap(pPa
e130: 72 73 65 2c 20 28 76 6f 69 64 2a 29 70 49 74 65  rse, (void*)pIte
e140: 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29  m->zName, pName)
e150: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
e160: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
e170: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20  rList.a[].zSpan 
e180: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
e190: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
e1a0: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
e1b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
e1c0: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
e1d0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
e1e0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
e1f0: 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20  ror.  But pSpan 
e200: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
e210: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
e220: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
e230: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
e240: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
e250: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
e260: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
e270: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
e280: 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pan(.  Parse *pP
e290: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
e2a0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
e2b0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
e2c0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
e2d0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
e2e0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
e2f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e300: 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *zStart,     /*
e310: 20 53 74 61 72 74 20 6f 66 20 74 68 65 20 73 70   Start of the sp
e320: 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  an */.  const ch
e330: 61 72 20 2a 7a 45 6e 64 20 20 20 20 20 20 20 20  ar *zEnd        
e340: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70  /* End of the sp
e350: 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  an */.){.  sqlit
e360: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
e370: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
e380: 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  List!=0 || db->m
e390: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
e3a0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
e3b0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
e3c0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
e3d0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
e3e0: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
e3f0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
e400: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
e410: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e420: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
e430: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
e440: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 70 61  n = sqlite3DbSpa
e450: 6e 44 75 70 28 64 62 2c 20 7a 53 74 61 72 74 2c  nDup(db, zStart,
e460: 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   zEnd);.  }.}../
e470: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
e480: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69  ession list pELi
e490: 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  st contains more
e4a0: 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65   than iLimit ele
e4b0: 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20  ments,.** leave 
e4c0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
e4d0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
e4e0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
e4f0: 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a  istCheckLength(.
e500: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e510: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
e520: 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ist,.  const cha
e530: 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20  r *zObject.){.  
e540: 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d  int mx = pParse-
e550: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
e560: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
e570: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
e580: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
e590: 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74  nExpr==mx );.  t
e5a0: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
e5b0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
e5c0: 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20  ==mx+1 );.  if( 
e5d0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
e5e0: 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20  ->nExpr>mx ){.  
e5f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
e600: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
e610: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25  any columns in %
e620: 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20  s", zObject);.  
e630: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
e640: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
e650: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
e660: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
e670: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70 72  INLINE void expr
e680: 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c  ListDeleteNN(sql
e690: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
e6a0: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
e6b0: 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  t i = pList->nEx
e6c0: 70 72 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  pr;.  struct Exp
e6d0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
e6e0: 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61 3b 0a 20  m =  pList->a;. 
e6f0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
e700: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 64 6f 7b  nExpr>0 );.  do{
e710: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
e720: 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
e730: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
e740: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e750: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
e760: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
e770: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
e780: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2b 2b 3b  n);.    pItem++;
e790: 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d 69 3e 30  .  }while( --i>0
e7a0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   );.  sqlite3DbF
e7b0: 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29  reeNN(db, pList)
e7c0: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
e7d0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73  ExprListDelete(s
e7e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
e7f0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
e800: 69 66 28 20 70 4c 69 73 74 20 29 20 65 78 70 72  if( pList ) expr
e810: 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ListDeleteNN(db,
e820: 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
e830: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
e840: 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45  wise-OR of all E
e850: 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 73  xpr.flags fields
e860: 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   in the given.**
e870: 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33   ExprList..*/.u3
e880: 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  2 sqlite3ExprLis
e890: 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78 70  tFlags(const Exp
e8a0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
e8b0: 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d 20   int i;.  u32 m 
e8c0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
e8d0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 66 6f 72  List!=0 );.  for
e8e0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
e8f0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
e900: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
e910: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
e920: 3b 0a 20 20 20 20 20 61 73 73 65 72 74 28 20 70  ;.     assert( p
e930: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
e940: 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67  m |= pExpr->flag
e950: 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  s;.  }.  return 
e960: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  m;.}../*.** This
e970: 20 69 73 20 61 20 53 45 4c 45 43 54 2d 6e 6f 64   is a SELECT-nod
e980: 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  e callback for t
e990: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61  he expression wa
e9a0: 6c 6b 65 72 20 74 68 61 74 0a 2a 2a 20 61 6c 77  lker that.** alw
e9b0: 61 79 73 20 22 66 61 69 6c 73 22 2e 20 20 42 79  ays "fails".  By
e9c0: 20 22 66 61 69 6c 22 20 69 6e 20 74 68 69 73 20   "fail" in this 
e9d0: 63 61 73 65 2c 20 77 65 20 6d 65 61 6e 20 73 65  case, we mean se
e9e0: 74 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 65 43  t.** pWalker->eC
e9f0: 6f 64 65 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20  ode to zero and 
ea00: 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abort..**.** Thi
ea10: 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 75 73  s callback is us
ea20: 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 65  ed by multiple e
ea30: 78 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72  xpression walker
ea40: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
ea50: 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28  3SelectWalkFail(
ea60: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
ea70: 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
ea80: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
ea90: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
eaa0: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
eab0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
eac0: 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 0a 2f 2a 0a  RC_Abort;.}../*.
ead0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
eae0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
eaf0: 20 49 44 20 77 69 74 68 20 74 68 65 20 6e 61 6d   ID with the nam
eb00: 65 20 22 74 72 75 65 22 20 6f 72 20 22 66 61 6c  e "true" or "fal
eb10: 73 65 22 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 76  se".** then conv
eb20: 65 72 74 20 69 74 20 69 6e 74 6f 20 61 6e 20 54  ert it into an T
eb30: 4b 5f 54 52 55 45 46 41 4c 53 45 20 74 65 72 6d  K_TRUEFALSE term
eb40: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
eb50: 72 6f 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e  ro if.** the con
eb60: 76 65 72 73 69 6f 6e 20 68 61 70 70 65 6e 65 64  version happened
eb70: 2c 20 61 6e 64 20 7a 65 72 6f 20 69 66 20 74 68  , and zero if th
eb80: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
eb90: 75 6e 61 6c 74 65 72 65 64 2e 0a 2a 2f 0a 69 6e  unaltered..*/.in
eba0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 64 54  t sqlite3ExprIdT
ebb0: 6f 54 72 75 65 46 61 6c 73 65 28 45 78 70 72 20  oTrueFalse(Expr 
ebc0: 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65 72  *pExpr){.  asser
ebd0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
ebe0: 5f 49 44 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _ID || pExpr->op
ebf0: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20  ==TK_STRING );. 
ec00: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
ec10: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
ec20: 51 75 6f 74 65 64 29 0a 20 20 20 26 26 20 28 73  Quoted).   && (s
ec30: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
ec40: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22  xpr->u.zToken, "
ec50: 74 72 75 65 22 29 3d 3d 30 0a 20 20 20 20 20 20  true")==0.      
ec60: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
ec70: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
ec80: 65 6e 2c 20 22 66 61 6c 73 65 22 29 3d 3d 30 29  en, "false")==0)
ec90: 0a 20 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d  .  ){.    pExpr-
eca0: 3e 6f 70 20 3d 20 54 4b 5f 54 52 55 45 46 41 4c  >op = TK_TRUEFAL
ecb0: 53 45 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50  SE;.    ExprSetP
ecc0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 70  roperty(pExpr, p
ecd0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34  Expr->u.zToken[4
ece0: 5d 3d 3d 30 20 3f 20 45 50 5f 49 73 54 72 75 65  ]==0 ? EP_IsTrue
ecf0: 20 3a 20 45 50 5f 49 73 46 61 6c 73 65 29 3b 0a   : EP_IsFalse);.
ed00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
ed10: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
ed20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
ed30: 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20 54 4b  ent must be a TK
ed40: 5f 54 52 55 45 46 41 4c 53 45 20 45 78 70 72 20  _TRUEFALSE Expr 
ed50: 6e 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 31 20  node.  Return 1 
ed60: 69 66 20 69 74 20 69 73 20 54 52 55 45 0a 2a 2a  if it is TRUE.**
ed70: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 73 20   and 0 if it is 
ed80: 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71  FALSE..*/.int sq
ed90: 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61  lite3ExprTruthVa
eda0: 6c 75 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  lue(const Expr *
edb0: 70 45 78 70 72 29 7b 0a 20 20 70 45 78 70 72 20  pExpr){.  pExpr 
edc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
edd0: 70 43 6f 6c 6c 61 74 65 28 28 45 78 70 72 2a 29  pCollate((Expr*)
ede0: 70 45 78 70 72 29 3b 0a 20 20 61 73 73 65 72 74  pExpr);.  assert
edf0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
ee00: 54 52 55 45 46 41 4c 53 45 20 29 3b 0a 20 20 61  TRUEFALSE );.  a
ee10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74  ssert( sqlite3St
ee20: 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
ee30: 54 6f 6b 65 6e 2c 22 74 72 75 65 22 29 3d 3d 30  Token,"true")==0
ee40: 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
ee50: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
ee60: 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 66 61 6c 73 65  >u.zToken,"false
ee70: 22 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  ")==0 );.  retur
ee80: 6e 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  n pExpr->u.zToke
ee90: 6e 5b 34 5d 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  n[4]==0;.}../*.*
eea0: 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 6e  * If pExpr is an
eeb0: 20 41 4e 44 20 6f 72 20 4f 52 20 65 78 70 72 65   AND or OR expre
eec0: 73 73 69 6f 6e 2c 20 74 72 79 20 74 6f 20 73 69  ssion, try to si
eed0: 6d 70 6c 69 66 79 20 69 74 20 62 79 20 65 6c 69  mplify it by eli
eee0: 6d 69 6e 61 74 69 6e 67 0a 2a 2a 20 74 65 72 6d  minating.** term
eef0: 73 20 74 68 61 74 20 61 72 65 20 61 6c 77 61 79  s that are alway
ef00: 73 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 2e  s true or false.
ef10: 20 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 6d    Return the sim
ef20: 70 6c 69 66 69 65 64 20 65 78 70 72 65 73 73 69  plified expressi
ef30: 6f 6e 2e 0a 2a 2a 20 4f 72 20 72 65 74 75 72 6e  on..** Or return
ef40: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78   the original ex
ef50: 70 72 65 73 73 69 6f 6e 20 69 66 20 6e 6f 20 73  pression if no s
ef60: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 69 73  implification is
ef70: 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a   possible..**.**
ef80: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
ef90: 20 20 20 20 20 28 78 3c 31 30 29 20 41 4e 44 20       (x<10) AND 
efa0: 74 72 75 65 20 20 20 20 20 20 20 20 20 20 20 20  true            
efb0: 20 20 20 20 3d 3e 20 20 20 28 78 3c 31 30 29 0a      =>   (x<10).
efc0: 2a 2a 20 20 20 20 20 28 78 3c 31 30 29 20 41 4e  **     (x<10) AN
efd0: 44 20 66 61 6c 73 65 20 20 20 20 20 20 20 20 20  D false         
efe0: 20 20 20 20 20 20 3d 3e 20 20 20 66 61 6c 73 65        =>   false
eff0: 0a 2a 2a 20 20 20 20 20 28 78 3c 31 30 29 20 41  .**     (x<10) A
f000: 4e 44 20 28 79 3d 32 32 20 4f 52 20 66 61 6c 73  ND (y=22 OR fals
f010: 65 29 20 20 20 20 20 3d 3e 20 20 20 28 78 3c 31  e)     =>   (x<1
f020: 30 29 20 41 4e 44 20 28 79 3d 32 32 29 0a 2a 2a  0) AND (y=22).**
f030: 20 20 20 20 20 28 78 3c 31 30 29 20 41 4e 44 20       (x<10) AND 
f040: 28 79 3d 32 32 20 4f 52 20 74 72 75 65 29 20 20  (y=22 OR true)  
f050: 20 20 20 20 3d 3e 20 20 20 28 78 3c 31 30 29 0a      =>   (x<10).
f060: 2a 2a 20 20 20 20 20 28 79 3d 32 32 29 20 4f 52  **     (y=22) OR
f070: 20 74 72 75 65 20 20 20 20 20 20 20 20 20 20 20   true           
f080: 20 20 20 20 20 20 3d 3e 20 20 20 74 72 75 65 0a        =>   true.
f090: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
f0a0: 45 78 70 72 53 69 6d 70 6c 69 66 69 65 64 41 6e  ExprSimplifiedAn
f0b0: 64 4f 72 28 45 78 70 72 20 2a 70 45 78 70 72 29  dOr(Expr *pExpr)
f0c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  {.  assert( pExp
f0d0: 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45  r!=0 );.  if( pE
f0e0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  xpr->op==TK_AND 
f0f0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
f100: 5f 4f 52 20 29 7b 0a 20 20 20 20 45 78 70 72 20  _OR ){.    Expr 
f110: 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  *pRight = sqlite
f120: 33 45 78 70 72 53 69 6d 70 6c 69 66 69 65 64 41  3ExprSimplifiedA
f130: 6e 64 4f 72 28 70 45 78 70 72 2d 3e 70 52 69 67  ndOr(pExpr->pRig
f140: 68 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  ht);.    Expr *p
f150: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
f160: 70 72 53 69 6d 70 6c 69 66 69 65 64 41 6e 64 4f  prSimplifiedAndO
f170: 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  r(pExpr->pLeft);
f180: 0a 20 20 20 20 69 66 28 20 45 78 70 72 41 6c 77  .    if( ExprAlw
f190: 61 79 73 54 72 75 65 28 70 4c 65 66 74 29 20 7c  aysTrue(pLeft) |
f1a0: 7c 20 45 78 70 72 41 6c 77 61 79 73 46 61 6c 73  | ExprAlwaysFals
f1b0: 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  e(pRight) ){.   
f1c0: 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
f1d0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 3f 20 70  ->op==TK_AND ? p
f1e0: 52 69 67 68 74 20 3a 20 70 4c 65 66 74 3b 0a 20  Right : pLeft;. 
f1f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70     }else if( Exp
f200: 72 41 6c 77 61 79 73 54 72 75 65 28 70 52 69 67  rAlwaysTrue(pRig
f210: 68 74 29 20 7c 7c 20 45 78 70 72 41 6c 77 61 79  ht) || ExprAlway
f220: 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 29 7b  sFalse(pLeft) ){
f230: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
f240: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  Expr->op==TK_AND
f250: 20 3f 20 70 4c 65 66 74 20 3a 20 70 52 69 67 68   ? pLeft : pRigh
f260: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
f270: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
f280: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  ./*.** These rou
f290: 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72  tines are Walker
f2a0: 20 63 61 6c 6c 62 61 63 6b 73 20 75 73 65 64 20   callbacks used 
f2b0: 74 6f 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  to check express
f2c0: 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69  ions to.** see i
f2d0: 66 20 74 68 65 79 20 61 72 65 20 22 63 6f 6e 73  f they are "cons
f2e0: 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20 64  tant" for some d
f2f0: 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e  efinition of con
f300: 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57  stant.  The.** W
f310: 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75  alker.eCode valu
f320: 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65  e determines the
f330: 20 74 79 70 65 20 6f 66 20 22 63 6f 6e 73 74 61   type of "consta
f340: 6e 74 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  nt" we are looki
f350: 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a  ng.** for..**.**
f360: 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20   These callback 
f370: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
f380: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
f390: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
f3a0: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
f3b0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20  xprIsConstant() 
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3d0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f3e0: 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =1.**     sqlite
f3f0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
f400: 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20  otJoin()        
f410: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
f420: 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==2.**     sqli
f430: 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
f440: 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20  nstant()        
f450: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f460: 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71  ode==3.**     sq
f470: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
f480: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20  antOrFunction() 
f490: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
f4a0: 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a  eCode==4 or 5.**
f4b0: 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  .** In all cases
f4c0: 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 20  , the callbacks 
f4d0: 73 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  set Walker.eCode
f4e0: 3d 30 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20  =0 and abort if 
f4f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
f500: 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f  * is found to no
f510: 74 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e  t be a constant.
f520: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
f530: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
f540: 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 69 73 20  OrFunction() is 
f550: 75 73 65 64 20 66 6f 72 20 65 76 61 6c 75 61 74  used for evaluat
f560: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ing expressions.
f570: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
f580: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
f590: 20 54 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64   The Walker.eCod
f5a0: 65 20 76 61 6c 75 65 20 69 73 20 35 20 77 68 65  e value is 5 whe
f5b0: 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20  n parsing.** an 
f5c0: 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 20  existing schema 
f5d0: 61 6e 64 20 34 20 77 68 65 6e 20 70 72 6f 63 65  and 4 when proce
f5e0: 73 73 69 6e 67 20 61 20 6e 65 77 20 73 74 61 74  ssing a new stat
f5f0: 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a  ement.  A bound.
f600: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 72 61 69  ** parameter rai
f610: 73 65 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72  ses an error for
f620: 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 73 2c   new statements,
f630: 20 62 75 74 20 69 73 20 73 69 6c 65 6e 74 6c 79   but is silently
f640: 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f   converted.** to
f650: 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73 74 69   NULL for existi
f660: 6e 67 20 73 63 68 65 6d 61 73 2e 20 20 54 68 69  ng schemas.  Thi
f670: 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f  s allows sqlite_
f680: 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 74 68  master tables th
f690: 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61  at .** contain a
f6a0: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
f6b0: 20 62 65 63 61 75 73 65 20 74 68 65 79 20 77 65   because they we
f6c0: 72 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  re generated by 
f6d0: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a  older versions.*
f6e0: 2a 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 62  * of SQLite to b
f6f0: 65 20 70 61 72 73 65 64 20 62 79 20 6e 65 77 65  e parsed by newe
f700: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
f710: 4c 69 74 65 20 77 69 74 68 6f 75 74 20 72 61 69  Lite without rai
f720: 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72  sing a.** malfor
f730: 6d 65 64 20 73 63 68 65 6d 61 20 65 72 72 6f 72  med schema error
f740: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f750: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
f760: 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
f770: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
f780: 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b  {..  /* If pWalk
f790: 65 72 2d 3e 65 43 6f 64 65 20 69 73 20 32 20 74  er->eCode is 2 t
f7a0: 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20  hen any term of 
f7b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
f7c0: 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20  hat comes from. 
f7d0: 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   ** the ON or US
f7e0: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
f7f0: 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73 71 75   left join disqu
f800: 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72  alifies the expr
f810: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d  ession.  ** from
f820: 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
f830: 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20  d constant. */. 
f840: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43   if( pWalker->eC
f850: 6f 64 65 3d 3d 32 20 26 26 20 45 78 70 72 48 61  ode==2 && ExprHa
f860: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
f870: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
f880: 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  .    pWalker->eC
f890: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ode = 0;.    ret
f8a0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
f8b0: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
f8c0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
f8d0: 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74  * Consider funct
f8e0: 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74  ions to be const
f8f0: 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72  ant if all their
f900: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63   arguments are c
f910: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61  onstant.    ** a
f920: 6e 64 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65  nd either pWalke
f930: 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35  r->eCode==4 or 5
f940: 20 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   or the function
f950: 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20   has the.    ** 
f960: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53  SQLITE_FUNC_CONS
f970: 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63  T flag. */.    c
f980: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
f990: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
f9a0: 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20  er->eCode>=4 || 
f9b0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f9c0: 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75  pExpr,EP_ConstFu
f9d0: 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nc) ){.        r
f9e0: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
f9f0: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ue;.      }else{
fa00: 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  .        pWalker
fa10: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
fa20: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
fa30: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
fa40: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20     case TK_ID:. 
fa50: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
fa60: 22 74 72 75 65 22 20 6f 72 20 22 66 61 6c 73 65  "true" or "false
fa70: 22 20 69 6e 20 61 20 44 45 46 41 55 4c 54 20 63  " in a DEFAULT c
fa80: 6c 61 75 73 65 20 69 6e 74 6f 20 74 68 65 0a 20  lause into the. 
fa90: 20 20 20 20 20 2a 2a 20 61 70 70 72 6f 70 72 69       ** appropri
faa0: 61 74 65 20 54 4b 5f 54 52 55 45 46 41 4c 53 45  ate TK_TRUEFALSE
fab0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
fac0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
fad0: 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28  prIdToTrueFalse(
fae0: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
faf0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
fb00: 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
fb10: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a    /* Fall thru *
fb20: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  /.    case TK_CO
fb30: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
fb40: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
fb50: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
fb60: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65  COLUMN:.      te
fb70: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
fb80: 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20  p==TK_ID );.    
fb90: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
fba0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
fbb0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
fbc0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
fbd0: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
fbe0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
fbf0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
fc00: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
fc10: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
fc20: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
fc30: 50 5f 46 69 78 65 64 43 6f 6c 29 20 26 26 20 70  P_FixedCol) && p
fc40: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 21 3d 32  Walker->eCode!=2
fc50: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
fc60: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
fc70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
fc80: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
fc90: 65 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69  e==3 && pExpr->i
fca0: 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Table==pWalker->
fcb0: 75 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20  u.iCur ){.      
fcc0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
fcd0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
fce0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
fcf0: 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
fd00: 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a   TK_IF_NULL_ROW:
fd10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
fd20: 49 53 54 45 52 3a 0a 20 20 20 20 20 20 74 65 73  ISTER:.      tes
fd30: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
fd40: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
fd50: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
fd60: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
fd70: 46 5f 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20  F_NULL_ROW );.  
fd80: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
fd90: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  de = 0;.      re
fda0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
fdb0: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
fdc0: 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  ABLE:.      if( 
fdd0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
fde0: 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  5 ){.        /* 
fdf0: 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  Silently convert
fe00: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
fe10: 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
fe20: 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20  side of CREATE. 
fe30: 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d         ** statem
fe40: 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c  ents into a NULL
fe50: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68   when parsing th
fe60: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
fe70: 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20  nt text out.    
fe80: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71      ** of the sq
fe90: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
fea0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78  e */.        pEx
feb0: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
fec0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
fed0: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
fee0: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==4 ){.        /
fef0: 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  * A bound parame
ff00: 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20  ter in a CREATE 
ff10: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f  statement that o
ff20: 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20  riginates from. 
ff30: 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65         ** sqlite
ff40: 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73  3_prepare() caus
ff50: 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  es an error */. 
ff60: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
ff70: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
ff80: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
ff90: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
ffa0: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
ffb0: 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c  gh */.    defaul
ffc0: 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t:.      testcas
ffd0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
ffe0: 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 71  _SELECT ); /* sq
fff0: 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
10000 61 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20  ail() disallows 
10010 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
10020 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
10030 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 71  _EXISTS ); /* sq
10040 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
10050 61 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20  ail() disallows 
10060 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10070 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
10080 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65  }.}.static int e
10090 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20  xprIsConst(Expr 
100a0 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67  *p, int initFlag
100b0 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57  , int iCur){.  W
100c0 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f  alker w;.  w.eCo
100d0 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20  de = initFlag;. 
100e0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
100f0 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e   = exprNodeIsCon
10100 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65  stant;.  w.xSele
10110 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  ctCallback = sql
10120 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61  ite3SelectWalkFa
10130 69 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  il;.#ifdef SQLIT
10140 45 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c  E_DEBUG.  w.xSel
10150 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
10160 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
10170 41 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a  Assert2;.#endif.
10180 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 43 75    w.u.iCur = iCu
10190 72 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  r;.  sqlite3Walk
101a0 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
101b0 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d  eturn w.eCode;.}
101c0 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
101d0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
101e0 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
101f0 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
10200 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
10210 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
10220 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
10230 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
10240 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  lls..**.** For t
10250 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
10260 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
10270 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
10280 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
10290 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
102a0 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
102b0 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
102c0 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
102d0 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
102e0 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
102f0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
10300 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  nt(Expr *p){.  r
10310 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
10320 74 28 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f  t(p, 1, 0);.}../
10330 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
10340 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
10350 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
10360 66 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 74 68  f.**.**   (1) th
10370 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10380 63 6f 6e 73 74 61 6e 74 2c 20 61 6e 64 0a 2a 2a  constant, and.**
10390 20 20 20 28 32 29 20 74 68 65 20 65 78 70 72 65     (2) the expre
103a0 73 73 69 6f 6e 20 64 6f 65 73 20 6f 72 69 67 69  ssion does origi
103b0 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 20 6f  nate in the ON o
103c0 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a  r USING clause.*
103d0 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46  *       of a LEF
103e0 54 20 4a 4f 49 4e 2c 20 61 6e 64 0a 2a 2a 20 20  T JOIN, and.**  
103f0 20 28 33 29 20 74 68 65 20 65 78 70 72 65 73 73   (3) the express
10400 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ion does not con
10410 74 61 69 6e 20 61 6e 79 20 45 50 5f 46 69 78 65  tain any EP_Fixe
10420 64 43 6f 6c 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a  dCol TK_COLUMN.*
10430 2a 20 20 20 20 20 20 20 6f 70 65 72 61 6e 64 73  *       operands
10440 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
10450 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61  constant propaga
10460 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tion optimizatio
10470 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  n..**.** When th
10480 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
10490 6e 73 20 74 72 75 65 2c 20 69 74 20 69 6e 64 69  ns true, it indi
104a0 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 65  cates that the e
104b0 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 61 6e  xpression.** can
104c0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
104d0 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
104e0 78 70 72 20 6c 69 73 74 20 61 6e 64 20 65 76 61  xpr list and eva
104f0 6c 75 61 74 65 64 20 6f 6e 63 65 20 77 68 65 6e  luated once when
10500 0a 2a 2a 20 74 68 65 20 70 72 65 70 61 72 65 64  .** the prepared
10510 20 73 74 61 74 65 6d 65 6e 74 20 73 74 61 72 74   statement start
10520 73 20 75 70 2e 20 20 53 65 65 20 73 71 6c 69 74  s up.  See sqlit
10530 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
10540 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
10550 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
10560 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29  NotJoin(Expr *p)
10570 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
10580 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b  sConst(p, 2, 0);
10590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
105a0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
105b0 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
105c0 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
105d0 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
105e0 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e  t.** for any sin
105f0 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74  gle row of the t
10600 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
10610 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72   iCur.  In other
10620 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65   words, the.** e
10630 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e  xpression must n
10640 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20  ot refer to any 
10650 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
10660 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61  c function nor a
10670 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65  ny.** table othe
10680 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a  r than iCur..*/.
10690 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
106a0 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45  sTableConstant(E
106b0 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72  xpr *p, int iCur
106c0 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
106d0 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43  IsConst(p, 3, iC
106e0 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73  ur);.}.../*.** s
106f0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29  qlite3WalkExpr()
10700 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62   callback used b
10710 79 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  y sqlite3ExprIsC
10720 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79  onstantOrGroupBy
10730 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
10740 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  t exprNodeIsCons
10750 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 57 61  tantOrGroupBy(Wa
10760 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
10770 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45  xpr *pExpr){.  E
10780 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
10790 79 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  y = pWalker->u.p
107a0 47 72 6f 75 70 42 79 3b 0a 20 20 69 6e 74 20 69  GroupBy;.  int i
107b0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
107c0 20 70 45 78 70 72 20 69 73 20 69 64 65 6e 74 69   pExpr is identi
107d0 63 61 6c 20 74 6f 20 61 6e 79 20 47 52 4f 55 50  cal to any GROUP
107e0 20 42 59 20 74 65 72 6d 2e 20 49 66 20 73 6f 2c   BY term. If so,
107f0 20 63 6f 6e 73 69 64 65 72 0a 20 20 2a 2a 20 69   consider.  ** i
10800 74 20 63 6f 6e 73 74 61 6e 74 2e 20 20 2a 2f 0a  t constant.  */.
10810 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72    for(i=0; i<pGr
10820 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
10830 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
10840 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  = pGroupBy->a[i]
10850 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
10860 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
10870 72 65 28 30 2c 20 70 45 78 70 72 2c 20 70 2c 20  re(0, pExpr, p, 
10880 2d 31 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 43  -1)<2 ){.      C
10890 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
108a0 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
108b0 6c 53 65 71 28 70 57 61 6c 6b 65 72 2d 3e 70 50  lSeq(pWalker->pP
108c0 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
108d0 69 66 28 20 73 71 6c 69 74 65 33 49 73 42 69 6e  if( sqlite3IsBin
108e0 61 72 79 28 70 43 6f 6c 6c 29 20 29 7b 0a 20 20  ary(pColl) ){.  
108f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
10900 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  _Prune;.      }.
10910 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10920 43 68 65 63 6b 20 69 66 20 70 45 78 70 72 20 69  Check if pExpr i
10930 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  s a sub-select. 
10940 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 20  If so, consider 
10950 69 74 20 76 61 72 69 61 62 6c 65 2e 20 2a 2f 0a  it variable. */.
10960 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
10970 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
10980 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
10990 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
109a0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
109b0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
109c0 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 4e 6f  .  return exprNo
109d0 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 70 57 61  deIsConstant(pWa
109e0 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  lker, pExpr);.}.
109f0 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68 65 20  ./*.** Walk the 
10a00 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
10a10 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
10a20 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65  rst argument. Re
10a30 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  turn non-zero.**
10a40 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
10a50 6f 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  on consists enti
10a60 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74  rely of constant
10a70 73 20 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 74  s or copies of t
10a80 65 72 6d 73 20 0a 2a 2a 20 69 6e 20 70 47 72 6f  erms .** in pGro
10a90 75 70 42 79 20 74 68 61 74 20 73 6f 72 74 20 77  upBy that sort w
10aa0 69 74 68 20 74 68 65 20 42 49 4e 41 52 59 20 63  ith the BINARY c
10ab0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
10ac0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
10ad0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
10ae0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20   determine if a 
10af0 74 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49  term of the HAVI
10b00 4e 47 20 63 6c 61 75 73 65 20 63 61 6e 0a 2a 2a  NG clause can.**
10b10 20 62 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 74   be promoted int
10b20 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
10b30 73 65 2e 20 20 49 6e 20 6f 72 64 65 72 20 66 6f  se.  In order fo
10b40 72 20 73 75 63 68 20 61 20 70 72 6f 6d 6f 74 69  r such a promoti
10b50 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74  on to work,.** t
10b60 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
10b70 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 74 65  HAVING clause te
10b80 72 6d 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  rm must be the s
10b90 61 6d 65 20 66 6f 72 20 61 6c 6c 20 6d 65 6d 62  ame for all memb
10ba0 65 72 73 20 6f 66 0a 2a 2a 20 61 20 22 67 72 6f  ers of.** a "gro
10bb0 75 70 22 2e 20 20 54 68 65 20 72 65 71 75 69 72  up".  The requir
10bc0 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 47  ement that the G
10bd0 52 4f 55 50 20 42 59 20 74 65 72 6d 20 6d 75 73  ROUP BY term mus
10be0 74 20 62 65 20 42 49 4e 41 52 59 0a 2a 2a 20 61  t be BINARY.** a
10bf0 73 73 75 6d 65 73 20 74 68 61 74 20 6e 6f 20 6f  ssumes that no o
10c00 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ther collating s
10c10 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 68 61 76  equence will hav
10c20 65 20 61 20 66 69 6e 65 72 2d 67 72 61 69 6e 65  e a finer-graine
10c30 64 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 20 74 68  d.** grouping th
10c40 61 6e 20 62 69 6e 61 72 79 2e 20 20 49 6e 20 6f  an binary.  In o
10c50 74 68 65 72 20 77 6f 72 64 73 20 28 41 3d 42 20  ther words (A=B 
10c60 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 29 20  COLLATE binary) 
10c70 69 6d 70 6c 69 65 73 0a 2a 2a 20 41 3d 42 20 69  implies.** A=B i
10c80 6e 20 65 76 65 72 79 20 6f 74 68 65 72 20 63 6f  n every other co
10c90 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10ca0 2e 20 20 54 68 65 20 72 65 71 75 69 72 65 6d 65  .  The requireme
10cb0 6e 74 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 47  nt that the.** G
10cc0 52 4f 55 50 20 42 59 20 62 65 20 42 49 4e 41 52  ROUP BY be BINAR
10cd0 59 20 69 73 20 73 74 72 69 63 74 65 72 20 74 68  Y is stricter th
10ce0 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 20 49  an necessary.  I
10cf0 74 20 77 6f 75 6c 64 20 61 6c 73 6f 20 77 6f 72  t would also wor
10d00 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d 6f 74 65 20  k.** to promote 
10d10 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 74  HAVING clauses t
10d20 68 61 74 20 75 73 65 20 74 68 65 20 73 61 6d 65  hat use the same
10d30 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
10d40 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
10d50 63 65 20 61 73 20 74 68 65 20 47 52 4f 55 50 20  ce as the GROUP 
10d60 42 59 20 74 65 72 6d 2c 20 62 75 74 20 74 68 61  BY term, but tha
10d70 74 20 69 73 20 6d 75 63 68 20 68 61 72 64 65 72  t is much harder
10d80 20 74 6f 20 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c   to check,.** al
10d90 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74  ternative collat
10da0 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61 72  ing sequences ar
10db0 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20  e uncommon, and 
10dc0 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 61 6e 0a  this is only an.
10dd0 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ** optimization,
10de0 20 73 6f 20 77 65 20 74 61 6b 65 20 74 68 65 20   so we take the 
10df0 65 61 73 79 20 77 61 79 20 6f 75 74 20 61 6e 64  easy way out and
10e00 20 73 69 6d 70 6c 79 20 72 65 71 75 69 72 65 20   simply require 
10e10 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20  the.** GROUP BY 
10e20 74 6f 20 75 73 65 20 74 68 65 20 42 49 4e 41 52  to use the BINAR
10e30 59 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  Y collating sequ
10e40 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ence..*/.int sql
10e50 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
10e60 6e 74 4f 72 47 72 6f 75 70 42 79 28 50 61 72 73  ntOrGroupBy(Pars
10e70 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
10e80 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 47  *p, ExprList *pG
10e90 72 6f 75 70 42 79 29 7b 0a 20 20 57 61 6c 6b 65  roupBy){.  Walke
10ea0 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  r w;.  w.eCode =
10eb0 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   1;.  w.xExprCal
10ec0 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
10ed0 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75  IsConstantOrGrou
10ee0 70 42 79 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  pBy;.  w.xSelect
10ef0 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Callback = 0;.  
10f00 77 2e 75 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  w.u.pGroupBy = p
10f10 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 70 50 61  GroupBy;.  w.pPa
10f20 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
10f30 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
10f40 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
10f50 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   w.eCode;.}../*.
10f60 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
10f70 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
10f80 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
10f90 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
10fa0 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72  s constant.** or
10fb0 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
10fc0 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61   with constant a
10fd0 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72  rguments.  Retur
10fe0 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72 65  n and 0 if there
10ff0 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69  .** are any vari
11000 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ables..**.** For
11010 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
11020 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
11030 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  a double-quoted 
11040 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63  string (ex: "abc
11050 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  ").** is conside
11060 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62  red a variable b
11070 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74  ut a single-quot
11080 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27  ed string (ex: '
11090 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f  abc') is.** a co
110a0 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  nstant..*/.int s
110b0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
110c0 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45  tantOrFunction(E
110d0 78 70 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69  xpr *p, u8 isIni
110e0 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  t){.  assert( is
110f0 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69  Init==0 || isIni
11100 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==1 );.  return
11110 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
11120 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a  4+isInit, 0);.}.
11130 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11140 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
11150 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  TS./*.** Walk an
11160 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
11170 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
11180 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  he expression co
11190 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71  ntains a.** subq
111a0 75 65 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e  uery of some kin
111b0 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
111c0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73 75 62  there are no sub
111d0 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20  queries..*/.int 
111e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61  sqlite3ExprConta
111f0 69 6e 73 53 75 62 71 75 65 72 79 28 45 78 70 72  insSubquery(Expr
11200 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77   *p){.  Walker w
11210 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b  ;.  w.eCode = 1;
11220 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
11230 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
11240 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53  WalkNoop;.  w.xS
11250 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
11260 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
11270 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66 20 53 51  kFail;.#ifdef SQ
11280 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77 2e 78  LITE_DEBUG.  w.x
11290 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
112a0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  = sqlite3SelectW
112b0 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e 64  alkAssert2;.#end
112c0 69 66 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  if.  sqlite3Walk
112d0 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
112e0 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30  eturn w.eCode==0
112f0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
11300 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
11310 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f  ion p codes a co
11320 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
11330 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
11340 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
11350 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
11360 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
11370 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
11380 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
11390 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
113a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
113b0 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
113c0 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
113d0 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
113e0 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
113f0 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
11400 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
11410 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
11420 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
11430 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70  xprIsInteger(Exp
11440 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75  r *p, int *pValu
11450 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  e){.  int rc = 0
11460 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ;.  if( NEVER(p=
11470 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  =0) ) return 0; 
11480 20 2f 2a 20 55 73 65 64 20 74 6f 20 6f 6e 6c 79   /* Used to only
11490 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e   happen followin
114a0 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f  g on OOM */..  /
114b0 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69  * If an expressi
114c0 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  on is an integer
114d0 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69   literal that fi
114e0 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  ts in a signed 3
114f0 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67  2-bit.  ** integ
11500 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f  er, then the EP_
11510 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69  IntValue flag wi
11520 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
11530 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73  been set */.  as
11540 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
11550 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66  INTEGER || (p->f
11560 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
11570 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ue)!=0.         
11580 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49    || sqlite3GetI
11590 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  nt32(p->u.zToken
115a0 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20  , &rc)==0 );..  
115b0 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
115c0 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
115d0 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75    *pValue = p->u
115e0 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74  .iValue;.    ret
115f0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69  urn 1;.  }.  swi
11600 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
11610 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
11620 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
11630 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
11640 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61  er(p->pLeft, pVa
11650 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
11660 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11670 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
11680 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20       int v;.    
11690 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
116a0 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
116b0 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  eft, &v) ){.    
116c0 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28      assert( v!=(
116d0 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29 20 29  -2147483647-1) )
116e0 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75  ;.        *pValu
116f0 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20  e = -v;.        
11700 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
11710 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11720 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
11730 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
11740 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11750 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
11760 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
11770 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70  nce that the exp
11780 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e  ression can be N
11790 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ULL..**.** If th
117a0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67  e expression mig
117b0 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66  ht be NULL or if
117c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
117d0 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a  is too complex.*
117e0 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e  * to tell return
117f0 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54   TRUE.  .**.** T
11800 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
11810 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69  sed as an optimi
11820 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20  zation, to skip 
11830 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65  OP_IsNull opcode
11840 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f  s.** when we kno
11850 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63  w that a value c
11860 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20  annot be NULL.  
11870 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70  Hence, a false p
11880 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75  ositive.** (retu
11890 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20  rning TRUE when 
118a0 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72  in fact the expr
118b0 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72  ession can never
118c0 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a   be NULL) might.
118d0 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65  ** be a small pe
118e0 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75  rformance hit bu
118f0 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68  t is otherwise h
11900 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65  armless.  On the
11910 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20   other.** hand, 
11920 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  a false negative
11930 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53   (returning FALS
11940 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  E when the resul
11950 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29  t could be NULL)
11960 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  .** will likely 
11970 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
11980 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20  orrect answer.  
11990 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74  So when in doubt
119a0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45  , return.** TRUE
119b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
119c0 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f  ExprCanBeNull(co
119d0 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  nst Expr *p){.  
119e0 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20  u8 op;.  while( 
119f0 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
11a00 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
11a10 4e 55 53 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  NUS ){.    p = p
11a20 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 6f  ->pLeft;.  }.  o
11a30 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
11a40 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
11a50 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
11a60 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
11a70 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
11a80 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
11a90 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73  _STRING:.    cas
11aa0 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
11ab0 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20  case TK_BLOB:.  
11ac0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
11ad0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
11ae0 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 45  :.      return E
11af0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
11b00 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20  , EP_CanBeNull) 
11b10 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
11b20 70 2d 3e 79 2e 70 54 61 62 3d 3d 30 20 7c 7c 20  p->y.pTab==0 || 
11b30 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f   /* Reference to
11b40 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
11b50 20 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a   on expression *
11b60 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  /.             (
11b70 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26  p->iColumn>=0 &&
11b80 20 70 2d 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c   p->y.pTab->aCol
11b90 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  [p->iColumn].not
11ba0 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65  Null==0);.    de
11bb0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
11bc0 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
11bd0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
11be0 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
11bf0 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e  ression is a con
11c00 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c  stant which woul
11c10 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  d be.** unchange
11c20 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79  d by OP_Affinity
11c30 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e 69   with the affini
11c40 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ty given in the 
11c50 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
11c60 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
11c70 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
11c80 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
11c90 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  he OP_Affinity o
11ca0 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  peration.** can 
11cb0 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65  be omitted.  Whe
11cc0 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72  n in doubt retur
11cd0 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73  n FALSE.  A fals
11ce0 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73  e negative.** is
11cf0 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61   harmless.  A fa
11d00 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f  lse positive, ho
11d10 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c  wever, can resul
11d20 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a  t in the wrong.*
11d30 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74  * answer..*/.int
11d40 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
11d50 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
11d60 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c  e(const Expr *p,
11d70 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38   char aff){.  u8
11d80 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d   op;.  if( aff==
11d90 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
11da0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68  ) return 1;.  wh
11db0 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
11dc0 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  PLUS || p->op==T
11dd0 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20  K_UMINUS ){ p = 
11de0 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70  p->pLeft; }.  op
11df0 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20   = p->op;.  if( 
11e00 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
11e10 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20  ) op = p->op2;. 
11e20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
11e30 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
11e40 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
11e50 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
11e60 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66  FF_INTEGER || af
11e70 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
11e80 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
11e90 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
11ea0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
11eb0 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
11ec0 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  EAL || aff==SQLI
11ed0 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
11ee0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11ef0 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
11f00 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
11f10 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
11f20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
11f30 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72  _BLOB: {.      r
11f40 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
11f50 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
11f60 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  N: {.      asser
11f70 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20  t( p->iTable>=0 
11f80 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20  );  /* p cannot 
11f90 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48 45  be part of a CHE
11fa0 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  CK constraint */
11fb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
11fc0 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20  >iColumn<0.     
11fd0 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
11fe0 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
11ff0 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
12000 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20  AFF_NUMERIC);.  
12010 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
12020 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
12030 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
12040 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
12050 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
12060 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
12070 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
12080 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52  /.int sqlite3IsR
12090 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20  owid(const char 
120a0 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
120b0 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  e3StrICmp(z, "_R
120c0 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
120d0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
120e0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
120f0 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
12100 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
12110 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
12120 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
12130 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
12140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20  .}../*.** pX is 
12150 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e  the RHS of an IN
12160 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 70   operator.  If p
12170 58 20 69 73 20 61 20 53 45 4c 45 43 54 20 73 74  X is a SELECT st
12180 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  atement .** that
12190 20 63 61 6e 20 62 65 20 73 69 6d 70 6c 69 66 69   can be simplifi
121a0 65 64 20 74 6f 20 61 20 64 69 72 65 63 74 20 74  ed to a direct t
121b0 61 62 6c 65 20 61 63 63 65 73 73 2c 20 74 68 65  able access, the
121c0 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  n return.** a po
121d0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53 45 4c  inter to the SEL
121e0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
121f0 49 66 20 70 58 20 69 73 20 6e 6f 74 20 61 20 53  If pX is not a S
12200 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
12210 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 53 45  .** or if the SE
12220 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6e  LECT statement n
12230 65 65 64 73 20 74 6f 20 62 65 20 6d 61 6e 69 66  eeds to be manif
12240 65 73 74 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ested into a tra
12250 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c  nsient.** table,
12260 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c   then return NUL
12270 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  L..*/.#ifndef SQ
12280 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
12290 52 59 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74  RY.static Select
122a0 20 2a 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72   *isCandidateFor
122b0 49 6e 4f 70 74 28 45 78 70 72 20 2a 70 58 29 7b  InOpt(Expr *pX){
122c0 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20  .  Select *p;.  
122d0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
122e0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
122f0 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
12300 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
12310 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
12320 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
12330 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ct) ) return 0; 
12340 20 2f 2a 20 4e 6f 74 20 61 20 73 75 62 71 75 65   /* Not a subque
12350 72 79 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72  ry */.  if( Expr
12360 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
12370 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 20 29  EP_VarSelect)  )
12380 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
12390 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 20 2a  orrelated subq *
123a0 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 78 2e 70 53  /.  p = pX->x.pS
123b0 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 2d 3e  elect;.  if( p->
123c0 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
123d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
123e0 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  /* Not a compoun
123f0 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  d SELECT */.  if
12400 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
12410 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
12420 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20  Aggregate) ){.  
12430 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
12440 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
12450 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
12460 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
12470 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  nct );.    testc
12480 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
12490 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
124a0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
124b0 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
124c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
124d0 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65  * No DISTINCT ke
124e0 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67  yword and no agg
124f0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
12500 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
12510 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
12520 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
12530 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50   /* Has no GROUP
12540 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
12550 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20  if( p->pLimit ) 
12560 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
12570 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
12580 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f   LIMIT clause */
12590 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
125a0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
125b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
125c0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
125d0 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   */.  pSrc = p->
125e0 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
125f0 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSrc!=0 );.  if(
12600 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
12610 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
12620 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65      /* Single te
12630 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  rm in FROM claus
12640 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d  e */.  if( pSrc-
12650 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20  >a[0].pSelect ) 
12660 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
12670 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73   FROM is not a s
12680 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20  ubquery or view 
12690 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  */.  pTab = pSrc
126a0 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61  ->a[0].pTab;.  a
126b0 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
126c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
126d0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20  ->pSelect==0 ); 
126e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
126f0 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  OM clause is not
12700 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28   a view */.  if(
12710 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
12720 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
12730 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
12740 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  se not a virtual
12750 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69   table */.  pELi
12760 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
12770 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
12780 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20  !=0 );.  /* All 
12790 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d  SELECT results m
127a0 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20  ust be columns. 
127b0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
127c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
127d0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
127e0 52 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  Res = pEList->a[
127f0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
12800 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43  ( pRes->op!=TK_C
12810 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
12820 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
12830 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  es->iTable==pSrc
12840 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[0].iCursor )
12850 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72  ;  /* Not a corr
12860 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20  elated subquery 
12870 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
12880 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  p;.}.#endif /* S
12890 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
128a0 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
128b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
128c0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
128d0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 68  ate code that ch
128e0 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  ecks the left-mo
128f0 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  st column of ind
12900 65 78 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f  ex table iCur to
12910 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f   see if.** it co
12920 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20  ntains any NULL 
12930 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65 20  entries.  Cause 
12940 74 68 65 20 72 65 67 69 73 74 65 72 20 61 74 20  the register at 
12950 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65  regHasNull to be
12960 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e   set.** to a non
12970 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69  -NULL value if i
12980 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  Cur contains no 
12990 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65  NULLs.  Cause re
129a0 67 69 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c  gister regHasNul
129b0 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74  l.** to be set t
129c0 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63  o NULL if iCur c
129d0 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
129e0 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
129f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12a00 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
12a10 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69  lFlag(Vdbe *v, i
12a20 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67  nt iCur, int reg
12a30 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20  HasNull){.  int 
12a40 61 64 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33  addr1;.  sqlite3
12a50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12a60 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
12a70 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72  HasNull);.  addr
12a80 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
12a90 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
12aa0 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43  nd, iCur); VdbeC
12ab0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
12ac0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
12ad0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43  v, OP_Column, iC
12ae0 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  ur, 0, regHasNul
12af0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l);.  sqlite3Vdb
12b00 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
12b10 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a  LAG_TYPEOFARG);.
12b20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
12b30 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69  , "first_entry_i
12b40 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a  n(%d)", iCur));.
12b50 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
12b60 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
12b70 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
12b80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12b90 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
12ba0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
12bb0 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
12bc0 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  th a list (not a
12bd0 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68   subquery) on th
12be0 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64  e .** right-hand
12bf0 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54   side.  Return T
12c00 52 55 45 20 69 66 20 74 68 61 74 20 6c 69 73 74  RUE if that list
12c10 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f   is constant..*/
12c20 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
12c30 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61  te3InRhsIsConsta
12c40 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  nt(Expr *pIn){. 
12c50 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69   Expr *pLHS;.  i
12c60 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
12c70 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
12c80 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65  ty(pIn, EP_xIsSe
12c90 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20  lect) );.  pLHS 
12ca0 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20  = pIn->pLeft;.  
12cb0 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  pIn->pLeft = 0;.
12cc0 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45    res = sqlite3E
12cd0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49  xprIsConstant(pI
12ce0 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  n);.  pIn->pLeft
12cf0 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72   = pLHS;.  retur
12d00 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n res;.}.#endif.
12d10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
12d20 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
12d30 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
12d40 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e  on of the IN (..
12d50 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .) operator..** 
12d60 54 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72  The pX parameter
12d70 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69   is the expressi
12d80 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  on on the RHS of
12d90 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
12da0 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  , which.** might
12db0 20 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73   be either a lis
12dc0 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
12dd0 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
12de0 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
12df0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
12e00 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61   to find or crea
12e10 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65  te a b-tree obje
12e20 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62  ct that can.** b
12e30 65 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f  e used either to
12e40 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72   test for member
12e50 73 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20  ship in the RHS 
12e60 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74  set or to iterat
12e70 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c  e through.** all
12e80 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20   members of the 
12e90 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e  RHS set, skippin
12ea0 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
12eb0 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20  .** A cursor is 
12ec0 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d  opened on the b-
12ed0 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
12ee0 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74   is the RHS of t
12ef0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
12f00 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65  * and pX->iTable
12f10 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
12f20 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72  ndex of that cur
12f30 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  sor..**.** The r
12f40 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66  eturned value of
12f50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
12f60 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74  ndicates the b-t
12f70 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c  ree type, as fol
12f80 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e  lows:.**.**   IN
12f90 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20  _INDEX_ROWID    
12fa0 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
12fb0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
12fc0 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
12fd0 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
12fe0 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75  EX_ASC  - The cu
12ff0 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
13000 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
13010 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
13020 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
13030 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
13040 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73   opened on a des
13050 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
13060 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
13070 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75          - The cu
13080 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
13090 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63  on a specially c
130a0 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20  reated and.**   
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130c0 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
130d0 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
130e0 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e  .**   IN_INDEX_N
130f0 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63  OOP       - No c
13100 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61  ursor was alloca
13110 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65  ted.  The IN ope
13120 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  rator must be.**
13130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13140 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65           impleme
13150 6e 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e  nted as a sequen
13160 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
13170 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  s..**.** An exis
13180 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68  ting b-tree migh
13190 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  t be used if the
131a0 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   RHS expression 
131b0 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a  pX is a simple.*
131c0 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20  * subquery such 
131d0 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  as:.**.**     SE
131e0 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20  LECT <column1>, 
131f0 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f  <column2>... FRO
13200 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20  M <table>.**.** 
13210 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
13220 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
13230 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72   a list or a mor
13240 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65  e complex subque
13250 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65  ry, then.** an e
13260 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d  phemeral table m
13270 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20  ight need to be 
13280 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
13290 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a  he RHS and then.
132a0 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61  ** pX->iTable ma
132b0 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
132c0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
132d0 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e  le instead of an
132e0 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62  .** existing tab
132f0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  le..**.** The in
13300 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
13310 6d 75 73 74 20 63 6f 6e 74 61 69 6e 2c 20 61 74  must contain, at
13320 20 61 20 6d 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20   a minimum, one 
13330 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49  of the bits.** I
13340 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
13350 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c  IP or IN_INDEX_L
13360 4f 4f 50 20 62 75 74 20 6e 6f 74 20 62 6f 74 68  OOP but not both
13370 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f  .  If inFlags co
13380 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44  ntains.** IN_IND
13390 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74  EX_MEMBERSHIP, t
133a0 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65  hen the generate
133b0 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  d table will be 
133c0 75 73 65 64 20 66 6f 72 20 61 20 66 61 73 74 0a  used for a fast.
133d0 2a 2a 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  ** membership te
133e0 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e  st.  When the IN
133f0 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20  _INDEX_LOOP bit 
13400 69 73 20 73 65 74 2c 20 74 68 65 20 49 4e 20 69  is set, the IN i
13410 6e 64 65 78 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  ndex will.** be 
13420 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65  used to loop ove
13430 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
13440 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
13450 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
13460 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f  * When IN_INDEX_
13470 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e  LOOP is used (an
13480 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c  d the b-tree wil
13490 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
134a0 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20  rate.** through 
134b0 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29  the set members)
134c0 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   then the b-tree
134d0 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69   must not contai
134e0 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  n duplicates..**
134f0 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61   An epheremal ta
13500 62 6c 65 20 77 69 6c 6c 20 62 65 20 63 72 65 61  ble will be crea
13510 74 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73  ted unless the s
13520 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20  elected columns 
13530 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 2a  are guaranteed.*
13540 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d  * to be unique -
13550 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
13560 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  it is an INTEGER
13570 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
13580 64 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51  due to.** a UNIQ
13590 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72  UE constraint or
135a0 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68   index..**.** Wh
135b0 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  en IN_INDEX_MEMB
135c0 45 52 53 48 49 50 20 69 73 20 75 73 65 64 20 28  ERSHIP is used (
135d0 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77  and the b-tree w
135e0 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  ill be used .** 
135f0 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d  for fast set mem
13600 62 65 72 73 68 69 70 20 74 65 73 74 73 29 20 74  bership tests) t
13610 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61 6c  hen an epheremal
13620 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20   table must .** 
13630 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c  be used unless <
13640 63 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73 69  columns> is a si
13650 6e 67 6c 65 20 49 4e 54 45 47 45 52 20 50 52 49  ngle INTEGER PRI
13660 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
13670 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20  or an .** index 
13680 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 77 69 74  can be found wit
13690 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
136a0 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73  <columns> as its
136b0 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a   left-most..**.*
136c0 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45  * If the IN_INDE
136d0 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e  X_NOOP_OK and IN
136e0 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
136f0 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20 61  P are both set a
13700 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53  nd.** if the RHS
13710 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
13720 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e  tor is a list (n
13730 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 74  ot a subquery) t
13740 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
13750 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64 65  ine might decide
13760 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20 61   that creating a
13770 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72  n ephemeral b-tr
13780 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ee for membershi
13790 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20  p.** testing is 
137a0 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e  too expensive an
137b0 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45  d return IN_INDE
137c0 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74  X_NOOP.  In that
137d0 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61   case, the.** ca
137e0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68  lling routine sh
137f0 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ould implement t
13800 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75  he IN operator u
13810 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a  sing a sequence.
13820 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63  ** of Eq or Ne c
13830 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
13840 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ions..**.** When
13850 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
13860 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
13870 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
13880 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
13890 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65  tion.** might ne
138a0 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68  ed to know wheth
138b0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48  er or not the RH
138c0 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  S side of the IN
138d0 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e   operator.** con
138e0 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49  tains a NULL.  I
138f0 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69  f prRhsHasNull i
13900 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69  s not a NULL poi
13910 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20  nter and .** if 
13920 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61  there is any cha
13930 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
13940 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  .) might contain
13950 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74   a NULL value at
13960 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65  .** runtime, the
13970 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  n a register is 
13980 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
13990 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
139a0 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  r written.** to 
139b0 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49  *prRhsHasNull. I
139c0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
139d0 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
139e0 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ..) contains a.*
139f0 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68  * NULL value, th
13a00 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  en *prRhsHasNull
13a10 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
13a20 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
13a30 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
13a40 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63  ated and its loc
13a50 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20  ation stored in 
13a60 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74  *prRhsHasNull, t
13a70 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  hen.** the value
13a80 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65   in that registe
13a90 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  r will be NULL i
13aa0 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
13ab0 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
13ac0 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e.** NULL values
13ad0 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65  , and it will be
13ae0 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   some non-NULL v
13af0 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74 72  alue if the b-tr
13b00 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a  ee contains no.*
13b10 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  * NULL values..*
13b20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 69 4d 61  *.** If the aiMa
13b30 70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  p parameter is n
13b40 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74  ot NULL, it must
13b50 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72   point to an arr
13b60 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  ay containing.**
13b70 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72   one element for
13b80 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74   each column ret
13b90 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
13ba0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
13bb0 20 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74   the RHS.** of t
13bc0 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  he IN(...) opera
13bd0 74 6f 72 2e 20 54 68 65 20 69 27 74 68 20 65 6e  tor. The i'th en
13be0 74 72 79 20 6f 66 20 74 68 65 20 61 72 72 61 79  try of the array
13bf0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
13c00 74 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74  th the.** offset
13c10 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f   of the index co
13c20 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74 63 68 65  lumn that matche
13c30 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d  s the i'th colum
13c40 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  n returned by th
13c50 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72  e.** SELECT. For
13c60 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
13c70 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
13c80 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78 20 61  selected index a
13c90 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f  re:.**.**   (?,?
13ca0 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61  ,?) IN (SELECT a
13cb0 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a  , b, c FROM t1).
13cc0 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
13cd0 58 20 69 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c  X i1 ON t1(b, c,
13ce0 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   a);.**.** then 
13cf0 61 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c  aiMap[] is popul
13d00 61 74 65 64 20 77 69 74 68 20 7b 32 2c 20 30 2c  ated with {2, 0,
13d10 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   1}..*/.#ifndef 
13d20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
13d30 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
13d40 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20 50  FindInIndex(.  P
13d50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
13d70 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
13d80 20 20 45 78 70 72 20 2a 70 58 2c 20 20 20 20 20    Expr *pX,     
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13da0 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
13db0 69 64 65 20 28 52 48 53 29 20 6f 66 20 74 68 65  ide (RHS) of the
13dc0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
13dd0 20 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 20    u32 inFlags,  
13de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13df0 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f  IN_INDEX_LOOP, _
13e00 4d 45 4d 42 45 52 53 48 49 50 2c 20 61 6e 64 2f  MEMBERSHIP, and/
13e10 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20  or _NOOP_OK */. 
13e20 20 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75   int *prRhsHasNu
13e30 6c 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ll,         /* R
13e40 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
13e50 4e 55 4c 4c 20 73 74 61 74 75 73 2e 20 20 53 65  NULL status.  Se
13e60 65 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74  e notes */.  int
13e70 20 2a 61 69 4d 61 70 2c 20 20 20 20 20 20 20 20   *aiMap,        
13e80 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69          /* Mappi
13e90 6e 67 20 66 72 6f 6d 20 49 6e 64 65 78 20 66 69  ng from Index fi
13ea0 65 6c 64 73 20 74 6f 20 52 48 53 20 66 69 65 6c  elds to RHS fiel
13eb0 64 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54  ds */.  int *piT
13ec0 61 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ab              
13ed0 20 20 20 2f 2a 20 4f 55 54 3a 20 69 6e 64 65 78     /* OUT: index
13ee0 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   to use */.){.  
13ef0 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20  Select *p;      
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f10 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
13f20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
13f30 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
13f40 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20   int eType = 0; 
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f60 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
13f70 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f  f RHS table. IN_
13f80 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74  INDEX_* */.  int
13f90 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
13fa0 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20  nTab++;         
13fb0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20     /* Cursor of 
13fc0 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f  the RHS table */
13fd0 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69  .  int mustBeUni
13fe0 71 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  que;            
13ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
14000 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20   if RHS must be 
14010 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65  unique */.  Vdbe
14020 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
14030 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20  Vdbe(pParse);   
14040 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
14050 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
14060 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
14070 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
14080 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d    mustBeUnique =
14090 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49   (inFlags & IN_I
140a0 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a  NDEX_LOOP)!=0;..
140b0 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20    /* If the RHS 
140c0 6f 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20  of this IN(...) 
140d0 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 53 45  operator is a SE
140e0 4c 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74 20  LECT, and if it 
140f0 6d 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77 68  matters .  ** wh
14100 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
14110 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 63   SELECT result c
14120 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c  ontains NULL val
14130 75 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74 68  ues, check wheth
14140 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e  er.  ** or not N
14150 55 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ULL is actually 
14160 70 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61 79  possible (it may
14170 20 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78 61   not be, for exa
14180 6d 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20  mple, due .  ** 
14190 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  to NOT NULL cons
141a0 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 73  traints in the s
141b0 63 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55  chema). If no NU
141c0 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f  LL values are po
141d0 73 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74  ssible,.  ** set
141e0 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f   prRhsHasNull to
141f0 20 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e   0 before contin
14200 75 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20  uing.  */.  if( 
14210 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20  prRhsHasNull && 
14220 28 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pX->flags & EP_
14230 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
14240 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70    int i;.    Exp
14250 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
14260 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pX->x.pSelect->p
14270 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69  EList;.    for(i
14280 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
14290 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
142a0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
142b0 43 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74  CanBeNull(pEList
142c0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20  ->a[i].pExpr) ) 
142d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
142e0 20 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e   if( i==pEList->
142f0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  nExpr ){.      p
14300 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b  rRhsHasNull = 0;
14310 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14320 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
14330 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
14340 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  le or index can 
14350 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  be used to.  ** 
14360 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65 72  satisfy the quer
14370 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65 66  y.  This is pref
14380 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61  erable to genera
14390 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a  ting a new .  **
143a0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
143b0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
143c0 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28  se->nErr==0 && (
143d0 70 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65 46  p = isCandidateF
143e0 6f 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30 20  orInOpt(pX))!=0 
143f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
14400 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
14410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14420 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
14430 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c  tion */.    Tabl
14440 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14460 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62     /* Table <tab
14470 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20  le>. */.    i16 
14480 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
14490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144a0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
144b0 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  dx for pTab */. 
144c0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
144d0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
144e0 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
144f0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
14500 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
14510 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20  pEList!=0 );    
14520 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61           /* Beca
14530 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
14540 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
14550 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
14560 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
14570 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61  pr!=0 ); /* Beca
14580 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
14590 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
145a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
145b0 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20  pSrc!=0 );      
145c0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61           /* Beca
145d0 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
145e0 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
145f0 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70  .    pTab = p->p
14600 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
14610 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20  .    /* Code an 
14620 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61  OP_Transaction a
14630 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20  nd OP_TableLock 
14640 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a  for <table>. */.
14650 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
14660 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
14670 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
14680 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  );.    sqlite3Co
14690 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
146a0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
146b0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
146c0 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
146d0 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
146e0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  ab->zName);..   
146f0 20 61 73 73 65 72 74 28 76 29 3b 20 20 2f 2a 20   assert(v);  /* 
14700 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29  sqlite3GetVdbe()
14710 20 68 61 73 20 61 6c 77 61 79 73 20 62 65 65 6e   has always been
14720 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
14730 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45  ed */.    if( nE
14740 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74  xpr==1 && pEList
14750 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[0].pExpr->iC
14760 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
14770 20 2f 2a 20 54 68 65 20 22 78 20 49 4e 20 28 53   /* The "x IN (S
14780 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
14790 20 74 61 62 6c 65 29 22 20 63 61 73 65 20 2a 2f   table)" case */
147a0 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72  .      int iAddr
147b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
147c0 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
147d0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
147e0 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20  rage(v);..      
147f0 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
14800 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
14810 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
14820 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54  nRead);.      eT
14830 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
14840 4f 57 49 44 3b 0a 20 20 20 20 20 20 45 78 70 6c  OWID;.      Expl
14850 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
14860 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20  arse, 0,.       
14870 20 20 20 20 20 22 55 53 49 4e 47 20 52 4f 57 49       "USING ROWI
14880 44 20 53 45 41 52 43 48 20 4f 4e 20 54 41 42 4c  D SEARCH ON TABL
14890 45 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52  E %s FOR IN-OPER
148a0 41 54 4f 52 22 2c 70 54 61 62 2d 3e 7a 4e 61 6d  ATOR",pTab->zNam
148b0 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
148c0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
148d0 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65  , iAddr);.    }e
148e0 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
148f0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14910 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
14920 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
14930 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
14940 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  1;.      int i;.
14950 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
14960 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
14970 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
14980 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65  sed to perform e
14990 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ach .      ** co
149a0 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20  mparison is the 
149b0 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69  same as the affi
149c0 6e 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c  nity of each col
149d0 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20 20  umn in table.   
149e0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53     ** on the RHS
149f0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
14a00 74 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c  tor.  If it not,
14a10 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
14a20 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
14a30 75 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f 66  use any index of
14a40 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e 20   the RHS table. 
14a50 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
14a60 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66  0; i<nExpr && af
14a70 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b  finity_ok; i++){
14a80 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
14a90 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63  Lhs = sqlite3Vec
14aa0 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
14ab0 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pX->pLeft, i);. 
14ac0 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
14ad0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
14ae0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
14af0 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61         char idxa
14b00 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c  ff = sqlite3Tabl
14b10 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  eColumnAffinity(
14b20 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52  pTab,iCol); /* R
14b30 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  HS table */.    
14b40 20 20 20 20 63 68 61 72 20 63 6d 70 61 66 66 20      char cmpaff 
14b50 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
14b60 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69  Affinity(pLhs, i
14b70 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  dxaff);.        
14b80 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66  testcase( cmpaff
14b90 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
14ba0 42 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  B );.        tes
14bb0 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53  tcase( cmpaff==S
14bc0 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
14bd0 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  ;.        switch
14be0 28 20 63 6d 70 61 66 66 20 29 7b 0a 20 20 20 20  ( cmpaff ){.    
14bf0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
14c00 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20  E_AFF_BLOB:.    
14c10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
14c20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
14c30 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20  LITE_AFF_TEXT:. 
14c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
14c50 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
14c60 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72 65 74 75  nity() only retu
14c70 72 6e 73 20 54 45 58 54 20 69 66 20 6f 6e 65 20  rns TEXT if one 
14c80 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20  side or the.    
14c90 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
14ca0 20 68 61 73 20 6e 6f 20 61 66 66 69 6e 69 74 79   has no affinity
14cb0 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 73   and the other s
14cc0 69 64 65 20 69 73 20 54 45 58 54 2e 20 20 48 65  ide is TEXT.  He
14cd0 6e 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nce,.           
14ce0 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   ** the only way
14cf0 20 66 6f 72 20 63 6d 70 61 66 66 20 74 6f 20 62   for cmpaff to b
14d00 65 20 54 45 58 54 20 69 73 20 66 6f 72 20 69 64  e TEXT is for id
14d10 78 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 0a  xaff to be TEXT.
14d20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
14d30 6e 64 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20  nd for the term 
14d40 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
14d50 65 20 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20  e IN to have no 
14d60 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20  affinity. */.   
14d70 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
14d80 20 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f   idxaff==SQLITE_
14d90 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
14da0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
14db0 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
14dc0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 66  :.            af
14dd0 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69  finity_ok = sqli
14de0 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
14df0 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20  nity(idxaff);.  
14e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14e10 0a 20 20 20 20 20 20 69 66 28 20 61 66 66 69 6e  .      if( affin
14e20 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20  ity_ok ){.      
14e30 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
14e40 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65  an existing inde
14e50 78 20 74 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b  x that will work
14e60 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65   for this IN ope
14e70 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
14e80 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
14e90 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20  pIndex; pIdx && 
14ea0 65 54 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70  eType==0; pIdx=p
14eb0 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
14ec0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63         Bitmask c
14ed0 6f 6c 55 73 65 64 3b 20 20 20 20 20 20 2f 2a 20  olUsed;      /* 
14ee0 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  Columns of the i
14ef0 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a 20 20 20  ndex used */.   
14f00 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
14f10 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Col;         /* 
14f20 4d 61 73 6b 20 66 6f 72 20 74 68 65 20 63 75 72  Mask for the cur
14f30 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  rent column */. 
14f40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
14f50 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72  x->nColumn<nExpr
14f60 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14f70 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
14f80 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
14f90 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
14fa0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
14fb0 75 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d  um nColumn is BM
14fc0 53 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20  S-2, not BMS-1, 
14fd0 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63  so that we can c
14fe0 6f 6d 70 75 74 65 0a 20 20 20 20 20 20 20 20 20  ompute.         
14ff0 20 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78 70   ** BITMASK(nExp
15000 72 29 20 77 69 74 68 6f 75 74 20 6f 76 65 72 66  r) without overf
15010 6c 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  lowing */.      
15020 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49      testcase( pI
15030 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53  dx->nColumn==BMS
15040 2d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -2 );.          
15050 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e  testcase( pIdx->
15060 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29  nColumn==BMS-1 )
15070 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
15080 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42  pIdx->nColumn>=B
15090 4d 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  MS-1 ) continue;
150a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
150b0 75 73 74 42 65 55 6e 69 71 75 65 20 29 7b 0a 20  ustBeUnique ){. 
150c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
150d0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78  Idx->nKeyCol>nEx
150e0 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  pr.             
150f0 7c 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  ||(pIdx->nColumn
15100 3e 6e 45 78 70 72 20 26 26 20 21 49 73 55 6e 69  >nExpr && !IsUni
15110 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 29 0a  queIndex(pIdx)).
15120 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
15130 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
15140 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20  tinue;  /* This 
15150 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 6e 69  index is not uni
15160 71 75 65 20 6f 76 65 72 20 74 68 65 20 49 4e 20  que over the IN 
15170 52 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  RHS columns */. 
15180 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
15190 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
151a0 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 3d 20        colUsed = 
151b0 30 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  0;   /* Columns 
151c0 6f 66 20 69 6e 64 65 78 20 75 73 65 64 20 73 6f  of index used so
151d0 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
151e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
151f0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
15200 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73        Expr *pLhs
15210 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
15220 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d  FieldSubexpr(pX-
15230 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
15240 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52          Expr *pR
15250 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  hs = pEList->a[i
15260 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
15270 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52       CollSeq *pR
15280 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  eq = sqlite3Bina
15290 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
152a0 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70  (pParse, pLhs, p
152b0 52 68 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Rhs);.          
152c0 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20    int j;.  .    
152d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
152e0 70 52 65 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d  pReq!=0 || pRhs-
152f0 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57  >iColumn==XN_ROW
15300 49 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ID || pParse->nE
15310 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rr );.          
15320 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78    for(j=0; j<nEx
15330 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
15340 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
15350 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70  ->aiColumn[j]!=p
15360 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63  Rhs->iColumn ) c
15370 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
15380 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15390 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29  Idx->azColl[j] )
153a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
153b0 69 66 28 20 70 52 65 71 21 3d 30 20 26 26 20 73  if( pReq!=0 && s
153c0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 52  qlite3StrICmp(pR
153d0 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d  eq->zName, pIdx-
153e0 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29  >azColl[j])!=0 )
153f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
15400 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
15410 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15420 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
15430 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
15440 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
15450 3d 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b 3b  ==nExpr ) break;
15460 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f  .            mCo
15470 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a  l = MASKBIT(j);.
15480 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15490 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20 29  mCol & colUsed )
154a0 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20   break; /* Each 
154b0 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79  column used only
154c0 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20   once */.       
154d0 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20       colUsed |= 
154e0 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  mCol;.          
154f0 20 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69    if( aiMap ) ai
15500 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20  Map[i] = j;.    
15510 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
15520 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
15530 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64  nExpr || colUsed
15540 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72  !=(MASKBIT(nExpr
15550 29 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  )-1) );.        
15560 20 20 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28    if( colUsed==(
15570 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31  MASKBIT(nExpr)-1
15580 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
15590 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
155a0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74  this point, that
155b0 20 6d 65 61 6e 73 20 74 68 65 20 69 6e 64 65 78   means the index
155c0 20 70 49 64 78 20 69 73 20 75 73 61 62 6c 65 20   pIdx is usable 
155d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
155e0 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
155f0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
15600 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f  OP_Once); VdbeCo
15610 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
15620 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
15630 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
15640 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15660 20 20 22 55 53 49 4e 47 20 49 4e 44 45 58 20 25    "USING INDEX %
15670 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f  s FOR IN-OPERATO
15680 52 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  R",pIdx->zName))
15690 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
156a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
156b0 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
156c0 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  iTab, pIdx->tnum
156d0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
156e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
156f0 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
15700 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  se, pIdx);.     
15710 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
15720 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64  nt((v, "%s", pId
15730 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
15740 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15750 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
15760 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f  ESC == IN_INDEX_
15770 49 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20  INDEX_ASC+1 );. 
15780 20 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65             eType
15790 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45   = IN_INDEX_INDE
157a0 58 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53  X_ASC + pIdx->aS
157b0 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 20 20 0a  ortOrder[0];.  .
157c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
157d0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a  prRhsHasNull ){.
157e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
157f0 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
15800 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 20 20  _MASK.          
15810 20 20 20 20 69 36 34 20 6d 61 73 6b 20 3d 20 28      i64 mask = (
15820 31 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a 20 20 20  1<<nExpr)-1;.   
15830 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15840 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
15850 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73  (v, OP_ColumnsUs
15860 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ed, .           
15870 20 20 20 20 20 20 20 69 54 61 62 2c 20 30 2c 20         iTab, 0, 
15880 30 2c 20 28 75 38 2a 29 26 6d 61 73 6b 2c 20 50  0, (u8*)&mask, P
15890 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66  4_INT64);.#endif
158a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
158b0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b  prRhsHasNull = +
158c0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
158e0 20 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20   nExpr==1 ){.   
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15900 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
15910 61 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52  ag(v, iTab, *prR
15920 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20  hsHasNull);.    
15930 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15940 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15950 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15960 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
15970 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  dr);.          }
15980 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e  .        } /* En
15990 64 20 6c 6f 6f 70 20 6f 76 65 72 20 69 6e 64 65  d loop over inde
159a0 78 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2f  xes */.      } /
159b0 2a 20 45 6e 64 20 69 66 28 20 61 66 66 69 6e 69  * End if( affini
159c0 74 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20 20 20 7d  ty_ok ) */.    }
159d0 20 2f 2a 20 45 6e 64 20 69 66 20 6e 6f 74 20 61   /* End if not a
159e0 6e 20 72 6f 77 69 64 20 69 6e 64 65 78 20 2a 2f  n rowid index */
159f0 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 61 74 74 65  .  } /* End atte
15a00 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  mpt to optimize 
15a10 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 2a  using an index *
15a20 2f 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72  /..  /* If no pr
15a30 65 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20  eexisting index 
15a40 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  is available for
15a50 20 74 68 65 20 49 4e 20 63 6c 61 75 73 65 0a 20   the IN clause. 
15a60 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58   ** and IN_INDEX
15a70 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f  _NOOP is an allo
15a80 77 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61  wed reply.  ** a
15a90 6e 64 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  nd the RHS of th
15aa0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
15ab0 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73   a list, not a s
15ac0 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64  ubquery.  ** and
15ad0 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20   the RHS is not 
15ae0 63 6f 6e 73 74 61 6e 74 20 6f 72 20 68 61 73 20  constant or has 
15af0 74 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72  two or fewer ter
15b00 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74  ms,.  ** then it
15b10 20 69 73 20 6e 6f 74 20 77 6f 72 74 68 20 63 72   is not worth cr
15b20 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  eating an epheme
15b30 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 65 76 61  ral table to eva
15b40 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 49  luate.  ** the I
15b50 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 72 65  N operator so re
15b60 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
15b70 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  OP..  */.  if( e
15b80 54 79 70 65 3d 3d 30 0a 20 20 20 26 26 20 28 69  Type==0.   && (i
15b90 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
15ba0 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26  X_NOOP_OK).   &&
15bb0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
15bc0 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
15bd0 63 74 29 0a 20 20 20 26 26 20 28 21 73 71 6c 69  ct).   && (!sqli
15be0 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61  te3InRhsIsConsta
15bf0 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e  nt(pX) || pX->x.
15c00 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29  pList->nExpr<=2)
15c10 0a 20 20 29 7b 0a 20 20 20 20 65 54 79 70 65 20  .  ){.    eType 
15c20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b  = IN_INDEX_NOOP;
15c30 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70  .  }..  if( eTyp
15c40 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  e==0 ){.    /* C
15c50 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e  ould not find an
15c60 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
15c70 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  or index to use 
15c80 61 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65  as the RHS b-tre
15c90 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c  e..    ** We wil
15ca0 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61  l have to genera
15cb0 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  te an ephemeral 
15cc0 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20  table to do the 
15cd0 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  job..    */.    
15ce0 75 33 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c  u32 savedNQueryL
15cf0 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51  oop = pParse->nQ
15d00 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e  ueryLoop;.    in
15d10 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d  t rMayHaveNull =
15d20 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20   0;.    eType = 
15d30 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20  IN_INDEX_EPH;.  
15d40 20 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20    if( inFlags & 
15d50 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b  IN_INDEX_LOOP ){
15d60 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
15d70 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20  QueryLoop = 0;. 
15d80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52     }else if( prR
15d90 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20  hsHasNull ){.   
15da0 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c     *prRhsHasNull
15db0 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20   = rMayHaveNull 
15dc0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
15dd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
15de0 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
15df0 4e 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  N );.    sqlite3
15e00 43 6f 64 65 52 68 73 4f 66 49 4e 28 70 50 61 72  CodeRhsOfIN(pPar
15e10 73 65 2c 20 70 58 2c 20 69 54 61 62 29 3b 0a 20  se, pX, iTab);. 
15e20 20 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e     if( rMayHaveN
15e30 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ull ){.      sql
15e40 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
15e50 61 67 28 76 2c 20 69 54 61 62 2c 20 72 4d 61 79  ag(v, iTab, rMay
15e60 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d  HaveNull);.    }
15e70 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
15e80 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e  eryLoop = savedN
15e90 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 0a 0a  QueryLoop;.  }..
15ea0 20 20 69 66 28 20 61 69 4d 61 70 20 26 26 20 65    if( aiMap && e
15eb0 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type!=IN_INDEX_I
15ec0 4e 44 45 58 5f 41 53 43 20 26 26 20 65 54 79 70  NDEX_ASC && eTyp
15ed0 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e!=IN_INDEX_INDE
15ee0 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e  X_DESC ){.    in
15ef0 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20  t i, n;.    n = 
15f00 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
15f10 72 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29  rSize(pX->pLeft)
15f20 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
15f30 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69  <n; i++) aiMap[i
15f40 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 2a 70 69  ] = i;.  }.  *pi
15f50 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 72 65  Tab = iTab;.  re
15f60 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65  turn eType;.}.#e
15f70 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
15f80 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15f90 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  RY./*.** Argumen
15fa0 74 20 70 45 78 70 72 20 69 73 20 61 6e 20 28 3f  t pExpr is an (?
15fb0 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20  , ?...) IN(...) 
15fc0 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73  expression. This
15fd0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c   .** function al
15fe0 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
15ff0 72 6e 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  rns a nul-termin
16000 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74  ated string cont
16010 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61  aining .** the a
16020 66 66 69 6e 69 74 69 65 73 20 74 6f 20 62 65 20  ffinities to be 
16030 75 73 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f  used for each co
16040 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70  lumn of the comp
16050 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74  arison..**.** It
16060 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
16070 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
16080 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74  ller to ensure t
16090 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64  hat the returned
160a0 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 65 76  .** string is ev
160b0 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
160c0 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
160d0 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
160e0 63 68 61 72 20 2a 65 78 70 72 49 4e 41 66 66 69  char *exprINAffi
160f0 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72  nity(Parse *pPar
16100 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
16110 7b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20  {.  Expr *pLeft 
16120 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
16130 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c    int nVal = sql
16140 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
16150 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c  ze(pLeft);.  Sel
16160 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 28  ect *pSelect = (
16170 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
16180 50 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70  P_xIsSelect) ? p
16190 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20  Expr->x.pSelect 
161a0 3a 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  : 0;.  char *zRe
161b0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45  t;..  assert( pE
161c0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29  xpr->op==TK_IN )
161d0 3b 0a 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74  ;.  zRet = sqlit
161e0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 50  e3DbMallocRaw(pP
161f0 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31  arse->db, nVal+1
16200 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b  );.  if( zRet ){
16210 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
16220 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b  for(i=0; i<nVal;
16230 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
16240 72 20 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56  r *pA = sqlite3V
16250 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
16260 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
16270 20 20 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69     char a = sqli
16280 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
16290 70 41 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pA);.      if( p
162a0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
162b0 20 20 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69    zRet[i] = sqli
162c0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
162d0 74 79 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  ty(pSelect->pELi
162e0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
162f0 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  a);.      }else{
16300 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d  .        zRet[i]
16310 20 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = a;.      }.  
16320 20 20 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61    }.    zRet[nVa
16330 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  l] = '\0';.  }. 
16340 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
16350 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
16360 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16370 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  UERY./*.** Load 
16380 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
16390 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
163a0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69  irst argument wi
163b0 74 68 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  th an error .** 
163c0 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66  message of the f
163d0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75  orm:.**.**   "su
163e0 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
163f0 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70   N columns - exp
16400 65 63 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76  ected M".*/   .v
16410 6f 69 64 20 73 71 6c 69 74 65 33 53 75 62 73 65  oid sqlite3Subse
16420 6c 65 63 74 45 72 72 6f 72 28 50 61 72 73 65 20  lectError(Parse 
16430 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63  *pParse, int nAc
16440 74 75 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63  tual, int nExpec
16450 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
16460 20 2a 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65   *zFmt = "sub-se
16470 6c 65 63 74 20 72 65 74 75 72 6e 73 20 25 64 20  lect returns %d 
16480 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74  columns - expect
16490 65 64 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65  ed %d";.  sqlite
164a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
164b0 2c 20 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c  , zFmt, nActual,
164c0 20 6e 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e   nExpect);.}.#en
164d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65  dif../*.** Expre
164e0 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61  ssion pExpr is a
164f0 20 76 65 63 74 6f 72 20 74 68 61 74 20 68 61 73   vector that has
16500 20 62 65 65 6e 20 75 73 65 64 20 69 6e 20 61 20   been used in a 
16510 63 6f 6e 74 65 78 74 20 77 68 65 72 65 0a 2a 2a  context where.**
16520 20 69 74 20 69 73 20 6e 6f 74 20 70 65 72 6d 69   it is not permi
16530 74 74 65 64 2e 20 49 66 20 70 45 78 70 72 20 69  tted. If pExpr i
16540 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 76  s a sub-select v
16550 65 63 74 6f 72 2c 20 74 68 69 73 20 72 6f 75 74  ector, this rout
16560 69 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73 20 74 68  ine .** loads th
16570 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 77  e Parse object w
16580 69 74 68 20 61 20 6d 65 73 73 61 67 65 20 6f 66  ith a message of
16590 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
165a0 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72     "sub-select r
165b0 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73  eturns N columns
165c0 20 2d 20 65 78 70 65 63 74 65 64 20 31 22 0a 2a   - expected 1".*
165d0 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 74 20 69  *.** Or, if it i
165e0 73 20 61 20 72 65 67 75 6c 61 72 20 73 63 61 6c  s a regular scal
165f0 61 72 20 76 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a  ar vector:.**.**
16600 20 20 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69     "row value mi
16610 73 75 73 65 64 22 0a 2a 2f 20 20 20 0a 76 6f 69  sused".*/   .voi
16620 64 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45  d sqlite3VectorE
16630 72 72 6f 72 4d 73 67 28 50 61 72 73 65 20 2a 70  rrorMsg(Parse *p
16640 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
16650 70 72 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  pr){.#ifndef SQL
16660 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16670 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  Y.  if( pExpr->f
16680 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
16690 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
166a0 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
166b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
166c0 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
166d0 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  t->nExpr, 1);.  
166e0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
166f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
16700 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f  rMsg(pParse, "ro
16710 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
16720 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
16730 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
16740 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
16750 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
16760 77 69 6c 6c 20 63 6f 6e 73 74 72 75 63 74 20 61  will construct a
16770 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
16780 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c  e containing all
16790 20 74 65 72 6d 73 0a 2a 2a 20 69 6e 20 74 68 65   terms.** in the
167a0 20 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70   RHS of an IN op
167b0 65 72 61 74 6f 72 2e 20 20 54 68 65 20 49 4e 20  erator.  The IN 
167c0 6f 70 65 72 61 74 6f 72 20 63 61 6e 20 62 65 20  operator can be 
167d0 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 77 6f  in either of two
167e0 0a 2a 2a 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a  .** forms:.**.**
167f0 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31       x IN (4,5,1
16800 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1)              
16810 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  -- IN operator w
16820 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68  ith list on righ
16830 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20  t-hand side.**  
16840 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
16850 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d  a FROM b)     --
16860 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
16870 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68  h subquery on th
16880 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68  e right.**.** Th
16890 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65  e pExpr paramete
168a0 72 20 69 73 20 74 68 65 20 49 4e 20 6f 70 65 72  r is the IN oper
168b0 61 74 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f  ator.  The curso
168c0 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
168d0 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20  .** constructed 
168e0 65 70 68 65 72 6d 65 72 61 6c 20 74 61 62 6c 65  ephermeral table
168f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 54   is returned.  T
16900 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
16910 65 20 65 70 68 65 6d 65 72 61 6c 0a 2a 2a 20 74  e ephemeral.** t
16920 61 62 6c 65 20 69 73 20 63 6f 6d 70 75 74 65 64  able is computed
16930 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
16940 62 65 72 20 69 73 20 61 6c 73 6f 20 73 74 6f 72  ber is also stor
16950 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 69 54 61  ed in pExpr->iTa
16960 62 6c 65 2c 0a 2a 2a 20 68 6f 77 65 76 65 72 20  ble,.** however 
16970 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
16980 72 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  r returned might
16990 20 6e 6f 74 20 62 65 20 74 68 65 20 73 61 6d 65   not be the same
169a0 2c 20 61 73 20 69 74 20 6d 69 67 68 74 0a 2a 2a  , as it might.**
169b0 20 68 61 76 65 20 62 65 65 6e 20 64 75 70 6c 69   have been dupli
169c0 63 61 74 65 64 20 75 73 69 6e 67 20 4f 50 5f 4f  cated using OP_O
169d0 70 65 6e 44 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  penDup..**.** If
169e0 20 74 68 65 20 4c 48 53 20 65 78 70 72 65 73 73   the LHS express
169f0 69 6f 6e 20 28 22 78 22 20 69 6e 20 74 68 65 20  ion ("x" in the 
16a00 65 78 61 6d 70 6c 65 73 29 20 69 73 20 61 20 63  examples) is a c
16a10 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 0a  olumn value, or.
16a20 2a 2a 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  ** the SELECT st
16a30 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
16a40 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
16a50 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
16a60 79 20 6f 66 20 74 68 61 74 0a 2a 2a 20 63 6f 6c  y of that.** col
16a70 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
16a80 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
16a90 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
16aa0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 53 45 4c 45   and the.** SELE
16ab0 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
16ac0 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
16ad0 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
16ae0 74 79 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 66  ty is used.** if
16af0 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68   either column h
16b00 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e  as NUMERIC or IN
16b10 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20  TEGER affinity. 
16b20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 27 78  If neither.** 'x
16b30 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
16b40 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
16b50 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
16b60 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
16b70 0a 2a 2a 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a  .** is used..*/.
16b80 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
16b90 52 68 73 4f 66 49 4e 28 0a 20 20 50 61 72 73 65  RhsOfIN(.  Parse
16ba0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
16bb0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
16bc0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
16bd0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
16be0 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 6f 70 65     /* The IN ope
16bf0 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
16c00 54 61 62 20 20 20 20 20 20 20 20 20 20 20 20 20  Tab             
16c10 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 63     /* Use this c
16c20 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a  ursor number */.
16c30 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63  ){.  int addrOnc
16c40 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
16c50 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
16c60 68 65 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72  he OP_Once instr
16c70 75 63 74 69 6f 6e 20 61 74 20 74 6f 70 20 2a 2f  uction at top */
16c80 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
16c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16ca0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
16cb0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
16cc0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  struction */.  E
16cd0 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  xpr *pLeft;     
16ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
16cf0 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
16d00 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 4b 65  operator */.  Ke
16d10 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
16d20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79  = 0;      /* Key
16d30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
16d40 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20    int nVal;     
16d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16d60 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 20   Size of vector 
16d70 70 4c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20  pLeft */.  Vdbe 
16d80 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
16d90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
16da0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
16db0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
16dc0 69 6f 6e 20 2a 2f 0a 0a 20 20 76 20 3d 20 70 50  ion */..  v = pP
16dd0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
16de0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a  ssert( v!=0 );..
16df0 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74    /* The evaluat
16e00 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 6d 75  ion of the IN mu
16e10 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65  st be repeated e
16e20 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a  very time it.  *
16e30 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
16e40 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
16e50 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
16e60 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
16e70 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
16e80 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
16e90 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
16ea0 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
16eb0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
16ec0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
16ed0 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
16ee0 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
16ef0 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
16f00 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
16f10 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
16f20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
16f30 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
16f40 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   compute the RHS
16f50 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
16f60 61 6e 64 20 72 65 75 73 65 20 69 74 20 6d 61 6e  and reuse it man
16f70 79 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  y names..  */.  
16f80 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
16f90 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56  erty(pExpr, EP_V
16fa0 61 72 53 65 6c 65 63 74 29 20 26 26 20 70 50 61  arSelect) && pPa
16fb0 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3d 3d 30  rse->iSelfTab==0
16fc0 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 75 73 65   ){.    /* Reuse
16fd0 20 6f 66 20 74 68 65 20 52 48 53 20 69 73 20 61   of the RHS is a
16fe0 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 2f 2a  llowed */.    /*
16ff0 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
17000 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
17010 6e 20 63 6f 64 65 64 2c 20 62 75 74 20 74 68 65  n coded, but the
17020 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20   previous code. 
17030 20 20 20 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20     ** might not 
17040 68 61 76 65 20 62 65 65 6e 20 69 6e 76 6f 6b 65  have been invoke
17050 64 20 79 65 74 2c 20 73 6f 20 69 6e 76 6f 6b 65  d yet, so invoke
17060 20 69 74 20 6e 6f 77 20 61 73 20 61 20 73 75 62   it now as a sub
17070 72 6f 75 74 69 6e 65 2e 20 0a 20 20 20 20 2a 2f  routine. .    */
17080 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
17090 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
170a0 45 50 5f 53 75 62 72 74 6e 29 20 29 7b 0a 20 20  EP_Subrtn) ){.  
170b0 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73      addrOnce = s
170c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
170d0 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
170e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
170f0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
17100 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
17110 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
17120 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e  .        Explain
17130 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
17140 65 2c 20 30 2c 20 22 52 45 55 53 45 20 4c 49 53  e, 0, "REUSE LIS
17150 54 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a  T SUBQUERY %d",.
17160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
17170 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
17180 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 7d  selId));.      }
17190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
171a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
171b0 6f 73 75 62 2c 20 70 45 78 70 72 2d 3e 79 2e 73  osub, pExpr->y.s
171c0 75 62 2e 72 65 67 52 65 74 75 72 6e 2c 0a 20 20  ub.regReturn,.  
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171e0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73        pExpr->y.s
171f0 75 62 2e 69 41 64 64 72 29 3b 0a 20 20 20 20 20  ub.iAddr);.     
17200 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17210 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
17220 2c 20 69 54 61 62 2c 20 70 45 78 70 72 2d 3e 69  , iTab, pExpr->i
17230 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71  Table);.      sq
17240 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
17250 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
17260 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
17270 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69    }..    /* Begi
17280 6e 20 63 6f 64 69 6e 67 20 74 68 65 20 73 75 62  n coding the sub
17290 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 45  routine */.    E
172a0 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
172b0 45 78 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29  Expr, EP_Subrtn)
172c0 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73  ;.    pExpr->y.s
172d0 75 62 2e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  ub.regReturn = +
172e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
172f0 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e     pExpr->y.sub.
17300 69 41 64 64 72 20 3d 0a 20 20 20 20 20 20 73 71  iAddr =.      sq
17310 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17320 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
17330 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72  , pExpr->y.sub.r
17340 65 67 52 65 74 75 72 6e 29 20 2b 20 31 3b 0a 20  egReturn) + 1;. 
17350 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
17360 76 2c 20 22 72 65 74 75 72 6e 20 61 64 64 72 65  v, "return addre
17370 73 73 22 29 29 3b 0a 0a 20 20 20 20 61 64 64 72  ss"));..    addr
17380 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Once = sqlite3Vd
17390 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
173a0 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
173b0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
173c0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
173d0 20 74 68 69 73 20 69 73 20 61 20 76 65 63 74 6f   this is a vecto
173e0 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  r IN operator */
173f0 0a 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72  .  pLeft = pExpr
17400 2d 3e 70 4c 65 66 74 3b 0a 20 20 6e 56 61 6c 20  ->pLeft;.  nVal 
17410 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
17420 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
17430 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
17440 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
17450 62 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 63 6f  ble that will co
17460 6e 74 61 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ntain the conten
17470 74 20 6f 66 0a 20 20 2a 2a 20 52 48 53 20 6f 66  t of.  ** RHS of
17480 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
17490 2e 0a 20 20 2a 2f 0a 20 20 70 45 78 70 72 2d 3e  ..  */.  pExpr->
174a0 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
174b0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
174c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
174d0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
174e0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 56  Expr->iTable, nV
174f0 61 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  al);.#ifdef SQLI
17500 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
17510 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 69 66 28  N_COMMENTS.  if(
17520 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
17530 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
17540 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 56 64 62  lect) ){.    Vdb
17550 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 52 65  eComment((v, "Re
17560 73 75 6c 74 20 6f 66 20 53 45 4c 45 43 54 20 25  sult of SELECT %
17570 75 22 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  u", pExpr->x.pSe
17580 6c 65 63 74 2d 3e 73 65 6c 49 64 29 29 3b 0a 20  lect->selId));. 
17590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65   }else{.    Vdbe
175a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 52 48 53  Comment((v, "RHS
175b0 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 22   of IN operator"
175c0 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
175d0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
175e0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
175f0 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c  pParse->db, nVal
17600 2c 20 31 29 3b 0a 0a 20 20 69 66 28 20 45 78 70  , 1);..  if( Exp
17610 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
17620 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
17630 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  ) ){.    /* Case
17640 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
17650 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
17660 20 2a 2a 0a 20 20 20 20 2a 2a 20 47 65 6e 65 72   **.    ** Gener
17670 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74  ate code to writ
17680 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
17690 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f   the select into
176a0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
176b0 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f     ** table allo
176c0 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  cated and opened
176d0 20 61 62 6f 76 65 2e 0a 20 20 20 20 2a 2f 0a 20   above..    */. 
176e0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65     Select *pSele
176f0 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  ct = pExpr->x.pS
17700 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 4c  elect;.    ExprL
17710 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53  ist *pEList = pS
17720 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a  elect->pEList;..
17730 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
17740 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
17750 20 22 25 73 4c 49 53 54 20 53 55 42 51 55 45 52   "%sLIST SUBQUER
17760 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 61  Y %d",.        a
17770 64 64 72 4f 6e 63 65 3f 22 22 3a 22 43 4f 52 52  ddrOnce?"":"CORR
17780 45 4c 41 54 45 44 20 22 2c 20 70 53 65 6c 65 63  ELATED ", pSelec
17790 74 2d 3e 73 65 6c 49 64 0a 20 20 20 20 29 29 3b  t->selId.    ));
177a0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c  .    /* If the L
177b0 48 53 20 61 6e 64 20 52 48 53 20 6f 66 20 74 68  HS and RHS of th
177c0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f  e IN operator do
177d0 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68 61 74   not match, that
177e0 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 77 69  .    ** error wi
177f0 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61 75  ll have been cau
17800 67 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20  ght long before 
17810 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
17820 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  int. */.    if( 
17830 41 4c 57 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e  ALWAYS(pEList->n
17840 45 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20  Expr==nVal) ){. 
17850 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
17860 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  dest;.      int 
17870 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
17880 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
17890 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 69  dest, SRT_Set, i
178a0 54 61 62 29 3b 0a 20 20 20 20 20 20 64 65 73 74  Tab);.      dest
178b0 2e 7a 41 66 66 53 64 73 74 20 3d 20 65 78 70 72  .zAffSdst = expr
178c0 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  INAffinity(pPars
178d0 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  e, pExpr);.     
178e0 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
178f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 74 65 73 74   = 0;.      test
17900 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73  case( pSelect->s
17910 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
17920 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74  tinct );.      t
17930 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66  estcase( pKeyInf
17940 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65  o==0 ); /* Cause
17950 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69  d by OOM in sqli
17960 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
17970 29 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  ) */.      if( s
17980 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
17990 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
179a0 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
179b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
179c0 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a  arse->db, dest.z
179d0 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  AffSdst);.      
179e0 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
179f0 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b  Unref(pKeyInfo);
17a00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
17a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
17a20 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
17a30 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41  rse->db, dest.zA
17a40 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 61  ffSdst);.      a
17a50 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21  ssert( pKeyInfo!
17a60 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c  =0 ); /* OOM wil
17a70 6c 20 63 61 75 73 65 20 65 78 69 74 20 61 66 74  l cause exit aft
17a80 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  er sqlite3Select
17a90 28 29 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  () */.      asse
17aa0 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
17ab0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17ac0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  EList->nExpr>0 )
17ad0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17ae0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
17af0 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
17b00 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  fo) );.      for
17b10 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b  (i=0; i<nVal; i+
17b20 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
17b30 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63   *p = sqlite3Vec
17b40 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
17b50 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
17b60 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
17b70 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42  ll[i] = sqlite3B
17b80 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
17b90 53 65 71 28 0a 20 20 20 20 20 20 20 20 20 20 20  Seq(.           
17ba0 20 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69   pParse, p, pELi
17bb0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20  st->a[i].pExpr. 
17bc0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
17bd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
17be0 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
17bf0 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b  ->x.pList!=0) ){
17c00 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20  .    /* Case 2: 
17c10 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70      expr IN (exp
17c20 72 6c 69 73 74 29 0a 20 20 20 20 2a 2a 0a 20 20  rlist).    **.  
17c30 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78    ** For each ex
17c40 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20  pression, build 
17c50 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f  an index key fro
17c60 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  m the evaluation
17c70 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 74 6f 72   and.    ** stor
17c80 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70  e it in the temp
17c90 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20  orary table. If 
17ca0 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75  <expr> is a colu
17cb0 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20  mn, then use.   
17cc0 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73   ** that columns
17cd0 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62   affinity when b
17ce0 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65  uilding index ke
17cf0 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  ys. If <expr> is
17d00 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 20 63 6f   not.    ** a co
17d10 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
17d20 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
17d30 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66 69  */.    char affi
17d40 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  nity;           
17d50 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20   /* Affinity of 
17d60 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
17d70 4e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a  N */.    int i;.
17d80 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
17d90 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
17da0 4c 69 73 74 3b 0a 20 20 20 20 73 74 72 75 63 74  List;.    struct
17db0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
17dc0 70 49 74 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72  pItem;.    int r
17dd0 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 61  1, r2, r3;.    a
17de0 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
17df0 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c  3ExprAffinity(pL
17e00 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21 61  eft);.    if( !a
17e10 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
17e20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49   affinity = SQLI
17e30 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
17e40 20 7d 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49   }.    if( pKeyI
17e50 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 61 73 73  nfo ){.      ass
17e60 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
17e70 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
17e80 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  KeyInfo) );.    
17e90 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
17ea0 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  l[0] = sqlite3Ex
17eb0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
17ec0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
17ed0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
17ee0 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
17ef0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c   expression in <
17f00 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20  exprlist>. */.  
17f10 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
17f20 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
17f30 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
17f40 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
17f50 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  rse);.    for(i=
17f60 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  pList->nExpr, pI
17f70 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e  tem=pList->a; i>
17f80 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
17f90 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
17fa0 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  2 = pItem->pExpr
17fb0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
17fc0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
17fd0 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
17fe0 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
17ff0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61  to.      ** disa
18000 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61  ble the test tha
18010 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  t was generated 
18020 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73  above that makes
18030 20 73 75 72 65 0a 20 20 20 20 20 20 2a 2a 20 74   sure.      ** t
18040 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78  his code only ex
18050 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65  ecutes once.  Be
18060 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d  cause for a non-
18070 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 2a  constant.      *
18080 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20  * expression we 
18090 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68  need to rerun th
180a0 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d  is code each tim
180b0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
180c0 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20 26    if( addrOnce &
180d0 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  & !sqlite3ExprIs
180e0 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b  Constant(pE2) ){
180f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18100 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
18110 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20  (v, addrOnce);. 
18120 20 20 20 20 20 20 20 45 78 70 72 43 6c 65 61 72         ExprClear
18130 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
18140 45 50 5f 53 75 62 72 74 6e 29 3b 0a 20 20 20 20  EP_Subrtn);.    
18150 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 30      addrOnce = 0
18160 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
18170 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
18180 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
18190 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
181a0 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  he temp table */
181b0 0a 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69  .      r3 = sqli
181c0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
181d0 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72  t(pParse, pE2, r
181e0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
181f0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18200 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33  P_MakeRecord, r3
18210 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
18220 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ty, 1);.      sq
18230 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
18240 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
18250 72 74 2c 20 69 54 61 62 2c 20 72 32 2c 20 72 33  rt, iTab, r2, r3
18260 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
18270 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18280 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
18290 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
182a0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
182b0 72 73 65 2c 20 72 32 29 3b 0a 20 20 7d 0a 20 20  rse, r2);.  }.  
182c0 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
182d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
182e0 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
182f0 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66   (void *)pKeyInf
18300 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
18310 20 20 7d 0a 20 20 69 66 28 20 61 64 64 72 4f 6e    }.  if( addrOn
18320 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ce ){.    sqlite
18330 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
18340 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20   addrOnce);.    
18350 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65  /* Subroutine re
18360 74 75 72 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  turn */.    sqli
18370 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
18380 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 45 78 70   OP_Return, pExp
18390 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75  r->y.sub.regRetu
183a0 72 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rn);.    sqlite3
183b0 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
183c0 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64  pExpr->y.sub.iAd
183d0 64 72 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62  dr-1, sqlite3Vdb
183e0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
183f0 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  1);.  }.}.#endif
18400 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
18410 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
18420 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
18430 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71   for scalar subq
18440 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61  ueries used as a
18450 20 73 75 62 71 75 65 72 79 20 65 78 70 72 65 73   subquery expres
18460 73 69 6f 6e 0a 2a 2a 20 6f 72 20 45 58 49 53 54  sion.** or EXIST
18470 53 20 6f 70 65 72 61 74 6f 72 3a 0a 2a 2a 0a 2a  S operator:.**.*
18480 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20  *     (SELECT a 
18490 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20  FROM b)         
184a0 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20   -- subquery.** 
184b0 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45      EXISTS (SELE
184c0 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d  CT a FROM b)   -
184d0 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72  - EXISTS subquer
184e0 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70  y.**.** The pExp
184f0 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  r parameter is t
18500 68 65 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49  he SELECT or EXI
18510 53 54 53 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  STS operator to 
18520 62 65 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  be coded..**.** 
18530 54 68 65 20 72 65 67 69 73 74 65 72 20 74 68 61  The register tha
18540 74 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75  t holds the resu
18550 6c 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69  lt.  For a multi
18560 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20  -column SELECT, 
18570 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69  .** the result i
18580 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 63 6f  s stored in a co
18590 6e 74 69 67 75 6f 75 73 20 61 72 72 61 79 20 6f  ntiguous array o
185a0 66 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  f registers and 
185b0 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  the.** return va
185c0 6c 75 65 20 69 73 20 74 68 65 20 72 65 67 69 73  lue is the regis
185d0 74 65 72 20 6f 66 20 74 68 65 20 6c 65 66 74 2d  ter of the left-
185e0 6d 6f 73 74 20 72 65 73 75 6c 74 20 63 6f 6c 75  most result colu
185f0 6d 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  mn..** Return 0 
18600 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
18610 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  rs..*/.#ifndef S
18620 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
18630 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  ERY.int sqlite3C
18640 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72  odeSubselect(Par
18650 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
18660 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
18670 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 20 20 20  addrOnce = 0;   
18680 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
18690 73 73 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 61 74  ss of OP_Once at
186a0 20 74 6f 70 20 6f 66 20 73 75 62 72 6f 75 74 69   top of subrouti
186b0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67  ne */.  int rReg
186c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
186d0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
186e0 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e  storing resultin
186f0 67 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  g */.  Select *p
18700 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sel;            
18710 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
18720 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65  tement to encode
18730 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
18740 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20   dest;          
18750 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c    /* How to deal
18760 20 77 69 74 68 20 53 45 4c 45 43 54 20 72 65 73   with SELECT res
18770 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ult */.  int nRe
18780 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
18790 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
187a0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
187b0 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b  .  Expr *pLimit;
187c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
187d0 2a 20 4e 65 77 20 6c 69 6d 69 74 20 65 78 70 72  * New limit expr
187e0 65 73 73 69 6f 6e 20 2a 2f 0a 0a 20 20 56 64 62  ession */..  Vdb
187f0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
18800 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
18810 76 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  v!=0 );.  testca
18820 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
18830 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 74 65  K_EXISTS );.  te
18840 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
18850 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
18860 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
18870 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c  >op==TK_EXISTS |
18880 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
18890 53 45 4c 45 43 54 20 29 3b 0a 20 20 61 73 73 65  SELECT );.  asse
188a0 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
188b0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
188c0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 53  sSelect) );.  pS
188d0 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  el = pExpr->x.pS
188e0 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 54 68 65  elect;..  /* The
188f0 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74   evaluation of t
18900 68 65 20 45 58 49 53 54 53 2f 53 45 4c 45 43 54  he EXISTS/SELECT
18910 20 6d 75 73 74 20 62 65 20 72 65 70 65 61 74 65   must be repeate
18920 64 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a  d every time it.
18930 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
18940 72 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68  red if any of th
18950 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
18960 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
18970 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
18980 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
18990 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
189a0 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
189b0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
189c0 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
189d0 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
189e0 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
189f0 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
18a00 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
18a10 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
18a20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
18a30 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
18a40 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64  can run this cod
18a50 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a  e just once.  **
18a60 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   save the result
18a70 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65  s, and reuse the
18a80 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20   same result on 
18a90 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
18aa0 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
18ab0 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
18ac0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
18ad0 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  rSelect) ){.    
18ae0 2f 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  /* If this routi
18af0 6e 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ne has already b
18b00 65 65 6e 20 63 6f 64 65 64 2c 20 74 68 65 6e 20  een coded, then 
18b10 69 6e 76 6f 6b 65 20 69 74 20 61 73 20 61 0a 20  invoke it as a. 
18b20 20 20 20 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65     ** subroutine
18b30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70  . */.    if( Exp
18b40 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
18b50 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29 20 29  pr, EP_Subrtn) )
18b60 7b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51  {.      ExplainQ
18b70 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
18b80 2c 20 30 2c 20 22 52 45 55 53 45 20 53 55 42 51  , 0, "REUSE SUBQ
18b90 55 45 52 59 20 25 64 22 2c 20 70 53 65 6c 2d 3e  UERY %d", pSel->
18ba0 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 73  selId));.      s
18bb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18bc0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 45  (v, OP_Gosub, pE
18bd0 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65  xpr->y.sub.regRe
18be0 74 75 72 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  turn,.          
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
18c00 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72  xpr->y.sub.iAddr
18c10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18c20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
18c30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 65 67     }..    /* Beg
18c40 69 6e 20 63 6f 64 69 6e 67 20 74 68 65 20 73 75  in coding the su
18c50 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
18c60 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
18c70 70 45 78 70 72 2c 20 45 50 5f 53 75 62 72 74 6e  pExpr, EP_Subrtn
18c80 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 79 2e  );.    pExpr->y.
18c90 73 75 62 2e 72 65 67 52 65 74 75 72 6e 20 3d 20  sub.regReturn = 
18ca0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
18cb0 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62      pExpr->y.sub
18cc0 2e 69 41 64 64 72 20 3d 0a 20 20 20 20 20 20 73  .iAddr =.      s
18cd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18ce0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
18cf0 30 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e  0, pExpr->y.sub.
18d00 72 65 67 52 65 74 75 72 6e 29 20 2b 20 31 3b 0a  regReturn) + 1;.
18d10 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
18d20 28 76 2c 20 22 72 65 74 75 72 6e 20 61 64 64 72  (v, "return addr
18d30 65 73 73 22 29 29 3b 0a 0a 20 20 20 20 61 64 64  ess"));..    add
18d40 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56  rOnce = sqlite3V
18d50 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
18d60 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
18d70 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 0a 20  age(v);.  }.  . 
18d80 20 2f 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54   /* For a SELECT
18d90 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
18da0 74 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75 65  to put the value
18db0 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  s for all column
18dc0 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66 69  s of.  ** the fi
18dd0 72 73 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20  rst row into an 
18de0 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
18df0 72 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  rs and return th
18e00 65 20 69 6e 64 65 78 20 6f 66 0a 20 20 2a 2a 20  e index of.  ** 
18e10 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
18e20 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  er..  **.  ** If
18e30 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53   this is an EXIS
18e40 54 53 2c 20 77 72 69 74 65 20 61 6e 20 69 6e 74  TS, write an int
18e50 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73  eger 0 (not exis
18e60 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73  ts) or 1 (exists
18e70 29 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65  ).  ** into a re
18e80 67 69 73 74 65 72 20 61 6e 64 20 72 65 74 75 72  gister and retur
18e90 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  n that register 
18ea0 6e 75 6d 62 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a  number..  **.  *
18eb0 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 2c  * In both cases,
18ec0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 75   the query is au
18ed0 67 6d 65 6e 74 65 64 20 77 69 74 68 20 22 4c 49  gmented with "LI
18ee0 4d 49 54 20 31 22 2e 20 20 41 6e 79 20 0a 20 20  MIT 1".  Any .  
18ef0 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20 6c  ** preexisting l
18f00 69 6d 69 74 20 69 73 20 64 69 73 63 61 72 64 65  imit is discarde
18f10 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  d in place of th
18f20 65 20 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20  e new LIMIT 1.. 
18f30 20 2a 2f 0a 20 20 45 78 70 6c 61 69 6e 51 75 65   */.  ExplainQue
18f40 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
18f50 31 2c 20 22 25 73 53 43 41 4c 41 52 20 53 55 42  1, "%sSCALAR SUB
18f60 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20  QUERY %d",.     
18f70 20 20 20 61 64 64 72 4f 6e 63 65 3f 22 22 3a 22     addrOnce?"":"
18f80 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 20 70 53  CORRELATED ", pS
18f90 65 6c 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 6e  el->selId));.  n
18fa0 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d  Reg = pExpr->op=
18fb0 3d 54 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53 65  =TK_SELECT ? pSe
18fc0 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l->pEList->nExpr
18fd0 20 3a 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 53   : 1;.  sqlite3S
18fe0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
18ff0 65 73 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  est, 0, pParse->
19000 6e 4d 65 6d 2b 31 29 3b 0a 20 20 70 50 61 72 73  nMem+1);.  pPars
19010 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
19020 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
19030 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
19040 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
19050 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 64 65 73  SRT_Mem;.    des
19060 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69  t.iSdst = dest.i
19070 53 44 50 61 72 6d 3b 0a 20 20 20 20 64 65 73 74  SDParm;.    dest
19080 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20  .nSdst = nReg;. 
19090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
190a0 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp3(v, OP_Null,
190b0 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d   0, dest.iSDParm
190c0 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e  , dest.iSDParm+n
190d0 52 65 67 2d 31 29 3b 0a 20 20 20 20 56 64 62 65  Reg-1);.    Vdbe
190e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
190f0 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  t subquery resul
19100 74 22 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  t"));.  }else{. 
19110 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
19120 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20  SRT_Exists;.    
19130 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19140 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
19150 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d   0, dest.iSDParm
19160 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
19170 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49  nt((v, "Init EXI
19180 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  STS result"));. 
19190 20 7d 0a 20 20 70 4c 69 6d 69 74 20 3d 20 73 71   }.  pLimit = sq
191a0 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
191b0 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e  Parse->db, TK_IN
191c0 54 45 47 45 52 2c 26 73 71 6c 69 74 65 33 49 6e  TEGER,&sqlite3In
191d0 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a  tTokens[1], 0);.
191e0 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 4c 69 6d    if( pSel->pLim
191f0 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
19200 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
19210 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c  se->db, pSel->pL
19220 69 6d 69 74 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  imit->pLeft);.  
19230 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e    pSel->pLimit->
19240 70 4c 65 66 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  pLeft = pLimit;.
19250 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 65    }else{.    pSe
19260 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
19270 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
19280 20 54 4b 5f 4c 49 4d 49 54 2c 20 70 4c 69 6d 69   TK_LIMIT, pLimi
19290 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 53 65  t, 0);.  }.  pSe
192a0 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  l->iLimit = 0;. 
192b0 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
192c0 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c  ct(pParse, pSel,
192d0 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 72   &dest) ){.    r
192e0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
192f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72  Expr->iTable = r
19300 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Reg = dest.iSDPa
19310 72 6d 3b 0a 20 20 45 78 70 72 53 65 74 56 56 41  rm;.  ExprSetVVA
19320 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
19330 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
19340 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29 7b 0a  if( addrOnce ){.
19350 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
19360 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f  umpHere(v, addrO
19370 6e 63 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75  nce);..    /* Su
19380 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20  broutine return 
19390 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
193a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
193b0 65 74 75 72 6e 2c 20 70 45 78 70 72 2d 3e 79 2e  eturn, pExpr->y.
193c0 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29 3b 0a  sub.regReturn);.
193d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
193e0 68 61 6e 67 65 50 31 28 76 2c 20 70 45 78 70 72  hangeP1(v, pExpr
193f0 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 2d 31 2c  ->y.sub.iAddr-1,
19400 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
19410 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 20  entAddr(v)-1);. 
19420 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65   }..  return rRe
19430 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  g;.}.#endif /* S
19440 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
19450 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
19460 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
19470 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20  UERY./*.** Expr 
19480 70 49 6e 20 69 73 20 61 6e 20 49 4e 28 2e 2e 2e  pIn is an IN(...
19490 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68  ) expression. Th
194a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
194b0 6b 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ks that the .** 
194c0 73 75 62 2d 73 65 6c 65 63 74 20 6f 6e 20 74 68  sub-select on th
194d0 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28  e RHS of the IN(
194e0 29 20 6f 70 65 72 61 74 6f 72 20 68 61 73 20 74  ) operator has t
194f0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
19500 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61 73  f .** columns as
19510 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74   the vector on t
19520 68 65 20 4c 48 53 2e 20 4f 72 2c 20 69 66 20 74  he LHS. Or, if t
19530 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
19540 28 29 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 20  () is not .** a 
19550 73 75 62 2d 71 75 65 72 79 2c 20 74 68 61 74 20  sub-query, that 
19560 74 68 65 20 4c 48 53 20 69 73 20 61 20 76 65 63  the LHS is a vec
19570 74 6f 72 20 6f 66 20 73 69 7a 65 20 31 2e 0a 2a  tor of size 1..*
19580 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
19590 72 43 68 65 63 6b 49 4e 28 50 61 72 73 65 20 2a  rCheckIN(Parse *
195a0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 49  pParse, Expr *pI
195b0 6e 29 7b 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f  n){.  int nVecto
195c0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  r = sqlite3ExprV
195d0 65 63 74 6f 72 53 69 7a 65 28 70 49 6e 2d 3e 70  ectorSize(pIn->p
195e0 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 28 70 49  Left);.  if( (pI
195f0 6e 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  n->flags & EP_xI
19600 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
19610 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 70 49 6e  if( nVector!=pIn
19620 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
19630 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
19640 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65      sqlite3Subse
19650 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
19660 2c 20 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74  , pIn->x.pSelect
19670 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
19680 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 20   nVector);.     
19690 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
196a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 65  .  }else if( nVe
196b0 63 74 6f 72 21 3d 31 20 29 7b 0a 20 20 20 20 73  ctor!=1 ){.    s
196c0 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f  qlite3VectorErro
196d0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 49 6e  rMsg(pParse, pIn
196e0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 72 65  ->pLeft);.    re
196f0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
19700 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
19710 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19720 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
19730 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
19740 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70  de for an IN exp
19750 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  ression..**.**  
19760 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
19770 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20   ...).**      x 
19780 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
19790 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  , ...).**.** The
197a0 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
197b0 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c 61  (LHS) is a scala
197c0 72 20 6f 72 20 76 65 63 74 6f 72 20 65 78 70 72  r or vector expr
197d0 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 0a 2a 2a  ession.  The .**
197e0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
197f0 20 28 52 48 53 29 20 69 73 20 61 6e 20 61 72 72   (RHS) is an arr
19800 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f  ay of zero or mo
19810 72 65 20 73 63 61 6c 61 72 20 76 61 6c 75 65 73  re scalar values
19820 2c 20 6f 72 20 61 0a 2a 2a 20 73 75 62 71 75 65  , or a.** subque
19830 72 79 2e 20 20 49 66 20 74 68 65 20 52 48 53 20  ry.  If the RHS 
19840 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74  is a subquery, t
19850 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
19860 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74  ult columns must
19870 0a 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 75  .** match the nu
19880 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
19890 69 6e 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e  in the vector on
198a0 20 74 68 65 20 4c 48 53 2e 20 20 49 66 20 74 68   the LHS.  If th
198b0 65 20 52 48 53 20 69 73 0a 2a 2a 20 61 20 6c 69  e RHS is.** a li
198c0 73 74 20 6f 66 20 76 61 6c 75 65 73 2c 20 74 68  st of values, th
198d0 65 20 4c 48 53 20 6d 75 73 74 20 62 65 20 61 20  e LHS must be a 
198e0 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54  scalar. .**.** T
198f0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
19900 73 20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48  s true if the LH
19910 53 20 76 61 6c 75 65 20 69 73 20 63 6f 6e 74 61  S value is conta
19920 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
19930 52 48 53 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75  RHS..** The resu
19940 6c 74 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  lt is false if t
19950 68 65 20 4c 48 53 20 69 73 20 64 65 66 69 6e 69  he LHS is defini
19960 74 65 6c 79 20 6e 6f 74 20 69 6e 20 74 68 65 20  tely not in the 
19970 52 48 53 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65  RHS.  The .** re
19980 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66 20  sult is NULL if 
19990 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
199a0 74 68 65 20 4c 48 53 20 69 6e 20 74 68 65 20 52  the LHS in the R
199b0 48 53 20 63 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a  HS cannot be .**
199c0 20 64 65 74 65 72 6d 69 6e 65 64 20 64 75 65 20   determined due 
199d0 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20  to NULLs..**.** 
199e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
199f0 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
19a00 20 6a 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66   jumps to destIf
19a10 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53  False if the LHS
19a20 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74   is not .** cont
19a30 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
19a40 20 52 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f   RHS.  If due to
19a50 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74   NULLs we cannot
19a60 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
19a70 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74  e LHS.** is cont
19a80 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
19a90 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65   then jump to de
19aa0 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68  stIfNull.  If th
19ab0 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e  e LHS is contain
19ac0 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ed.** within the
19ad0 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74   RHS then fall t
19ae0 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 53 65  hrough..**.** Se
19af0 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20 69  e the separate i
19b00 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 64 6f  n-operator.md do
19b10 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69 6c 65  cumentation file
19b20 20 69 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   in the canonica
19b30 6c 0a 2a 2a 20 53 51 4c 69 74 65 20 73 6f 75 72  l.** SQLite sour
19b40 63 65 20 74 72 65 65 20 66 6f 72 20 61 64 64 69  ce tree for addi
19b50 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
19b60 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
19b70 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
19b80 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70  deIN(.  Parse *p
19b90 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
19ba0 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
19bb0 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
19bc0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
19bd0 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
19be0 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65 73  /* The IN expres
19bf0 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sion */.  int de
19c00 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20  stIfFalse,      
19c10 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
19c20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  LHS is not conta
19c30 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20  ined in the RHS 
19c40 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e  */.  int destIfN
19c50 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ull        /* Ju
19c60 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 72  mp here if the r
19c70 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f  esults are unkno
19c80 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20  wn due to NULLs 
19c90 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73  */.){.  int rRhs
19ca0 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a  HasNull = 0;  /*
19cb0 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20 69   Register that i
19cc0 73 20 74 72 75 65 20 69 66 20 52 48 53 20 63 6f  s true if RHS co
19cd0 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75  ntains NULL valu
19ce0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  es */.  int eTyp
19cf0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
19d00 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48 53   Type of the RHS
19d10 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 3b 20   */.  int rLhs; 
19d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
19d30 65 67 69 73 74 65 72 28 73 29 20 68 6f 6c 64 69  egister(s) holdi
19d40 6e 67 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65  ng the LHS value
19d50 73 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 4f  s */.  int rLhsO
19d60 72 69 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rig;         /* 
19d70 4c 48 53 20 76 61 6c 75 65 73 20 70 72 69 6f 72  LHS values prior
19d80 20 74 6f 20 72 65 6f 72 64 65 72 69 6e 67 20 62   to reordering b
19d90 79 20 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20 20 56  y aiMap[] */.  V
19da0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
19db0 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
19dc0 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
19dd0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  tion */.  int *a
19de0 69 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  iMap = 0;       
19df0 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65 63 74  /* Map from vect
19e00 6f 72 20 66 69 65 6c 64 20 74 6f 20 69 6e 64 65  or field to inde
19e10 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  x column */.  ch
19e20 61 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20 20  ar *zAff = 0;   
19e30 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
19e40 73 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70 61  string for compa
19e50 72 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  risons */.  int 
19e60 6e 56 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20  nVector;        
19e70 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63    /* Size of vec
19e80 74 6f 72 73 20 66 6f 72 20 74 68 69 73 20 49 4e  tors for this IN
19e90 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
19ea0 6e 74 20 69 44 75 6d 6d 79 3b 20 20 20 20 20 20  nt iDummy;      
19eb0 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20 70 61       /* Dummy pa
19ec0 72 61 6d 65 74 65 72 20 74 6f 20 65 78 70 72 43  rameter to exprC
19ed0 6f 64 65 56 65 63 74 6f 72 28 29 20 2a 2f 0a 20  odeVector() */. 
19ee0 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20   Expr *pLeft;   
19ef0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48         /* The LH
19f00 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
19f10 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ator */.  int i;
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f30 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* loop counter 
19f40 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65  */.  int destSte
19f50 70 32 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68  p2;        /* Wh
19f60 65 72 65 20 74 6f 20 6a 75 6d 70 20 77 68 65 6e  ere to jump when
19f70 20 4e 55 4c 4c 73 20 73 65 65 6e 20 69 6e 20 73   NULLs seen in s
19f80 74 65 70 20 32 20 2a 2f 0a 20 20 69 6e 74 20 64  tep 2 */.  int d
19f90 65 73 74 53 74 65 70 36 20 3d 20 30 3b 20 20 20  estStep6 = 0;   
19fa0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64   /* Start of cod
19fb0 65 20 66 6f 72 20 53 74 65 70 20 36 20 2a 2f 0a  e for Step 6 */.
19fc0 20 20 69 6e 74 20 61 64 64 72 54 72 75 74 68 4f    int addrTruthO
19fd0 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  p;      /* Addre
19fe0 73 73 20 6f 66 20 6f 70 63 6f 64 65 20 74 68 61  ss of opcode tha
19ff0 74 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65  t determines the
1a000 20 49 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20   IN is true */. 
1a010 20 69 6e 74 20 64 65 73 74 4e 6f 74 4e 75 6c 6c   int destNotNull
1a020 3b 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ;      /* Jump h
1a030 65 72 65 20 69 66 20 61 20 63 6f 6d 70 61 72 69  ere if a compari
1a040 73 6f 6e 20 69 73 20 6e 6f 74 20 74 72 75 65 20  son is not true 
1a050 69 6e 20 73 74 65 70 20 36 20 2a 2f 0a 20 20 69  in step 6 */.  i
1a060 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
1a070 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
1a080 68 65 20 73 74 65 70 2d 36 20 6c 6f 6f 70 20 2a  he step-6 loop *
1a090 2f 20 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  / .  int iTab = 
1a0a0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  0;         /* In
1a0b0 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 0a 20  dex to use */.. 
1a0c0 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
1a0d0 70 4c 65 66 74 3b 0a 20 20 69 66 28 20 73 71 6c  pLeft;.  if( sql
1a0e0 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28  ite3ExprCheckIN(
1a0f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 20 29  pParse, pExpr) )
1a100 20 72 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20   return;.  zAff 
1a110 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79  = exprINAffinity
1a120 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
1a130 0a 20 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c  .  nVector = sql
1a140 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
1a150 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ze(pExpr->pLeft)
1a160 3b 0a 20 20 61 69 4d 61 70 20 3d 20 28 69 6e 74  ;.  aiMap = (int
1a170 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
1a180 63 5a 65 72 6f 28 0a 20 20 20 20 20 20 70 50 61  cZero(.      pPa
1a190 72 73 65 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72  rse->db, nVector
1a1a0 2a 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20  *(sizeof(int) + 
1a1b0 73 69 7a 65 6f 66 28 63 68 61 72 29 29 20 2b 20  sizeof(char)) + 
1a1c0 31 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 50 61  1.  );.  if( pPa
1a1d0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1a1e0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 71 6c  ailed ) goto sql
1a1f0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f  ite3ExprCodeIN_o
1a200 6f 6d 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  om_error;..  /* 
1a210 41 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75  Attempt to compu
1a220 74 65 20 74 68 65 20 52 48 53 2e 20 41 66 74 65  te the RHS. Afte
1a230 72 20 74 68 69 73 20 73 74 65 70 2c 20 69 66 20  r this step, if 
1a240 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74  anything other t
1a250 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45  han.  ** IN_INDE
1a260 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e  X_NOOP is return
1a270 65 64 2c 20 74 68 65 20 74 61 62 6c 65 20 6f 70  ed, the table op
1a280 65 6e 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ened with cursor
1a290 20 69 54 61 62 0a 20 20 2a 2a 20 63 6f 6e 74 61   iTab.  ** conta
1a2a0 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74  ins the values t
1a2b0 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
1a2c0 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44 45 58  RHS. If IN_INDEX
1a2d0 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65  _NOOP is returne
1a2e0 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48 53 20  d,.  ** the RHS 
1a2f0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1a300 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20 76 20   coded.  */.  v 
1a310 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1a320 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
1a330 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20  );       /* OOM 
1a340 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74  detected prior t
1a350 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  o this routine *
1a360 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1a370 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49  ent((v, "begin I
1a380 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79  N expr"));.  eTy
1a390 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
1a3a0 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
1a3b0 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  pExpr,.         
1a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3d0 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d      IN_INDEX_MEM
1a3e0 42 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44  BERSHIP | IN_IND
1a3f0 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20  EX_NOOP_OK,.    
1a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a410 20 20 20 20 20 20 20 20 20 64 65 73 74 49 66 46           destIfF
1a420 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c  alse==destIfNull
1a430 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e   ? 0 : &rRhsHasN
1a440 75 6c 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ull,.           
1a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a460 20 20 61 69 4d 61 70 2c 20 26 69 54 61 62 29 3b    aiMap, &iTab);
1a470 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1a480 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63  se->nErr || nVec
1a490 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d  tor==1 || eType=
1a4a0 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20  =IN_INDEX_EPH.  
1a4b0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49       || eType==I
1a4c0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
1a4d0 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  C || eType==IN_I
1a4e0 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
1a4f0 0a 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  .  );.#ifdef SQL
1a500 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43  ITE_DEBUG.  /* C
1a510 6f 6e 66 69 72 6d 20 74 68 61 74 20 61 69 4d 61  onfirm that aiMa
1a520 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65  p[] contains nVe
1a530 63 74 6f 72 20 69 6e 74 65 67 65 72 20 76 61 6c  ctor integer val
1a540 75 65 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ues between 0 an
1a550 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31  d.  ** nVector-1
1a560 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
1a570 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
1a580 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b  .    int j, cnt;
1a590 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30  .    for(cnt=j=0
1a5a0 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b  ; j<nVector; j++
1a5b0 29 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d  ) if( aiMap[j]==
1a5c0 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61  i ) cnt++;.    a
1a5d0 73 73 65 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b  ssert( cnt==1 );
1a5e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1a5f0 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20  * Code the LHS, 
1a600 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20  the <expr> from 
1a610 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29  "<expr> IN (...)
1a620 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  ". If the LHS is
1a630 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c   a .  ** vector,
1a640 20 74 68 65 6e 20 69 74 20 69 73 20 73 74 6f 72   then it is stor
1a650 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  ed in an array o
1a660 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69 73 74  f nVector regist
1a670 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a 20 20  ers starting .  
1a680 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20  ** at r1..  **. 
1a690 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 49   ** sqlite3FindI
1a6a0 6e 49 6e 64 65 78 28 29 20 6d 69 67 68 74 20 68  nIndex() might h
1a6b0 61 76 65 20 72 65 6f 72 64 65 72 65 64 20 74 68  ave reordered th
1a6c0 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
1a6d0 4c 48 53 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20  LHS vector.  ** 
1a6e0 73 6f 20 74 68 61 74 20 74 68 65 20 66 69 65 6c  so that the fiel
1a6f0 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 61  ds are in the sa
1a700 6d 65 20 6f 72 64 65 72 20 61 73 20 61 6e 20 65  me order as an e
1a710 78 69 73 74 69 6e 67 20 69 6e 64 65 78 2e 20 20  xisting index.  
1a720 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b   The.  ** aiMap[
1a730 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
1a740 20 61 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20   a mapping from 
1a750 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53  the original LHS
1a760 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a   field order to.
1a770 20 20 2a 2a 20 74 68 65 20 66 69 65 6c 64 20 6f    ** the field o
1a780 72 64 65 72 20 74 68 61 74 20 6d 61 74 63 68 65  rder that matche
1a790 73 20 74 68 65 20 52 48 53 20 69 6e 64 65 78 2e  s the RHS index.
1a7a0 0a 20 20 2a 2f 0a 20 20 72 4c 68 73 4f 72 69 67  .  */.  rLhsOrig
1a7b0 20 3d 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f   = exprCodeVecto
1a7c0 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  r(pParse, pLeft,
1a7d0 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72   &iDummy);.  for
1a7e0 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20  (i=0; i<nVector 
1a7f0 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20  && aiMap[i]==i; 
1a800 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48  i++){} /* Are LH
1a810 53 20 66 69 65 6c 64 73 20 72 65 6f 72 64 65 72  S fields reorder
1a820 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d  ed? */.  if( i==
1a830 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f  nVector ){.    /
1a840 2a 20 4c 48 53 20 66 69 65 6c 64 73 20 61 72 65  * LHS fields are
1a850 20 6e 6f 74 20 72 65 6f 72 64 65 72 65 64 20 2a   not reordered *
1a860 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 72 4c 68  /.    rLhs = rLh
1a870 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a  sOrig;.  }else{.
1a880 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
1a890 65 6f 72 64 65 72 20 74 68 65 20 4c 48 53 20 66  eorder the LHS f
1a8a0 69 65 6c 64 73 20 61 63 63 6f 72 64 69 6e 67 20  ields according 
1a8b0 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20  to aiMap */.    
1a8c0 72 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 47 65  rLhs = sqlite3Ge
1a8d0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1a8e0 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20  e, nVector);.   
1a8f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
1a900 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tor; i++){.     
1a910 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a920 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
1a930 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b  LhsOrig+i, rLhs+
1a940 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20  aiMap[i], 0);.  
1a950 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1a960 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
1a970 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69  dex() did not fi
1a980 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20  nd or create an 
1a990 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20 20  index that is.  
1a9a0 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
1a9b0 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49  evaluating the I
1a9c0 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e  N operator, then
1a9d0 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20   evaluate using 
1a9e0 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20  a.  ** sequence 
1a9f0 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
1aa00 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69    **.  ** This i
1aa10 73 20 73 74 65 70 20 28 31 29 20 69 6e 20 74 68  s step (1) in th
1aa20 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64  e in-operator.md
1aa30 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72   optimized algor
1aa40 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ithm..  */.  if(
1aa50 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
1aa60 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70  _NOOP ){.    Exp
1aa70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
1aa80 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1aa90 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
1aaa0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1aab0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1aac0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1aad0 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20    int labelOk = 
1aae0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1aaf0 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
1ab00 20 20 69 6e 74 20 72 32 2c 20 72 65 67 54 6f 46    int r2, regToF
1ab10 72 65 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  ree;.    int reg
1ab20 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  CkNull = 0;.    
1ab30 69 6e 74 20 69 69 3b 0a 20 20 20 20 61 73 73 65  int ii;.    asse
1ab40 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1ab50 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1ab60 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
1ab70 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 21   if( destIfNull!
1ab80 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
1ab90 20 20 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20        regCkNull 
1aba0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1abb0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1abc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1abd0 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e  dOp3(v, OP_BitAn
1abe0 64 2c 20 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72  d, rLhs, rLhs, r
1abf0 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d  egCkNull);.    }
1ac00 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
1ac10 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1ac20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20  ii++){.      r2 
1ac30 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1ac40 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
1ac50 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  ist->a[ii].pExpr
1ac60 2c 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20  , &regToFree);. 
1ac70 20 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75       if( regCkNu
1ac80 6c 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  ll && sqlite3Exp
1ac90 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74  rCanBeNull(pList
1aca0 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29  ->a[ii].pExpr) )
1acb0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1acc0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1acd0 50 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e  P_BitAnd, regCkN
1ace0 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75  ull, r2, regCkNu
1acf0 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
1ad00 20 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d     if( ii<pList-
1ad10 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74  >nExpr-1 || dest
1ad20 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61  IfNull!=destIfFa
1ad30 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  lse ){.        s
1ad40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1ad50 28 76 2c 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c  (v, OP_Eq, rLhs,
1ad60 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20   labelOk, r2,.  
1ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad80 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
1ad90 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
1ada0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
1adb0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3c  overageIf(v, ii<
1adc0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b  pList->nExpr-1);
1add0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
1ade0 65 72 61 67 65 49 66 28 76 2c 20 69 69 3d 3d 70  erageIf(v, ii==p
1adf0 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  List->nExpr-1);.
1ae00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ae10 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a  dbeChangeP5(v, z
1ae20 41 66 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  Aff[0]);.      }
1ae30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
1ae40 73 65 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c  sert( destIfNull
1ae50 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b  ==destIfFalse );
1ae60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ae70 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1ae80 5f 4e 65 2c 20 72 4c 68 73 2c 20 64 65 73 74 49  _Ne, rLhs, destI
1ae90 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20  fFalse, r2,.    
1aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aeb0 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f        (void*)pCo
1aec0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
1aed0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1aee0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1aef0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1af00 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54   zAff[0] | SQLIT
1af10 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1af20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1af30 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1af40 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f  eg(pParse, regTo
1af50 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Free);.    }.   
1af60 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29   if( regCkNull )
1af70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1af80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1af90 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c  IsNull, regCkNul
1afa0 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20  l, destIfNull); 
1afb0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1afc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1afd0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66  beGoto(v, destIf
1afe0 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  False);.    }.  
1aff0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1b000 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1b010 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  elOk);.    sqlit
1b020 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1b030 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75  (pParse, regCkNu
1b040 6c 6c 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71  ll);.    goto sq
1b050 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
1b060 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20  finished;.  }.. 
1b070 20 2f 2a 20 53 74 65 70 20 32 3a 20 43 68 65 63   /* Step 2: Chec
1b080 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1b090 4c 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  LHS contains any
1b0a0 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20   NULL columns.  
1b0b0 49 66 20 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20  If the.  ** LHS 
1b0c0 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c  does contain NUL
1b0d0 4c 73 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  Ls then the resu
1b0e0 6c 74 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  lt must be eithe
1b0f0 72 20 46 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e  r FALSE or NULL.
1b100 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68  .  ** We will th
1b110 65 6e 20 73 6b 69 70 20 74 68 65 20 62 69 6e 61  en skip the bina
1b120 72 79 20 73 65 61 72 63 68 20 6f 66 20 74 68 65  ry search of the
1b130 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   RHS..  */.  if(
1b140 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
1b150 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
1b160 64 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74  destStep2 = dest
1b170 49 66 46 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65  IfFalse;.  }else
1b180 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70 32 20  {.    destStep2 
1b190 3d 20 64 65 73 74 53 74 65 70 36 20 3d 20 73 71  = destStep6 = sq
1b1a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1b1b0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  el(pParse);.  }.
1b1c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
1b1d0 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
1b1e0 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
1b1f0 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
1b200 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  xpr(pExpr->pLeft
1b210 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71  , i);.    if( sq
1b220 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
1b230 6c 6c 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73  ll(p) ){.      s
1b240 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b250 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
1b260 4c 68 73 2b 69 2c 20 64 65 73 74 53 74 65 70 32  Lhs+i, destStep2
1b270 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1b280 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
1b290 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 33    }..  /* Step 3
1b2a0 2e 20 20 54 68 65 20 4c 48 53 20 69 73 20 6e 6f  .  The LHS is no
1b2b0 77 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f  w known to be no
1b2c0 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20 74 68 65 20  n-NULL.  Do the 
1b2d0 62 69 6e 61 72 79 20 73 65 61 72 63 68 0a 20 20  binary search.  
1b2e0 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 20 75 73  ** of the RHS us
1b2f0 69 6e 67 20 74 68 65 20 4c 48 53 20 61 73 20 61  ing the LHS as a
1b300 20 70 72 6f 62 65 2e 20 20 49 66 20 66 6f 75 6e   probe.  If foun
1b310 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  d, the result is
1b320 0a 20 20 2a 2a 20 74 72 75 65 2e 0a 20 20 2a 2f  .  ** true..  */
1b330 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e  .  if( eType==IN
1b340 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
1b350 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
1b360 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20  ase, the RHS is 
1b370 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62  the ROWID of tab
1b380 6c 65 20 62 2d 74 72 65 65 20 61 6e 64 20 73 6f  le b-tree and so
1b390 20 77 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20   we also.    ** 
1b3a0 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 52 48  know that the RH
1b3b0 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20  S is non-NULL.  
1b3c0 48 65 6e 63 65 2c 20 77 65 20 63 6f 6d 62 69 6e  Hence, we combin
1b3d0 65 20 73 74 65 70 73 20 33 20 61 6e 64 20 34 0a  e steps 3 and 4.
1b3e0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 73 69      ** into a si
1b3f0 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a  ngle opcode. */.
1b400 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b410 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp3(v, OP_Seek
1b420 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 64 65 73  Rowid, iTab, des
1b430 74 49 66 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b  tIfFalse, rLhs);
1b440 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1b450 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 54 72  e(v);.    addrTr
1b460 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56  uthOp = sqlite3V
1b470 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
1b480 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72  Goto);  /* Retur
1b490 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73  n True */.  }els
1b4a0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
1b4b0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
1b4c0 66 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e  ffinity, rLhs, n
1b4d0 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c  Vector, 0, zAff,
1b4e0 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 69   nVector);.    i
1b4f0 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d  f( destIfFalse==
1b500 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20  destIfNull ){.  
1b510 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53      /* Combine S
1b520 74 65 70 20 33 20 61 6e 64 20 53 74 65 70 20 35  tep 3 and Step 5
1b530 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f   into a single o
1b540 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 73  pcode */.      s
1b550 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1b560 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
1b570 6e 64 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66  nd, iTab, destIf
1b580 46 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 20 20  False,.         
1b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5a0 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29    rLhs, nVector)
1b5b0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1b5c0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 71  );.      goto sq
1b5d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
1b5e0 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
1b5f0 20 20 20 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20      /* Ordinary 
1b600 53 74 65 70 20 33 2c 20 66 6f 72 20 74 68 65 20  Step 3, for the 
1b610 63 61 73 65 20 77 68 65 72 65 20 46 41 4c 53 45  case where FALSE
1b620 20 61 6e 64 20 4e 55 4c 4c 20 61 72 65 20 64 69   and NULL are di
1b630 73 74 69 6e 63 74 20 2a 2f 0a 20 20 20 20 61 64  stinct */.    ad
1b640 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69  drTruthOp = sqli
1b650 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1b660 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
1b670 61 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ab, 0,.         
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68               rLh
1b6a0 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62  s, nVector); Vdb
1b6b0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b6c0 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 34 2e 20  }..  /* Step 4. 
1b6d0 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20 6b   If the RHS is k
1b6e0 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e  nown to be non-N
1b6f0 55 4c 4c 20 61 6e 64 20 77 65 20 64 69 64 20 6e  ULL and we did n
1b700 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20  ot find.  ** an 
1b710 6d 61 74 63 68 20 6f 6e 20 74 68 65 20 73 65 61  match on the sea
1b720 72 63 68 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  rch above, then 
1b730 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20  the result must 
1b740 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20  be FALSE..  */. 
1b750 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c   if( rRhsHasNull
1b760 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29   && nVector==1 )
1b770 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1b780 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f  eAddOp2(v, OP_No
1b790 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75  tNull, rRhsHasNu
1b7a0 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  ll, destIfFalse)
1b7b0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
1b7c0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
1b7d0 20 53 74 65 70 20 35 2e 20 20 49 66 20 77 65 20   Step 5.  If we 
1b7e0 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
1b7f0 74 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  t the difference
1b800 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e   between NULL an
1b810 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68  d.  ** FALSE, th
1b820 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 66  en just return f
1b830 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  alse. .  */.  if
1b840 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64  ( destIfFalse==d
1b850 65 73 74 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69  estIfNull ) sqli
1b860 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
1b870 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20  estIfFalse);..  
1b880 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20  /* Step 6: Loop 
1b890 74 68 72 6f 75 67 68 20 72 6f 77 73 20 6f 66 20  through rows of 
1b8a0 74 68 65 20 52 48 53 2e 20 20 43 6f 6d 70 61 72  the RHS.  Compar
1b8b0 65 20 65 61 63 68 20 72 6f 77 20 74 6f 20 74 68  e each row to th
1b8c0 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61  e LHS..  ** If a
1b8d0 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  ny comparison is
1b8e0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
1b8f0 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20  result is NULL. 
1b900 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d   If all.  ** com
1b910 70 61 72 69 73 6f 6e 73 20 61 72 65 20 46 41 4c  parisons are FAL
1b920 53 45 20 74 68 65 6e 20 74 68 65 20 66 69 6e 61  SE then the fina
1b930 6c 20 72 65 73 75 6c 74 20 69 73 20 46 41 4c 53  l result is FALS
1b940 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  E..  **.  ** For
1b950 20 61 20 73 63 61 6c 61 72 20 4c 48 53 2c 20 69   a scalar LHS, i
1b960 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  t is sufficient 
1b970 74 6f 20 63 68 65 63 6b 20 6a 75 73 74 20 74 68  to check just th
1b980 65 20 66 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a  e first row.  **
1b990 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a   of the RHS..  *
1b9a0 2f 0a 20 20 69 66 28 20 64 65 73 74 53 74 65 70  /.  if( destStep
1b9b0 36 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 52  6 ) sqlite3VdbeR
1b9c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1b9d0 65 73 74 53 74 65 70 36 29 3b 0a 20 20 61 64 64  estStep6);.  add
1b9e0 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
1b9f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
1ba00 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 64 65 73  ewind, iTab, des
1ba10 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 56 64 62  tIfFalse);.  Vdb
1ba20 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1ba30 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b  if( nVector>1 ){
1ba40 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  .    destNotNull
1ba50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1ba60 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
1ba70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1ba80 20 46 6f 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c   For nVector==1,
1ba90 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 36   combine steps 6
1baa0 20 61 6e 64 20 37 20 62 79 20 69 6d 6d 65 64 69   and 7 by immedi
1bab0 61 74 65 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a  ately returning.
1bac0 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20      ** FALSE if 
1bad0 74 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72  the first compar
1bae0 69 73 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ison is not NULL
1baf0 20 2a 2f 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e   */.    destNotN
1bb00 75 6c 6c 20 3d 20 64 65 73 74 49 66 46 61 6c 73  ull = destIfFals
1bb10 65 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  e;.  }.  for(i=0
1bb20 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
1bb30 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
1bb40 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
1bb50 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 33 20 3d  ll;.    int r3 =
1bb60 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1bb70 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1bb80 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  p = sqlite3Vecto
1bb90 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c  rFieldSubexpr(pL
1bba0 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f  eft, i);.    pCo
1bbb0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1bbc0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1bbd0 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
1bbe0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1bbf0 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 69 2c  Column, iTab, i,
1bc00 20 72 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   r3);.    sqlite
1bc10 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1bc20 50 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65  P_Ne, rLhs+i, de
1bc30 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20  stNotNull, r3,. 
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc50 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
1bc60 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
1bc70 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1bc80 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1bc90 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1bca0 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a  Parse, r3);.  }.
1bcb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bcc0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1bcd0 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  0, destIfNull);.
1bce0 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20    if( nVector>1 
1bcf0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1bd00 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1bd10 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a  , destNotNull);.
1bd20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bd30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
1bd40 2c 20 69 54 61 62 2c 20 61 64 64 72 54 6f 70 2b  , iTab, addrTop+
1bd50 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  1);.    VdbeCove
1bd60 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  rage(v);..    /*
1bd70 20 53 74 65 70 20 37 3a 20 20 49 66 20 77 65 20   Step 7:  If we 
1bd80 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
1bd90 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  , we know that t
1bda0 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 0a 20  he result must. 
1bdb0 20 20 20 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20     ** be false. 
1bdc0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
1bdd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1bde0 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61  oto, 0, destIfFa
1bdf0 6c 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lse);.  }..  /* 
1be00 4a 75 6d 70 73 20 68 65 72 65 20 69 6e 20 6f 72  Jumps here in or
1be10 64 65 72 20 74 6f 20 72 65 74 75 72 6e 20 74 72  der to return tr
1be20 75 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ue. */.  sqlite3
1be30 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1be40 61 64 64 72 54 72 75 74 68 4f 70 29 3b 0a 0a 73  addrTruthOp);..s
1be50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
1be60 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28  _finished:.  if(
1be70 20 72 4c 68 73 21 3d 72 4c 68 73 4f 72 69 67 20   rLhs!=rLhsOrig 
1be80 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  ) sqlite3Release
1be90 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1bea0 72 4c 68 73 29 3b 0a 20 20 56 64 62 65 43 6f 6d  rLhs);.  VdbeCom
1beb0 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e  ment((v, "end IN
1bec0 20 65 78 70 72 22 29 29 3b 0a 73 71 6c 69 74 65   expr"));.sqlite
1bed0 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f  3ExprCodeIN_oom_
1bee0 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33  error:.  sqlite3
1bef0 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1bf00 62 2c 20 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c  b, aiMap);.  sql
1bf10 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
1bf20 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a  e->db, zAff);.}.
1bf30 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1bf40 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
1bf50 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1bf60 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1bf70 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  POINT./*.** Gene
1bf80 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
1bf90 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
1bfa0 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70  t the floating p
1bfb0 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65  oint.** value de
1bfc0 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e  scribed by z[0..
1bfd0 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
1bfe0 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er iMem..**.** T
1bff0 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69  he z[] string wi
1c000 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20  ll probably not 
1c010 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  be zero-terminat
1c020 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a  ed.  But the .**
1c030 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20   z[n] character 
1c040 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1c050 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   be something th
1c060 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b  at does not look
1c070 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e  .** like the con
1c080 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  tinuation of the
1c090 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
1c0a0 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c  ic void codeReal
1c0b0 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
1c0c0 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67  char *z, int neg
1c0d0 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65  ateFlag, int iMe
1c0e0 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  m){.  if( ALWAYS
1c0f0 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f  (z!=0) ){.    do
1c100 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20  uble value;.    
1c110 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26  sqlite3AtoF(z, &
1c120 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74  value, sqlite3St
1c130 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54  rlen30(z), SQLIT
1c140 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73  E_UTF8);.    ass
1c150 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e  ert( !sqlite3IsN
1c160 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20  aN(value) ); /* 
1c170 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76  The new AtoF nev
1c180 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a  er returns NaN *
1c190 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74 65  /.    if( negate
1c1a0 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d  Flag ) value = -
1c1b0 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  value;.    sqlit
1c1c0 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
1c1d0 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
1c1e0 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76  iMem, 0, (u8*)&v
1c1f0 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a  alue, P4_REAL);.
1c200 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
1c210 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
1c220 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
1c230 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69  t will put the i
1c240 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20  nteger describe 
1c250 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e  by.** text z[0..
1c260 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
1c270 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45  er iMem..**.** E
1c280 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20  xpr.u.zToken is 
1c290 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64 20  always UTF8 and 
1c2a0 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
1c2b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c2c0 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72 73  codeInteger(Pars
1c2d0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1c2e0 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46  *pExpr, int negF
1c2f0 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
1c300 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1c310 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
1c320 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
1c330 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
1c340 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72     int i = pExpr
1c350 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
1c360 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a  assert( i>=0 );.
1c370 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
1c380 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71  ) i = -i;.    sq
1c390 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1c3a0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
1c3b0 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65  , iMem);.  }else
1c3c0 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20  {.    int c;.   
1c3d0 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20   i64 value;.    
1c3e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1c3f0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
1c400 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d  .    assert( z!=
1c410 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c  0 );.    c = sql
1c420 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
1c430 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20  4(z, &value);.  
1c440 20 20 69 66 28 20 28 63 3d 3d 33 20 26 26 20 21    if( (c==3 && !
1c450 6e 65 67 46 6c 61 67 29 20 7c 7c 20 28 63 3d 3d  negFlag) || (c==
1c460 32 29 20 7c 7c 20 28 6e 65 67 46 6c 61 67 20 26  2) || (negFlag &
1c470 26 20 76 61 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53  & value==SMALLES
1c480 54 5f 49 4e 54 36 34 29 29 7b 0a 23 69 66 64 65  T_INT64)){.#ifde
1c490 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1c4a0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
1c4b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c4c0 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72  sg(pParse, "over
1c4d0 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25  sized integer: %
1c4e0 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20  s%s", negFlag ? 
1c4f0 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65  "-" : "", z);.#e
1c500 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  lse.#ifndef SQLI
1c510 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45  TE_OMIT_HEX_INTE
1c520 47 45 52 0a 20 20 20 20 20 20 69 66 28 20 73 71  GER.      if( sq
1c530 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
1c540 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20  ,"0x",2)==0 ){. 
1c550 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1c560 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1c570 68 65 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20  hex literal too 
1c580 62 69 67 3a 20 25 73 25 73 22 2c 20 6e 65 67 46  big: %s%s", negF
1c590 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20  lag?"-":"",z);. 
1c5a0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
1c5b0 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
1c5c0 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c    codeReal(v, z,
1c5d0 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b   negFlag, iMem);
1c5e0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1c5f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c600 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20   if( negFlag ){ 
1c610 76 61 6c 75 65 20 3d 20 63 3d 3d 33 20 3f 20 53  value = c==3 ? S
1c620 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20  MALLEST_INT64 : 
1c630 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20  -value; }.      
1c640 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c650 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36  4Dup8(v, OP_Int6
1c660 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28  4, 0, iMem, 0, (
1c670 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 49  u8*)&value, P4_I
1c680 4e 54 36 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NT64);.    }.  }
1c690 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  .}.../* Generate
1c6a0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1c6b0 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73 74  load into regist
1c6c0 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c 75  er regOut a valu
1c6d0 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70 70  e that is.** app
1c6e0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
1c6f0 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75   iIdxCol-th colu
1c700 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  mn of index pIdx
1c710 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c720 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64  3ExprCodeLoadInd
1c730 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  exColumn(.  Pars
1c740 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20 54  e *pParse,  /* T
1c750 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1c760 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
1c770 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20 69  Idx,    /* The i
1c780 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d  ndex whose colum
1c790 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64 65  n is to be loade
1c7a0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  d */.  int iTabC
1c7b0 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ur,    /* Cursor
1c7c0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74   pointing to a t
1c7d0 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  able row */.  in
1c7e0 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a  t iIdxCol,    /*
1c7f0 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   The column of t
1c800 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 6c  he index to be l
1c810 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  oaded */.  int r
1c820 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53 74  egOut      /* St
1c830 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63 6f  ore the index co
1c840 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68  lumn value in th
1c850 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
1c860 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c 20  {.  i16 iTabCol 
1c870 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
1c880 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28  [iIdxCol];.  if(
1c890 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50   iTabCol==XN_EXP
1c8a0 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  R ){.    assert(
1c8b0 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20   pIdx->aColExpr 
1c8c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1c8d0 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e  Idx->aColExpr->n
1c8e0 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a  Expr>iIdxCol );.
1c8f0 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
1c900 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 20 2b  fTab = iTabCur +
1c910 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   1;.    sqlite3E
1c920 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72  xprCodeCopy(pPar
1c930 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  se, pIdx->aColEx
1c940 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70  pr->a[iIdxCol].p
1c950 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20  Expr, regOut);. 
1c960 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66     pParse->iSelf
1c970 54 61 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Tab = 0;.  }else
1c980 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1c990 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
1c9a0 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 56  Table(pParse->pV
1c9b0 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c  dbe, pIdx->pTabl
1c9c0 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20 20  e, iTabCur,.    
1c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9f0 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29  iTabCol, regOut)
1ca00 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
1ca10 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1ca20 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  extract the valu
1ca30 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68  e of the iCol-th
1ca40 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
1ca50 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
1ca60 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1ca70 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56  lumnOfTable(.  V
1ca80 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f  dbe *v,        /
1ca90 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72  * The VDBE under
1caa0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1cab0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
1cac0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
1cad0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
1cae0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  alue */.  int iT
1caf0 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65  abCur,    /* The
1cb00 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20   table cursor.  
1cb10 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72  Or the PK cursor
1cb20 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
1cb30 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  ID */.  int iCol
1cb40 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ,       /* Index
1cb50 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74   of the column t
1cb60 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69  o extract */.  i
1cb70 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f  nt regOut      /
1cb80 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
1cb90 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65  lue into this re
1cba0 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  gister */.){.  i
1cbb0 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
1cbc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cbd0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
1cbe0 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c  , iTabCur, iCol,
1cbf0 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 72 65   regOut);.    re
1cc00 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
1cc10 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d  iCol<0 || iCol==
1cc20 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
1cc30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cc40 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
1cc50 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75  , iTabCur, regOu
1cc60 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
1cc70 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74   int op = IsVirt
1cc80 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56  ual(pTab) ? OP_V
1cc90 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75  Column : OP_Colu
1cca0 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  mn;.    int x = 
1ccb0 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48  iCol;.    if( !H
1ccc0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26  asRowid(pTab) &&
1ccd0 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
1cce0 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73  ) ){.      x = s
1ccf0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
1cd00 64 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61  dex(sqlite3Prima
1cd10 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
1cd20 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , iCol);.    }. 
1cd30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cd40 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62  dOp3(v, op, iTab
1cd50 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b  Cur, x, regOut);
1cd60 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
1cd70 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1cd80 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76  3ColumnDefault(v
1cd90 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65  , pTab, iCol, re
1cda0 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  gOut);.  }.}../*
1cdb0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1cdc0 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  e that will extr
1cdd0 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  act the iColumn-
1cde0 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a  th column from.*
1cdf0 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  * table pTab and
1ce00 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d   store the colum
1ce10 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  n value in regis
1ce20 74 65 72 20 69 52 65 67 2e 20 0a 2a 2a 0a 2a 2a  ter iReg. .**.**
1ce30 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
1ce40 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f  n open cursor to
1ce50 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20   pTab in iTable 
1ce60 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
1ce70 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  e.** is called. 
1ce80 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68   If iColumn<0 th
1ce90 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  en code is gener
1cea0 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63  ated that extrac
1ceb0 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f  ts the rowid..*/
1cec0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
1ced0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20  CodeGetColumn(. 
1cee0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1cef0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1cf00 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1cf10 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
1cf20 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
1cf30 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1cf40 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
1cf50 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
1cf60 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
1cf70 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1cf80 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
1cf90 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
1cfa0 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
1cfb0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1cfc0 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
1cfd0 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20   int iReg,      
1cfe0 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
1cff0 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20  ts here */.  u8 
1d000 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p5            /*
1d010 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50   P5 value for OP
1d020 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20  _Column + FLAGS 
1d030 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
1d040 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1d050 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
1d060 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1d070 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1d080 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54  able(v, pTab, iT
1d090 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
1d0a0 52 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29  Reg);.  if( p5 )
1d0b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1d0c0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29  eChangeP5(v, p5)
1d0d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1d0e0 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Reg;.}../*.** Ge
1d0f0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d  nerate code to m
1d100 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ove content from
1d110 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
1d120 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
1d130 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
1d140 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76  iTo+nReg-1..*/.v
1d150 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1d160 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70  odeMove(Parse *p
1d170 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
1d180 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
1d190 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Reg){.  assert( 
1d1a0 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20  iFrom>=iTo+nReg 
1d1b0 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69  || iFrom+nReg<=i
1d1c0 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  To );.  sqlite3V
1d1d0 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65  dbeAddOp3(pParse
1d1e0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65  ->pVdbe, OP_Move
1d1f0 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52  , iFrom, iTo, nR
1d200 65 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  eg);.}../*.** Co
1d210 6e 76 65 72 74 20 61 20 73 63 61 6c 61 72 20 65  nvert a scalar e
1d220 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74  xpression node t
1d230 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20  o a TK_REGISTER 
1d240 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72  referencing.** r
1d250 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54  egister iReg.  T
1d260 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
1d270 6e 73 75 72 65 20 74 68 61 74 20 69 52 65 67 20  nsure that iReg 
1d280 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73  already contains
1d290 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
1d2a0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 65 78  value for the ex
1d2b0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  pression..*/.sta
1d2c0 74 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52  tic void exprToR
1d2d0 65 67 69 73 74 65 72 28 45 78 70 72 20 2a 70 45  egister(Expr *pE
1d2e0 78 70 72 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  xpr, int iReg){.
1d2f0 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
1d300 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1d310 74 65 28 70 45 78 70 72 29 3b 0a 20 20 70 2d 3e  te(pExpr);.  p->
1d320 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  op2 = p->op;.  p
1d330 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
1d340 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20  ER;.  p->iTable 
1d350 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c  = iReg;.  ExprCl
1d360 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45  earProperty(p, E
1d370 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  P_Skip);.}../*.*
1d380 2a 20 45 76 61 6c 75 61 74 65 20 61 6e 20 65 78  * Evaluate an ex
1d390 70 72 65 73 73 69 6f 6e 20 28 65 69 74 68 65 72  pression (either
1d3a0 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73   a vector or a s
1d3b0 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
1d3c0 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74  ) and store.** t
1d3d0 68 65 20 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e  he result in con
1d3e0 74 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72 61  tinguous tempora
1d3f0 72 79 20 72 65 67 69 73 74 65 72 73 2e 20 20 52  ry registers.  R
1d400 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
1d410 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  of.** the first 
1d420 72 65 67 69 73 74 65 72 20 75 73 65 64 20 74 6f  register used to
1d430 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1d440 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
1d450 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20  returned result 
1d460 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65  register is a te
1d470 6d 70 6f 72 61 72 79 20 73 63 61 6c 61 72 2c 20  mporary scalar, 
1d480 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a  then also write.
1d490 2a 2a 20 74 68 61 74 20 72 65 67 69 73 74 65 72  ** that register
1d4a0 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69   number into *pi
1d4b0 46 72 65 65 61 62 6c 65 2e 20 20 49 66 20 74 68  Freeable.  If th
1d4c0 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c  e returned resul
1d4d0 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 69 73  t register.** is
1d4e0 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79   not a temporary
1d4f0 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
1d500 73 73 69 6f 6e 20 69 73 20 61 20 76 65 63 74 6f  ssion is a vecto
1d510 72 20 73 65 74 20 2a 70 69 46 72 65 65 61 62 6c  r set *piFreeabl
1d520 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74  e.** to 0..*/.st
1d530 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64  atic int exprCod
1d540 65 56 65 63 74 6f 72 28 50 61 72 73 65 20 2a 70  eVector(Parse *p
1d550 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20  Parse, Expr *p, 
1d560 69 6e 74 20 2a 70 69 46 72 65 65 61 62 6c 65 29  int *piFreeable)
1d570 7b 0a 20 20 69 6e 74 20 69 52 65 73 75 6c 74 3b  {.  int iResult;
1d580 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d  .  int nResult =
1d590 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
1d5a0 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20 69 66 28  orSize(p);.  if(
1d5b0 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20   nResult==1 ){. 
1d5c0 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c     iResult = sql
1d5d0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1d5e0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 69 46 72  (pParse, p, piFr
1d5f0 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  eeable);.  }else
1d600 7b 0a 20 20 20 20 2a 70 69 46 72 65 65 61 62 6c  {.    *piFreeabl
1d610 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
1d620 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
1d630 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 4d  ){.#if SQLITE_OM
1d640 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1d650 20 20 69 52 65 73 75 6c 74 20 3d 20 30 3b 0a 23    iResult = 0;.#
1d660 65 6c 73 65 0a 20 20 20 20 20 20 69 52 65 73 75  else.      iResu
1d670 6c 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  lt = sqlite3Code
1d680 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
1d690 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , p);.#endif.   
1d6a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1d6b0 74 20 69 3b 0a 20 20 20 20 20 20 69 52 65 73 75  t i;.      iResu
1d6c0 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  lt = pParse->nMe
1d6d0 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  m+1;.      pPars
1d6e0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
1d6f0 6c 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  lt;.      for(i=
1d700 30 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b  0; i<nResult; i+
1d710 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
1d720 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f  te3ExprCodeFacto
1d730 72 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 2d  rable(pParse, p-
1d740 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
1d750 45 78 70 72 2c 20 69 2b 69 52 65 73 75 6c 74 29  Expr, i+iResult)
1d760 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d770 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
1d780 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  sult;.}.../*.** 
1d790 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
1d7a0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56  to the current V
1d7b0 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  dbe to evaluate 
1d7c0 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
1d7d0 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70  ression.  Attemp
1d7e0 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  t to store the r
1d7f0 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
1d800 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20  er "target"..** 
1d810 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
1d820 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74  ter where result
1d830 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  s are stored..**
1d840 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f  .** With this ro
1d850 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20  utine, there is 
1d860 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  no guarantee tha
1d870 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a  t results will.*
1d880 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  * be stored in t
1d890 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
1d8a0 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72  lt might be stor
1d8b0 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ed in some other
1d8c0 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20  .** register if 
1d8d0 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74  it is convenient
1d8e0 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20   to do so.  The 
1d8f0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1d900 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74  .** must check t
1d910 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
1d920 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75  nd move the resu
1d930 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72  lts to the desir
1d940 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a  ed.** register..
1d950 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1d960 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72  prCodeTarget(Par
1d970 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1d980 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
1d990 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
1d9a0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1d9b0 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65    /* The VM unde
1d9c0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1d9d0 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
1d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d9f0 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e   The opcode bein
1da00 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
1da10 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
1da20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1da30 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
1da40 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20  ster inReg */.  
1da50 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
1da60 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
1da70 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
1da80 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
1da90 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
1daa0 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20  egFree2 = 0;    
1dab0 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
1dac0 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65  ero free this te
1dad0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1dae0 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   */.  int r1, r2
1daf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1db00 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73  /* Various regis
1db10 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20  ter numbers */. 
1db20 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20   Expr tempX;    
1db30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1db40 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73 73 69  mporary expressi
1db50 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  on node */.  int
1db60 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65   p5 = 0;..  asse
1db70 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
1db80 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
1db90 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d  nMem );.  if( v=
1dba0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
1dbb0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
1dbc0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1dbd0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1dbe0 0a 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65  .expr_code_doove
1dbf0 72 3a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  r:.  if( pExpr==
1dc00 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
1dc10 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
1dc20 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
1dc30 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
1dc40 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1dc50 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
1dc60 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
1dc70 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
1dc80 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
1dc90 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
1dca0 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
1dcb0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
1dcc0 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
1dcd0 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
1dce0 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
1dcf0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1dd00 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
1dd10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
1dd20 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  ol->iMem;.      
1dd30 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
1dd40 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
1dd50 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
1dd60 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1dd70 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
1dd80 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
1dd90 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  xPTab,.         
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddb0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1ddc0 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  erColumn, target
1ddd0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1dde0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  n target;.      
1ddf0 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
1de00 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
1de10 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
1de20 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
1de30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1de40 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
1de50 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69   iTab = pExpr->i
1de60 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28  Table;.      if(
1de70 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1de80 28 70 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64  (pExpr, EP_Fixed
1de90 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
1dea0 2f 2a 20 54 68 69 73 20 43 4f 4c 55 4d 4e 20 65  /* This COLUMN e
1deb0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 61  xpression is rea
1dec0 6c 6c 79 20 61 20 63 6f 6e 73 74 61 6e 74 20 64  lly a constant d
1ded0 75 65 20 74 6f 20 57 48 45 52 45 20 63 6c 61 75  ue to WHERE clau
1dee0 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  se.        ** co
1def0 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e 64 20 74  nstraints, and t
1df00 68 61 74 20 63 6f 6e 73 74 61 6e 74 20 69 73 20  hat constant is 
1df10 63 6f 64 65 64 20 62 79 20 74 68 65 20 70 45 78  coded by the pEx
1df20 70 72 2d 3e 70 4c 65 66 74 0a 20 20 20 20 20 20  pr->pLeft.      
1df30 20 20 2a 2a 20 65 78 70 72 65 73 73 73 69 6f 6e    ** expresssion
1df40 2e 20 20 48 6f 77 65 76 65 72 2c 20 6d 61 6b 65  .  However, make
1df50 20 73 75 72 65 20 74 68 65 20 63 6f 6e 73 74 61   sure the consta
1df60 6e 74 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  nt has the corre
1df70 63 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ct.        ** da
1df80 74 61 74 79 70 65 20 62 79 20 61 70 70 6c 79 69  tatype by applyi
1df90 6e 67 20 74 68 65 20 41 66 66 69 6e 69 74 79 20  ng the Affinity 
1dfa0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
1dfb0 75 6d 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 20  umn to the.     
1dfc0 20 20 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 2e 0a     ** constant..
1dfd0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1dfe0 20 20 20 69 6e 74 20 69 52 65 67 20 3d 20 73 71     int iReg = sq
1dff0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1e000 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1e010 72 2d 3e 70 4c 65 66 74 2c 74 61 72 67 65 74 29  r->pLeft,target)
1e020 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 66  ;.        int af
1e030 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  f = sqlite3Table
1e040 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70  ColumnAffinity(p
1e050 45 78 70 72 2d 3e 79 2e 70 54 61 62 2c 20 70 45  Expr->y.pTab, pE
1e060 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1e070 20 20 20 20 20 20 20 69 66 28 20 61 66 66 21 3d         if( aff!=
1e080 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
1e090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
1e0a0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
1e0b0 41 66 66 5b 5d 20 3d 20 22 42 5c 30 30 30 43 5c  Aff[] = "B\000C\
1e0c0 30 30 30 44 5c 30 30 30 45 22 3b 0a 20 20 20 20  000D\000E";.    
1e0d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
1e0e0 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3d 3d 27  LITE_AFF_BLOB=='
1e0f0 41 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  A' );.          
1e100 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 41  assert( SQLITE_A
1e110 46 46 5f 54 45 58 54 3d 3d 27 42 27 20 29 3b 0a  FF_TEXT=='B' );.
1e120 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52            if( iR
1e130 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
1e140 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e150 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e160 50 5f 53 43 6f 70 79 2c 20 69 52 65 67 2c 20 74  P_SCopy, iReg, t
1e170 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1e180 20 20 20 20 69 52 65 67 20 3d 20 74 61 72 67 65      iReg = targe
1e190 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
1e1a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e1b0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1e1c0 5f 41 66 66 69 6e 69 74 79 2c 20 69 52 65 67 2c  _Affinity, iReg,
1e1d0 20 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   1, 0,.         
1e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1f0 20 20 20 26 7a 41 66 66 5b 28 61 66 66 2d 27 42     &zAff[(aff-'B
1e200 27 29 2a 32 5d 2c 20 50 34 5f 53 54 41 54 49 43  ')*2], P4_STATIC
1e210 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1e220 20 20 20 20 20 72 65 74 75 72 6e 20 69 52 65 67       return iReg
1e230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e240 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20  if( iTab<0 ){.  
1e250 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
1e260 2d 3e 69 53 65 6c 66 54 61 62 3c 30 20 29 7b 0a  ->iSelfTab<0 ){.
1e270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
1e280 65 72 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f  erating CHECK co
1e290 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73  nstraints or ins
1e2a0 65 72 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74  erting into part
1e2b0 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ial index */.   
1e2c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45         return pE
1e2d0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70  xpr->iColumn - p
1e2e0 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b  Parse->iSelfTab;
1e2f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1e300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64            /* Cod
1e310 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ing an expressio
1e320 6e 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  n that is part o
1e330 66 20 61 6e 20 69 6e 64 65 78 20 77 68 65 72 65  f an index where
1e340 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
1e350 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
1e360 65 20 69 6e 64 65 78 20 72 65 66 65 72 20 74 6f  e index refer to
1e370 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 77 68   the table to wh
1e380 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 62 65  ich the index be
1e390 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20  longs */.       
1e3a0 20 20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65     iTab = pParse
1e3b0 2d 3e 69 53 65 6c 66 54 61 62 20 2d 20 31 3b 0a  ->iSelfTab - 1;.
1e3c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e3d0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  }.      return s
1e3e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1e3f0 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
1e400 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 2c 0a 20  pExpr->y.pTab,. 
1e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1e430 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54  xpr->iColumn, iT
1e440 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  ab, target,.    
1e450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e460 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1e470 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20  ->op2);.    }.  
1e480 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
1e490 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49  R: {.      codeI
1e4a0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
1e4b0 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29  Expr, 0, target)
1e4c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1e4d0 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  arget;.    }.   
1e4e0 20 63 61 73 65 20 54 4b 5f 54 52 55 45 46 41 4c   case TK_TRUEFAL
1e4f0 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  SE: {.      sqli
1e500 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e510 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73 71 6c   OP_Integer, sql
1e520 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c  ite3ExprTruthVal
1e530 75 65 28 70 45 78 70 72 29 2c 20 74 61 72 67 65  ue(pExpr), targe
1e540 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1e550 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
1e560 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e570 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1e580 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  T.    case TK_FL
1e590 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  OAT: {.      ass
1e5a0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1e5b0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e5c0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1e5d0 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
1e5e0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
1e5f0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1e600 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1e610 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1e620 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
1e630 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1e640 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e650 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1e660 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1e670 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
1e680 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c  tring(v, target,
1e690 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e6a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e6b0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
1e6c0 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
1e6d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1e6e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e6f0 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
1e700 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1e710 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66  arget;.    }.#if
1e720 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e730 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
1e740 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
1e750 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
1e760 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1e770 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  *z;.      char *
1e780 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73  zBlob;.      ass
1e790 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1e7a0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e7b0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1e7c0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1e7d0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1e7e0 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a  x' || pExpr->u.z
1e7f0 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b  Token[0]=='X' );
1e800 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e810 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
1e820 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
1e830 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a   z = &pExpr->u.z
1e840 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20  Token[2];.      
1e850 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
1e860 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20  n30(z) - 1;.    
1e870 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d    assert( z[n]==
1e880 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42  '\'' );.      zB
1e890 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78  lob = sqlite3Hex
1e8a0 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64  ToBlob(sqlite3Vd
1e8b0 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a  beDb(v), z, n);.
1e8c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e8d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
1e8e0 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c  ob, n/2, target,
1e8f0 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59   0, zBlob, P4_DY
1e900 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72 65  NAMIC);.      re
1e910 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e920 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
1e930 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
1e940 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1e950 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1e960 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1e970 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1e980 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1e990 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20  Token!=0 );.    
1e9a0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1e9b0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20  >u.zToken[0]!=0 
1e9c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e9d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e9e0 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
1e9f0 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  ->iColumn, targe
1ea00 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  t);.      if( pE
1ea10 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
1ea20 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  !=0 ){.        c
1ea30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
1ea40 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f  qlite3VListNumTo
1ea50 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c  Name(pParse->pVL
1ea60 69 73 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ist, pExpr->iCol
1ea70 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73  umn);.        as
1ea80 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1ea90 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c  Token[0]=='?' ||
1eaa0 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75   strcmp(pExpr->u
1eab0 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29  .zToken, z)==0 )
1eac0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
1ead0 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b  ->pVList[0] = 0;
1eae0 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 56 4c 69   /* Indicate VLi
1eaf0 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72  st may no longer
1eb00 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
1eb10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1eb20 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
1eb30 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54  char*)z, P4_STAT
1eb40 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
1eb50 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1eb60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1eb70 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
1eb80 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78        return pEx
1eb90 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
1eba0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1ebb0 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
1ebc0 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
1ebd0 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
1ebe0 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
1ebf0 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
1ec00 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
1ec10 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
1ec20 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1ec30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1ec40 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
1ec50 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
1ec60 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20  arget ){.       
1ec70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ec80 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
1ec90 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
1eca0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
1ecb0 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a  target;.      }.
1ecc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ecd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61  eAddOp2(v, OP_Ca
1ece0 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  st, target,.    
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 20 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e      sqlite3Affin
1ed10 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75  ityType(pExpr->u
1ed20 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20  .zToken, 0));.  
1ed30 20 20 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67      return inReg
1ed40 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1ed50 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  * SQLITE_OMIT_CA
1ed60 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ST */.    case T
1ed70 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
1ed80 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f  K_ISNOT:.      o
1ed90 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
1eda0 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
1edb0 0a 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49  .      p5 = SQLI
1edc0 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
1edd0 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68   /* fall-through
1ede0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
1edf0 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
1ee00 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
1ee10 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
1ee20 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
1ee30 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
1ee40 45 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EQ: {.      Expr
1ee50 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
1ee60 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66  >pLeft;.      if
1ee70 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
1ee80 65 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a  ector(pLeft) ){.
1ee90 20 20 20 20 20 20 20 20 63 6f 64 65 56 65 63 74          codeVect
1eea0 6f 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  orCompare(pParse
1eeb0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c  , pExpr, target,
1eec0 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20   op, p5);.      
1eed0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1eee0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1eef0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1ef00 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1ef10 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
1ef20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1ef30 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1ef40 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1ef50 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63  ree2);.        c
1ef60 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1ef70 65 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  e, pLeft, pExpr-
1ef80 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1ef90 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1efa0 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53   inReg, SQLITE_S
1efb0 54 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20  TOREP2 | p5);.  
1efc0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1efd0 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
1efe0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
1eff0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f000 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
1f010 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f020 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
1f030 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
1f040 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f050 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
1f060 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f070 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
1f080 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
1f090 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f0a0 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
1f0b0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f0c0 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
1f0d0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
1f0e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f0f0 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
1f100 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f110 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
1f120 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
1f130 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f140 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  v,op==OP_Eq);.  
1f150 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f160 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74  NE==OP_Ne); test
1f170 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
1f180 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f190 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
1f1a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f1b0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1f1c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f1d0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1f1e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1f1f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f200 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
1f210 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
1f220 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
1f230 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
1f240 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
1f250 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
1f260 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
1f270 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
1f280 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
1f290 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
1f2a0 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
1f2b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
1f2c0 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
1f2d0 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
1f2e0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e     assert( TK_AN
1f2f0 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20  D==OP_And );    
1f300 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f310 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ( op==TK_AND );.
1f320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f330 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20  _OR==OP_Or );   
1f340 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1f350 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29  ase( op==TK_OR )
1f360 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f370 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20  TK_PLUS==OP_Add 
1f380 29 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73  );           tes
1f390 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c  tcase( op==TK_PL
1f3a0 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  US );.      asse
1f3b0 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50  rt( TK_MINUS==OP
1f3c0 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20  _Subtract );    
1f3d0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f3e0 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20  K_MINUS );.     
1f3f0 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
1f400 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
1f410 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f420 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20  op==TK_REM );.  
1f430 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
1f440 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64  ITAND==OP_BitAnd
1f450 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1f460 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44  e( op==TK_BITAND
1f470 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f480 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42  ( TK_BITOR==OP_B
1f490 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74  itOr );        t
1f4a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f4b0 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61  BITOR );.      a
1f4c0 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d  ssert( TK_SLASH=
1f4d0 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20  =OP_Divide );   
1f4e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f4f0 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20  ==TK_SLASH );.  
1f500 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1f510 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c  SHIFT==OP_ShiftL
1f520 65 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  eft );   testcas
1f530 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54  e( op==TK_LSHIFT
1f540 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f550 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_RSHIFT==OP_
1f560 53 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74  ShiftRight );  t
1f570 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f580 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  RSHIFT );.      
1f590 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41  assert( TK_CONCA
1f5a0 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20  T==OP_Concat ); 
1f5b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f5c0 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a  p==TK_CONCAT );.
1f5d0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f5e0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f5f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f600 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1f610 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1f620 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f630 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f640 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1f650 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f660 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
1f670 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
1f680 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f690 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1f6a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f6b0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1f6c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f6d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1f6e0 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
1f6f0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
1f700 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
1f710 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
1f720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
1f730 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
1f740 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ER ){.        co
1f750 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1f760 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67  , pLeft, 1, targ
1f770 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  et);.        ret
1f780 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 69 66 6e  urn target;.#ifn
1f790 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f7a0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1f7b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1f7c0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
1f7d0 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  AT ){.        as
1f7e0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1f7f0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1f800 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1f810 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1f820 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  , pLeft->u.zToke
1f830 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 1, target);. 
1f840 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61         return ta
1f850 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rget;.#endif.   
1f860 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f870 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f    tempX.op = TK_
1f880 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20  INTEGER;.       
1f890 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45   tempX.flags = E
1f8a0 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f  P_IntValue|EP_To
1f8b0 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20  kenOnly;.       
1f8c0 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20   tempX.u.iValue 
1f8d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20  = 0;.        r1 
1f8e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f8f0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74  eTemp(pParse, &t
1f900 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  empX, &regFree1)
1f910 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
1f920 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f930 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f940 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1f950 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e2);.        sql
1f960 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1f970 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
1f980 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
1f990 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f9a0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1f9b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1f9c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f9d0 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
1f9e0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
1f9f0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1fa00 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42   TK_BITNOT==OP_B
1fa10 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63  itNot );   testc
1fa20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e  ase( op==TK_BITN
1fa30 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OT );.      asse
1fa40 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e  rt( TK_NOT==OP_N
1fa50 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20 74 65  ot );         te
1fa60 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1fa70 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1fa80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fa90 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1faa0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1fab0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
1fac0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1fad0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1fae0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1faf0 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b   op, r1, inReg);
1fb00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fb10 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1fb20 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69  TRUTH: {.      i
1fb30 6e 74 20 69 73 54 72 75 65 3b 20 20 20 20 2f 2a  nt isTrue;    /*
1fb40 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e   IS TRUE or IS N
1fb50 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20  OT TRUE */.     
1fb60 20 69 6e 74 20 62 4e 6f 72 6d 61 6c 3b 20 20 20   int bNormal;   
1fb70 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
1fb80 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20   FALSE */.      
1fb90 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1fba0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1fbb0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1fbc0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1fbd0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1fbe0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1fbf0 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33  isTrue = sqlite3
1fc00 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70  ExprTruthValue(p
1fc10 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
1fc20 20 20 20 20 20 62 4e 6f 72 6d 61 6c 20 3d 20 70       bNormal = p
1fc30 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53  Expr->op2==TK_IS
1fc40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fc50 28 20 69 73 54 72 75 65 20 26 26 20 62 4e 6f 72  ( isTrue && bNor
1fc60 6d 61 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  mal);.      test
1fc70 63 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26  case( !isTrue &&
1fc80 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20   bNormal);.     
1fc90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fca0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 73 54 72  p4Int(v, OP_IsTr
1fcb0 75 65 2c 20 72 31 2c 20 69 6e 52 65 67 2c 20 21  ue, r1, inReg, !
1fcc0 69 73 54 72 75 65 2c 20 69 73 54 72 75 65 20 5e  isTrue, isTrue ^
1fcd0 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20   bNormal);.     
1fce0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1fcf0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
1fd00 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
1fd10 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  TNULL: {.      i
1fd20 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
1fd30 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
1fd40 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20  ==OP_IsNull );  
1fd50 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1fd60 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
1fd70 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
1fd80 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
1fd90 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70   ); testcase( op
1fda0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
1fdb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1fdc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1fdd0 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
1fde0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1fdf0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1fe00 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1fe10 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1fe20 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
1fe30 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1fe40 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
1fe50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fe60 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20  1(v, op, r1);.  
1fe70 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1fe80 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
1fe90 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
1fea0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1feb0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
1fec0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1fed0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1fee0 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29  eger, 0, target)
1fef0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ff00 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
1ff10 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ddr);.      brea
1ff20 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1ff30 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
1ff40 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
1ff50 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70  fo *pInfo = pExp
1ff60 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
1ff70 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20     if( pInfo==0 
1ff80 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1ff90 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1ffa0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1ffb0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1ffc0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ffd0 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75  sg(pParse, "misu
1ffe0 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a  se of aggregate:
1fff0 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75   %s()", pExpr->u
20000 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
20010 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
20020 65 74 75 72 6e 20 70 49 6e 66 6f 2d 3e 61 46 75  eturn pInfo->aFu
20030 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e  nc[pExpr->iAgg].
20040 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iMem;.      }.  
20050 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20060 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
20070 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
20080 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20  xprList *pFarg; 
20090 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
200a0 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
200b0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nts */.      int
200c0 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20 20   nFarg;         
200d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
200e0 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
200f0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e  nts */.      Fun
20100 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20  cDef *pDef;     
20110 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
20120 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ion definition o
20130 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 63  bject */.      c
20140 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20  onst char *zId; 
20150 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
20160 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
20170 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d 61 73      u32 constMas
20180 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61  k = 0;     /* Ma
20190 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  sk of function a
201a0 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72  rguments that ar
201b0 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20  e constant */.  
201c0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
201d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
201e0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
201f0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
20200 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
20210 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
20220 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  onnection */.   
20230 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
20240 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  db);      /* The
20250 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75   text encoding u
20260 73 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61  sed by this data
20270 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f  base */.      Co
20280 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
20290 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74  ;    /* A collat
202a0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ing sequence */.
202b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
202c0 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
202d0 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
202e0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
202f0 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a   EP_WinFunc) ){.
20300 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
20310 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e 72 65  Expr->y.pWin->re
20320 67 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 7d  gResult;.      }
20330 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
20340 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  f( ConstFactorOk
20350 28 70 50 61 72 73 65 29 20 26 26 20 73 71 6c 69  (pParse) && sqli
20360 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
20370 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20  tNotJoin(pExpr) 
20380 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ){.        /* SQ
20390 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20  L functions can 
203a0 62 65 20 65 78 70 65 6e 73 69 76 65 2e 20 53 6f  be expensive. So
203b0 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 63 6f 6e   try to move con
203c0 73 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e 73 0a  stant functions.
203d0 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 20 6f          ** out o
203e0 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
203f0 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
20400 65 61 6e 73 20 61 6e 20 65 78 74 72 61 20 4f 50  eans an extra OP
20410 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20 20 20  _Copy. */.      
20420 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
20430 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
20440 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31  Parse, pExpr, -1
20450 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20460 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
20470 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
20480 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
20490 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
204a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
204b0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  r, EP_TokenOnly)
204c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72   ){.        pFar
204d0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
204e0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72  se{.        pFar
204f0 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  g = pExpr->x.pLi
20500 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
20510 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20    nFarg = pFarg 
20520 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a  ? pFarg->nExpr :
20530 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
20540 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
20550 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
20560 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
20570 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  zId = pExpr->u.z
20580 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44 65  Token;.      pDe
20590 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
205a0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c  unction(db, zId,
205b0 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b   nFarg, enc, 0);
205c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
205d0 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51  NABLE_UNKNOWN_SQ
205e0 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20  L_FUNCTION.     
205f0 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26 26 20   if( pDef==0 && 
20600 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
20610 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
20620 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
20630 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f  ction(db, "unkno
20640 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c  wn", nFarg, enc,
20650 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
20660 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44  dif.      if( pD
20670 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78  ef==0 || pDef->x
20680 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20  Finalize!=0 ){. 
20690 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
206a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
206b0 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e  unknown function
206c0 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20  : %s()", zId);. 
206d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
206e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
206f0 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63 74  Attempt a direct
20700 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
20710 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  of the built-in 
20720 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20  COALESCE() and. 
20730 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29       ** IFNULL()
20740 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69   functions.  Thi
20750 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73  s avoids unneces
20760 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20  sary evaluation 
20770 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75  of.      ** argu
20780 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66  ments past the f
20790 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72  irst non-NULL ar
207a0 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
207b0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
207c0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
207d0 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43  ITE_FUNC_COALESC
207e0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E ){.        int
207f0 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73   endCoalesce = s
20800 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
20810 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
20820 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
20830 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20  rg>=2 );.       
20840 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20850 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
20860 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
20870 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  et);.        for
20880 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=1; i<nFarg; i
20890 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
208a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
208b0 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
208c0 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65  target, endCoale
208d0 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sce);.          
208e0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
208f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20900 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
20910 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  e, pFarg->a[i].p
20920 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
20930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20940 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
20950 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43  lveLabel(v, endC
20960 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
20970 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
20980 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55  ..      /* The U
20990 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69  NLIKELY() functi
209a0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
209b0 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  The result is th
209c0 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
209d0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72   of the first ar
209e0 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
209f0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
20a00 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
20a10 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
20a20 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  Y ){.        ass
20a30 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b  ert( nFarg>=1 );
20a40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20a50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
20a60 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 46  arget(pParse, pF
20a70 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
20a80 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
20a90 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
20aa0 5f 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a 20  _DEBUG.      /* 
20ab0 54 68 65 20 41 46 46 49 4e 49 54 59 28 29 20 66  The AFFINITY() f
20ac0 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61 74 65  unction evaluate
20ad0 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68  s to a string th
20ae0 61 74 20 64 65 73 63 72 69 62 65 73 0a 20 20 20  at describes.   
20af0 20 20 20 2a 2a 20 74 68 65 20 74 79 70 65 20 61     ** the type a
20b00 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 61  ffinity of the a
20b10 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 69  rgument.  This i
20b20 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
20b30 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ng of.      ** t
20b40 68 65 20 53 51 4c 69 74 65 20 74 79 70 65 20 6c  he SQLite type l
20b50 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ogic..      */. 
20b60 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
20b70 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
20b80 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59 20  E_FUNC_AFFINITY 
20b90 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
20ba0 20 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d   char *azAff[] =
20bb0 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65 78 74   { "blob", "text
20bc0 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20 22 69  ", "numeric", "i
20bd0 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22 20  nteger", "real" 
20be0 7d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  };.        char 
20bf0 61 66 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73  aff;.        ass
20c00 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
20c10 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20 73  .        aff = s
20c20 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
20c30 74 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  ty(pFarg->a[0].p
20c40 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
20c50 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
20c60 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20  ring(v, target, 
20c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
20c90 66 66 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53  ff ? azAff[aff-S
20ca0 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20  QLITE_AFF_BLOB] 
20cb0 3a 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20  : "none");.     
20cc0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
20cd0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
20ce0 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
20cf0 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
20d00 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32          if( i<32
20d10 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
20d20 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d  sConstant(pFarg-
20d30 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
20d40 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
20d50 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20  se( i==31 );.   
20d60 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
20d70 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29   |= MASKBIT32(i)
20d80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20d90 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
20da0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
20db0 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29  E_FUNC_NEEDCOLL)
20dc0 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b  !=0 && !pColl ){
20dd0 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
20de0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
20df0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46  llSeq(pParse, pF
20e00 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
20e10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20e20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46    }.      if( pF
20e30 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arg ){.        i
20e40 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a  f( constMask ){.
20e50 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 70            r1 = p
20e60 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
20e70 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
20e80 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a  >nMem += nFarg;.
20e90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20ea0 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71           r1 = sq
20eb0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
20ec0 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29  e(pParse, nFarg)
20ed0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
20ee0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67       /* For leng
20ef0 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28  th() and typeof(
20f00 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68  ) functions with
20f10 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65   a column argume
20f20 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  nt,.        ** s
20f30 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d 65  et the P5 parame
20f40 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f  ter to the OP_Co
20f50 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f  lumn opcode to O
20f60 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a  PFLAG_LENGTHARG.
20f70 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50          ** or OP
20f80 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72  FLAG_TYPEOFARG r
20f90 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20  espectively, to 
20fa0 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72  avoid unnecessar
20fb0 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a  y data.        *
20fc0 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20  * loading..     
20fd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
20fe0 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
20ff0 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e  gs & (SQLITE_FUN
21000 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f  C_LENGTH|SQLITE_
21010 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30  FUNC_TYPEOF))!=0
21020 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
21030 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20   exprOp;.       
21040 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
21050 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==1 );.         
21060 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e   assert( pFarg->
21070 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
21080 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72 4f  .          exprO
21090 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  p = pFarg->a[0].
210a0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20  pExpr->op;.     
210b0 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d       if( exprOp=
210c0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78  =TK_COLUMN || ex
210d0 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  prOp==TK_AGG_COL
210e0 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
210f0 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
21100 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f  E_FUNC_LENGTH==O
21110 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20  PFLAG_LENGTHARG 
21120 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
21130 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
21140 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41  NC_TYPEOF==OPFLA
21150 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20  G_TYPEOFARG );. 
21160 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
21170 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46  ase( pDef->funcF
21180 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45  lags & OPFLAG_LE
21190 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20  NGTHARG );.     
211a0 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b         pFarg->a[
211b0 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20  0].pExpr->op2 = 
211c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
211d0 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61     pDef->funcFla
211e0 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e  gs & (OPFLAG_LEN
211f0 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59  GTHARG|OPFLAG_TY
21200 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
21210 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
21220 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21230 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
21240 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20  (pParse, pFarg, 
21250 72 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  r1, 0,.         
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21270 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
21280 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43  EL_DUP|SQLITE_EC
21290 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20  EL_FACTOR);.    
212a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
212b0 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   r1 = 0;.      }
212c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
212d0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
212e0 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69  E.      /* Possi
212f0 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65  bly overload the
21300 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65   function if the
21310 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
21320 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69  is.      ** a vi
21330 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75  rtual table colu
21340 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  mn..      **.   
21350 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20     ** For infix 
21360 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c  functions (LIKE,
21370 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61   GLOB, REGEXP, a
21380 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68  nd MATCH) use th
21390 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e  e.      ** secon
213a0 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20  d argument, not 
213b0 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68  the first, as th
213c0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65  e argument to te
213d0 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  st to.      ** s
213e0 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f  ee if it is a co
213f0 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61  lumn in a virtua
21400 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69  l table.  This i
21410 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20  s done because. 
21420 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74       ** the left
21430 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69   operand of infi
21440 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65  x functions (the
21450 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74   operand we want
21460 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   to.      ** con
21470 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67  trol overloading
21480 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65  ) ends up as the
21490 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
214a0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
214b0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
214c0 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c  expression "A gl
214d0 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c  ob B" is equival
214e0 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ent to .      **
214f0 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65   "glob(B,A).  We
21500 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65   want to use the
21510 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22   A in "A glob B"
21520 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a   to test.      *
21530 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f  * for function o
21540 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74  verloading.  But
21550 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65   we use the B te
21560 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29  rm in "glob(B,A)
21570 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
21580 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26    if( nFarg>=2 &
21590 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
215a0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 66 69  y(pExpr, EP_Infi
215b0 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
215c0 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
215d0 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
215e0 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
215f0 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31  Farg, pFarg->a[1
21600 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
21610 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e  }else if( nFarg>
21620 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
21630 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
21640 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
21650 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
21660 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
21670 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  pr);.      }.#en
21680 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44  dif.      if( pD
21690 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
216a0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
216b0 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  COLL ){.        
216c0 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
216d0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
216e0 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c  ll; .        sql
216f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
21700 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
21710 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
21720 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
21730 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  );.      }.#ifde
21740 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
21750 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a  OFFSET_SQL_FUNC.
21760 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
21770 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
21780 54 45 5f 46 55 4e 43 5f 4f 46 46 53 45 54 20 29  TE_FUNC_OFFSET )
21790 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
217a0 70 41 72 67 20 3d 20 70 46 61 72 67 2d 3e 61 5b  pArg = pFarg->a[
217b0 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
217c0 20 20 69 66 28 20 70 41 72 67 2d 3e 6f 70 3d 3d    if( pArg->op==
217d0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
217e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
217f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
21800 66 66 73 65 74 2c 20 70 41 72 67 2d 3e 69 54 61  ffset, pArg->iTa
21810 62 6c 65 2c 20 70 41 72 67 2d 3e 69 43 6f 6c 75  ble, pArg->iColu
21820 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
21830 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21840 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21850 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
21860 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
21870 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21880 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
21890 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c     {.        sql
218a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
218b0 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54  , pParse->iSelfT
218c0 61 62 20 3f 20 4f 50 5f 50 75 72 65 46 75 6e 63  ab ? OP_PureFunc
218d0 30 20 3a 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30  0 : OP_Function0
218e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
218f0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
21900 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65  tMask, r1, targe
21910 74 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20  t, (char*)pDef, 
21920 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
21930 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21940 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
21950 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  nFarg);.      }.
21960 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 20        if( nFarg 
21970 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20  && constMask==0 
21980 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21990 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
219a0 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e  ge(pParse, r1, n
219b0 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Farg);.      }. 
219c0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
219d0 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  et;.    }.#ifnde
219e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
219f0 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
21a00 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
21a10 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
21a20 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  .      int nCol;
21a30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21a40 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29   op==TK_EXISTS )
21a50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21a60 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
21a70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d  );.      if( op=
21a80 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 28 6e  =TK_SELECT && (n
21a90 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  Col = pExpr->x.p
21aa0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
21ab0 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a 20 20 20  nExpr)!=1 ){.   
21ac0 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73       sqlite3Subs
21ad0 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
21ae0 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20  e, nCol, 1);.   
21af0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21b00 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
21b10 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
21b20 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
21b30 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
21b40 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
21b50 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  e TK_SELECT_COLU
21b60 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  MN: {.      int 
21b70 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  n;.      if( pEx
21b80 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c  pr->pLeft->iTabl
21b90 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
21ba0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54  pExpr->pLeft->iT
21bb0 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 43 6f  able = sqlite3Co
21bc0 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
21bd0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
21be0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21bf0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
21c00 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78  iTable==0 || pEx
21c10 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
21c20 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
21c30 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
21c40 62 6c 65 0a 20 20 20 20 20 20 20 26 26 20 70 45  ble.       && pE
21c50 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20  xpr->iTable!=(n 
21c60 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
21c70 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70  torSize(pExpr->p
21c80 4c 65 66 74 29 29 20 0a 20 20 20 20 20 20 29 7b  Left)) .      ){
21c90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21ca0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
21cb0 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73   "%d columns ass
21cc0 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22  igned %d values"
21cd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cf0 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c    pExpr->iTable,
21d00 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   n);.      }.   
21d10 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
21d20 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b  >pLeft->iTable +
21d30 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
21d40 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
21d50 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
21d60 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
21d70 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
21d80 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
21d90 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
21da0 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
21db0 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
21dc0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
21dd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21de0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
21df0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
21e00 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
21e10 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
21e20 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
21e30 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
21e40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21e50 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
21e60 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
21e70 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
21e80 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
21e90 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alse);.      sql
21ea0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21eb0 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
21ec0 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  get, 0);.      s
21ed0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
21ee0 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
21ef0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74  Null);.      ret
21f00 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
21f10 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
21f20 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
21f30 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20   */...    /*.   
21f40 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e   **    x BETWEEN
21f50 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a   y AND z.    **.
21f60 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65      ** This is e
21f70 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20  quivalent to.   
21f80 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e   **.    **    x>
21f90 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20  =y AND x<=z.    
21fa0 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73  **.    ** X is s
21fb0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
21fc0 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
21fd0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
21fe0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
21ff0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20  pExpr..    ** Z 
22000 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
22010 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
22020 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  pExpr..    */.  
22030 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
22040 4e 3a 20 7b 0a 20 20 20 20 20 20 65 78 70 72 43  N: {.      exprC
22050 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
22060 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
22070 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  , 0, 0);.      r
22080 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
22090 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
220a0 53 50 41 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  SPAN:.    case T
220b0 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20  K_COLLATE: .    
220c0 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
220d0 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
220e0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
220f0 20 20 20 67 6f 74 6f 20 65 78 70 72 5f 63 6f 64     goto expr_cod
22100 65 5f 64 6f 6f 76 65 72 3b 20 2f 2a 20 32 30 31  e_doover; /* 201
22110 38 2d 30 34 2d 32 38 3a 20 50 72 65 76 65 6e 74  8-04-28: Prevent
22120 20 64 65 65 70 20 72 65 63 75 72 73 69 6f 6e 2e   deep recursion.
22130 20 4f 53 53 46 75 7a 7a 2e 20 2a 2f 0a 20 20 20   OSSFuzz. */.   
22140 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
22150 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20  TRIGGER: {.     
22160 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
22170 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c  e is TK_TRIGGER,
22180 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
22190 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65  sion is a refere
221a0 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  nce.      ** to 
221b0 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
221c0 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70  new.* or old.* p
221d0 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61  seudo-tables ava
221e0 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ilable to.      
221f0 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ** trigger progr
22200 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ams. In this cas
22210 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73  e Expr.iTable is
22220 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68   set to 1 for th
22230 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a  e.      ** new.*
22240 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f   pseudo-table, o
22250 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  r 0 for the old.
22260 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
22270 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20  Expr.iColumn.   
22280 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
22290 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
222a0 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74  e pseudo-table t
222b0 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31  o read, or to -1
222c0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
222d0 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  d the rowid fiel
222e0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
222f0 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73    ** The express
22300 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
22310 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50  ed using an OP_P
22320 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65  aram opcode. The
22330 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72   p1.      ** par
22340 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f  ameter is set to
22350 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f   0 for an old.ro
22360 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f  wid reference, o
22370 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20  r to (i+1).     
22380 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65   ** to reference
22390 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20   another column 
223a0 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  of the old.* pse
223b0 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65  udo-table, where
223c0 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20   .      ** i is 
223d0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
223e0 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e   column. For a n
223f0 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ew.rowid referen
22400 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20  ce, p1 is.      
22410 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c  ** set to (n+1),
22420 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20   where n is the 
22430 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
22440 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f  s in each pseudo
22450 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  -table..      **
22460 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65   For a reference
22470 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   to any other co
22480 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
22490 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
224a0 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  p1.      ** is s
224b0 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77  et to (n+2+i), w
224c0 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65  here n and i are
224d0 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76   as defined prev
224e0 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20  iously. For.    
224f0 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66    ** example, if
22500 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68   the table on wh
22510 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65  ich triggers are
22520 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a   being fired is.
22530 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65        ** declare
22540 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
22550 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
22560 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
22570 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
22580 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e  ** Then p1 is in
22590 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
225a0 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
225b0 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20       **   p1==0 
225c0 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69    ->    old.rowi
225d0 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e  d     p1==3   ->
225e0 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20      new.rowid.  
225f0 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20      **   p1==1  
22600 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20   ->    old.a    
22610 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20       p1==4   -> 
22620 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a     new.a.      *
22630 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20  *   p1==2   ->  
22640 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20    old.b         
22650 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65  p1==5   ->    ne
22660 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20  w.b       .     
22670 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
22680 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 79  *pTab = pExpr->y
22690 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74  .pTab;.      int
226a0 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61   p1 = pExpr->iTa
226b0 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f  ble * (pTab->nCo
226c0 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72  l+1) + 1 + pExpr
226d0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20  ->iColumn;..    
226e0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
226f0 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45  >iTable==0 || pE
22700 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29  xpr->iTable==1 )
22710 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22720 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
22730 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  -1 && pExpr->iCo
22740 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  lumn<pTab->nCol 
22750 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
22760 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c   pTab->iPKey<0 |
22770 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  | pExpr->iColumn
22780 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b  !=pTab->iPKey );
22790 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
227a0 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62  1>=0 && p1<(pTab
227b0 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a  ->nCol*2+2) );..
227c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
227d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61  eAddOp2(v, OP_Pa
227e0 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29  ram, p1, target)
227f0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
22800 65 6e 74 28 28 76 2c 20 22 72 5b 25 64 5d 3d 25  ent((v, "r[%d]=%
22810 73 2e 25 73 22 2c 20 74 61 72 67 65 74 2c 0a 20  s.%s", target,. 
22820 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
22830 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20  Table ? "new" : 
22840 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20  "old"),.        
22850 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  (pExpr->iColumn<
22860 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45  0 ? "rowid" : pE
22870 78 70 72 2d 3e 79 2e 70 54 61 62 2d 3e 61 43 6f  xpr->y.pTab->aCo
22880 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
22890 5d 2e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 29  ].zName).      )
228a0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
228b0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
228c0 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20  _POINT.      /* 
228d0 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  If the column ha
228e0 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c  s REAL affinity,
228f0 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c   it may currentl
22900 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
22910 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67  n.      ** integ
22920 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41  er. Use OP_RealA
22930 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20  ffinity to make 
22940 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c  sure it is reall
22950 79 20 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a  y real..      **
22960 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
22970 43 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35  CE-OF: R-60985-5
22980 37 36 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c  7662 SQLite will
22990 20 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c   convert the val
229a0 75 65 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20  ue back to.     
229b0 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69   ** floating poi
229c0 6e 74 20 77 68 65 6e 20 65 78 74 72 61 63 74 69  nt when extracti
229d0 6e 67 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72  ng it from the r
229e0 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20  ecord.  */.     
229f0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
22a00 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26  umn>=0 .       &
22a10 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  & pTab->aCol[pEx
22a20 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  pr->iColumn].aff
22a30 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
22a40 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a  F_REAL.      ){.
22a50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22a60 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
22a70 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61  RealAffinity, ta
22a80 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  rget);.      }.#
22a90 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
22aa0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
22ab0 73 65 20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a  se TK_VECTOR: {.
22ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
22ad0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
22ae0 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
22af0 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
22b00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
22b10 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a   TK_IF_NULL_ROW:
22b20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
22b30 72 49 4e 52 3b 0a 20 20 20 20 20 20 61 64 64 72  rINR;.      addr
22b40 49 4e 52 20 3d 20 73 71 6c 69 74 65 33 56 64 62  INR = sqlite3Vdb
22b50 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
22b60 4e 75 6c 6c 52 6f 77 2c 20 70 45 78 70 72 2d 3e  NullRow, pExpr->
22b70 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69  iTable);.      i
22b80 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
22b90 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
22ba0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
22bb0 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
22bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
22bd0 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 4e 52  pHere(v, addrINR
22be0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22bf0 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
22c00 61 64 64 72 49 4e 52 2c 20 69 6e 52 65 67 29 3b  addrINR, inReg);
22c10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22c20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
22c30 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a  ** Form A:.    *
22c40 2a 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20  *   CASE x WHEN 
22c50 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
22c60 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
22c70 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
22c80 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
22c90 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a  .    ** Form B:.
22ca0 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48      **   CASE WH
22cb0 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48  EN e1 THEN r1 WH
22cc0 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e  EN e2 THEN r2 ..
22cd0 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72  . WHEN eN THEN r
22ce0 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
22cf0 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   **.    ** Form 
22d00 41 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e  A is can be tran
22d10 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65  sformed into the
22d20 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d   equivalent form
22d30 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20   B as follows:. 
22d40 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
22d50 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57  N x=e1 THEN r1 W
22d60 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32  HEN x=e2 THEN r2
22d70 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20   ....    **     
22d80 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45     WHEN x=eN THE
22d90 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
22da0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
22db0 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
22dc0 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  s in pExpr->pLef
22dd0 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69  t..    ** Y is i
22de0 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65  n the last eleme
22df0 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70  nt of pExpr->x.p
22e00 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78  List if pExpr->x
22e10 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73  .pList->nExpr is
22e20 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68  .    ** odd.  Th
22e30 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69  e Y is also opti
22e40 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75  onal.  If the nu
22e50 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
22e60 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20   in x.pList.    
22e70 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e  ** is even, then
22e80 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e   Y is omitted an
22e90 64 20 74 68 65 20 22 6f 74 68 65 72 77 69 73 65  d the "otherwise
22ea0 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  " result is NULL
22eb0 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69  ..    ** Ei is i
22ec0 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
22ed0 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73  a[i*2] and Ri is
22ee0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
22ef0 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a  [i*2+1]..    **.
22f00 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c      ** The resul
22f10 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  t of the express
22f20 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f  ion is the Ri fo
22f30 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  r the first matc
22f40 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20  hing Ei,.    ** 
22f50 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  or if there is n
22f60 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74  o matching Ei, t
22f70 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20  he ELSE term Y, 
22f80 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20  or if there is. 
22f90 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65     ** no ELSE te
22fa0 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f  rm, NULL..    */
22fb0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
22fc0 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53  sert( op==TK_CAS
22fd0 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74  E ); {.      int
22fe0 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20   endLabel;      
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23000 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
23010 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d   end of CASE stm
23020 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
23030 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20  extCase;        
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23050 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e  GOTO label for n
23060 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20  ext WHEN clause 
23070 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  */.      int nEx
23080 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
23090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78             /* 2x
230a0 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20   number of WHEN 
230b0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69  terms */.      i
230c0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
230d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230e0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
230f0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
23100 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
23110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
23120 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ist of WHEN term
23130 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  s */.      struc
23140 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
23150 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20  *aListelem;  /* 
23160 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65  Array of WHEN te
23170 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  rms */.      Exp
23180 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20  r opCompare;    
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
231a0 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72  * The X==Ei expr
231b0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
231c0 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231e0 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65    /* The X expre
231f0 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
23200 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20  xpr *pTest = 0; 
23210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23220 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20   /* X==Ei (form 
23230 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66  A) or just Ei (f
23240 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20  orm B) */.      
23250 45 78 70 72 20 2a 70 44 65 6c 20 3d 20 30 3b 0a  Expr *pDel = 0;.
23260 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
23270 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
23280 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
23290 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
232a0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
232b0 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78  ect) && pExpr->x
232c0 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  .pList );.      
232d0 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e  assert(pExpr->x.
232e0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30  pList->nExpr > 0
232f0 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20  );.      pEList 
23300 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
23310 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65  ;.      aListele
23320 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  m = pEList->a;. 
23330 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c       nExpr = pEL
23340 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
23350 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c    endLabel = sql
23360 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
23370 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
23380 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72   if( (pX = pExpr
23390 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20  ->pLeft)!=0 ){. 
233a0 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 73 71         pDel = sq
233b0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
233c0 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   pX, 0);.       
233d0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
233e0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
233f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
23400 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
23410 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
23420 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23430 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
23440 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
23450 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 54 6f  ;.        exprTo
23460 52 65 67 69 73 74 65 72 28 70 44 65 6c 2c 20 65  Register(pDel, e
23470 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
23480 61 72 73 65 2c 20 70 44 65 6c 2c 20 26 72 65 67  arse, pDel, &reg
23490 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20  Free1));.       
234a0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
234b0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
234c0 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d 70    memset(&opComp
234d0 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f  are, 0, sizeof(o
234e0 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20 20  pCompare));.    
234f0 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70      opCompare.op
23500 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   = TK_EQ;.      
23510 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66    opCompare.pLef
23520 74 20 3d 20 70 44 65 6c 3b 0a 20 20 20 20 20 20  t = pDel;.      
23530 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d    pTest = &opCom
23540 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a  pare;.        /*
23550 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66   Ticket b351d95f
23560 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65  9cd5ef17e9d9dbae
23570 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31  18f5ca8611190001
23580 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  :.        ** The
23590 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65   value in regFre
235a0 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f  e1 might get SCo
235b0 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66  py-ed into the f
235c0 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20  ile result..    
235d0 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73      ** So make s
235e0 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67  ure that the reg
235f0 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69  Free1 register i
23600 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72  s not reused for
23610 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a   other.        *
23620 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70  * purposes and p
23630 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74  ossibly overwrit
23640 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ten.  */.       
23650 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
23660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
23670 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b  (i=0; i<nExpr-1;
23680 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20   i=i+2){.       
23690 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20   if( pX ){.     
236a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
236b0 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st!=0 );.       
236c0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69     opCompare.pRi
236d0 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  ght = aListelem[
236e0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
236f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23700 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74     pTest = aList
23710 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
23720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23730 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69   nextCase = sqli
23740 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
23750 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
23760 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73    testcase( pTes
23770 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
23780 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
23790 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
237a0 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65  Parse, pTest, ne
237b0 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a  xtCase, SQLITE_J
237c0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
237d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
237e0 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
237f0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
23800 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
23810 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
23820 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
23830 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  +1].pExpr, targe
23840 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
23850 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65  te3VdbeGoto(v, e
23860 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
23870 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
23880 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78  olveLabel(v, nex
23890 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  tCase);.      }.
238a0 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70 72        if( (nExpr
238b0 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
238c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
238d0 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  e(pParse, pEList
238e0 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78  ->a[nExpr-1].pEx
238f0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
23900 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23910 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23920 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
23930 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
23940 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
23950 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
23960 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  pDel);.      sql
23970 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
23980 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c  abel(v, endLabel
23990 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
239a0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
239b0 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
239c0 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
239d0 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ISE: {.      ass
239e0 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69  ert( pExpr->affi
239f0 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  nity==OE_Rollbac
23a00 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  k .           ||
23a10 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
23a20 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20  ==OE_Abort.     
23a30 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
23a40 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69  affinity==OE_Fai
23a50 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  l.           || 
23a60 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
23a70 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20  =OE_Ignore.     
23a80 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
23a90 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54  Parse->pTriggerT
23aa0 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ab ){.        sq
23ab0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
23ac0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
23ae0 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
23af0 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
23b00 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
23b10 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
23b20 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
23b30 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
23b40 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
23b50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23b60 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
23b70 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
23b80 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
23b90 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
23ba0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
23bb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
23bc0 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
23bd0 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
23be0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23bf0 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20  dOp4(.          
23c00 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51    v, OP_Halt, SQ
23c10 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f  LITE_OK, OE_Igno
23c20 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  re, 0, pExpr->u.
23c30 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20  zToken,0);.     
23c40 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
23c50 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
23c60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23c70 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
23c80 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f  Parse, SQLITE_CO
23c90 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
23ca0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cc0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c  pExpr->affinity,
23cd0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
23ce0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
23cf0 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
23d00 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
23d10 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
23d20 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
23d30 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
23d40 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
23d50 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
23d60 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ee2);.  return i
23d70 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  nReg;.}../*.** F
23d80 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f  actor out the co
23d90 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  de of the given 
23da0 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e  expression to in
23db0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d  itialization tim
23dc0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44  e..**.** If regD
23dd0 65 73 74 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  est>=0 then the 
23de0 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73  result is always
23df0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 61 74 20   stored in that 
23e00 72 65 67 69 73 74 65 72 20 61 6e 64 20 74 68 65  register and the
23e10 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  .** result is no
23e20 74 20 72 65 75 73 61 62 6c 65 2e 20 20 49 66 20  t reusable.  If 
23e30 72 65 67 44 65 73 74 3c 30 20 74 68 65 6e 20 74  regDest<0 then t
23e40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66  his routine is f
23e50 72 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65  ree to .** store
23e60 20 74 68 65 20 76 61 6c 75 65 20 77 68 65 72 65   the value where
23e70 65 76 65 72 20 69 74 20 77 61 6e 74 73 2e 20 20  ever it wants.  
23e80 54 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  The register whe
23e90 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
23ea0 6e 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  n .** is stored 
23eb0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 57 68  is returned.  Wh
23ec0 65 6e 20 72 65 67 44 65 73 74 3c 30 2c 20 74 77  en regDest<0, tw
23ed0 6f 20 69 64 65 6e 74 69 63 61 6c 20 65 78 70 72  o identical expr
23ee0 65 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20  essions will.** 
23ef0 63 6f 64 65 20 74 6f 20 74 68 65 20 73 61 6d 65  code to the same
23f00 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e   register..*/.in
23f10 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
23f20 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65  eAtInit(.  Parse
23f30 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
23f40 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
23f50 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
23f60 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ,      /* The ex
23f70 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65  pression to code
23f80 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69   when the VDBE i
23f90 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20  nitializes */.  
23fa0 69 6e 74 20 72 65 67 44 65 73 74 20 20 20 20 20  int regDest     
23fb0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76    /* Store the v
23fc0 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
23fd0 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78  ister */.){.  Ex
23fe0 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73  prList *p;.  ass
23ff0 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72  ert( ConstFactor
24000 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20  Ok(pParse) );.  
24010 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  p = pParse->pCon
24020 73 74 45 78 70 72 3b 0a 20 20 69 66 28 20 72 65  stExpr;.  if( re
24030 67 44 65 73 74 3c 30 20 26 26 20 70 20 29 7b 0a  gDest<0 && p ){.
24040 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
24050 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
24060 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
24070 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20  for(pItem=p->a, 
24080 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b  i=p->nExpr; i>0;
24090 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a   pItem++, i--){.
240a0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
240b0 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c  >reusable && sql
240c0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
240d0 30 2c 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70  0,pItem->pExpr,p
240e0 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20  Expr,-1)==0 ){. 
240f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49         return pI
24100 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
24110 72 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rReg;.      }.  
24120 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 20    }.  }.  pExpr 
24130 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
24140 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
24150 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71  pr, 0);.  p = sq
24160 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
24170 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70  end(pParse, p, p
24180 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29  Expr);.  if( p )
24190 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20 45 78  {.     struct Ex
241a0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
241b0 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45  em = &p->a[p->nE
241c0 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74  xpr-1];.     pIt
241d0 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72  em->reusable = r
241e0 65 67 44 65 73 74 3c 30 3b 0a 20 20 20 20 20 69  egDest<0;.     i
241f0 66 28 20 72 65 67 44 65 73 74 3c 30 20 29 20 72  f( regDest<0 ) r
24200 65 67 44 65 73 74 20 3d 20 2b 2b 70 50 61 72 73  egDest = ++pPars
24210 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49  e->nMem;.     pI
24220 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
24230 72 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a  rReg = regDest;.
24240 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43    }.  pParse->pC
24250 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 20 20  onstExpr = p;.  
24260 72 65 74 75 72 6e 20 72 65 67 44 65 73 74 3b 0a  return regDest;.
24270 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
24280 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
24290 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
242a0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
242b0 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61  esults.** into a
242c0 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75   register.  Retu
242d0 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
242e0 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65  number where the
242f0 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20   results.** are 
24300 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  stored..**.** If
24310 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
24320 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67   a temporary reg
24330 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62  ister that can b
24340 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a  e deallocated,.*
24350 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73  * then write its
24360 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52   number into *pR
24370 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  eg.  If the resu
24380 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  lt register is n
24390 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  ot.** a temporar
243a0 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  y, then set *pRe
243b0 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  g to zero..**.**
243c0 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63   If pExpr is a c
243d0 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
243e0 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
243f0 20 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a   generate this.*
24400 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74  * code to fill t
24410 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  he register in t
24420 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
24430 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  n section of the
24440 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
24450 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61  , in order to fa
24460 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74  ctor it out of t
24470 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f  he evaluation lo
24480 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
24490 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50  e3ExprCodeTemp(P
244a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
244b0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a  pr *pExpr, int *
244c0 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b  pReg){.  int r2;
244d0 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
244e0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
244f0 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  e(pExpr);.  if( 
24500 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
24510 61 72 73 65 29 0a 20 20 20 26 26 20 70 45 78 70  arse).   && pExp
24520 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
24530 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  ER.   && sqlite3
24540 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
24550 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29  tJoin(pExpr).  )
24560 7b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30  {.    *pReg  = 0
24570 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
24580 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
24590 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
245a0 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
245b0 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
245c0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
245d0 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73  rse);.    r2 = s
245e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
245f0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
24600 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28  pr, r1);.    if(
24610 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20   r2==r1 ){.     
24620 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20   *pReg = r1;.   
24630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
24640 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
24650 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
24660 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30  .      *pReg = 0
24670 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
24680 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn r2;.}../*.*
24690 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
246a0 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
246b0 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
246c0 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
246d0 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
246e0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
246f0 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
24700 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
24710 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
24720 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f  ister target..*/
24730 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
24740 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
24750 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
24760 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
24770 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61   int inReg;..  a
24780 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
24790 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
247a0 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
247b0 20 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d   pExpr && pExpr-
247c0 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
247d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
247e0 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
247f0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79  ->pVdbe, OP_Copy
24800 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
24810 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73   target);.  }els
24820 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73  e{.    inReg = s
24830 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
24840 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
24850 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
24860 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
24870 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61  >pVdbe!=0 || pPa
24880 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
24890 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
248a0 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26   inReg!=target &
248b0 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  & pParse->pVdbe 
248c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
248d0 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
248e0 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
248f0 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
24900 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
24910 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72  ./*.** Make a tr
24920 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20  ansient copy of 
24930 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
24940 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69   and then code i
24950 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  t using.** sqlit
24960 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54  e3ExprCode().  T
24970 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
24980 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69  s just like sqli
24990 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a  te3ExprCode().**
249a0 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
249b0 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f   input expressio
249c0 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  n is guaranteed 
249d0 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e  to be unchanged.
249e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
249f0 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72  ExprCodeCopy(Par
24a00 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
24a10 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
24a20 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  get){.  sqlite3 
24a30 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
24a40 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
24a50 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
24a60 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
24a70 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
24a80 64 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43  d ) sqlite3ExprC
24a90 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
24aa0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71  r, target);.  sq
24ab0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
24ac0 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  db, pExpr);.}../
24ad0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
24ae0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
24af0 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
24b00 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
24b10 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
24b20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
24b30 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
24b40 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
24b50 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
24b60 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
24b70 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
24b80 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
24b90 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
24ba0 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f  ne.** might choo
24bb0 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65  se to code the e
24bc0 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69  xpression at ini
24bd0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
24be0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24bf0 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61  3ExprCodeFactora
24c00 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
24c10 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
24c20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
24c30 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e  f( pParse->okCon
24c40 73 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69  stFactor && sqli
24c50 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
24c60 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20  tNotJoin(pExpr) 
24c70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
24c80 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
24c90 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
24ca0 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  et);.  }else{.  
24cb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
24cc0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
24cd0 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a   target);.  }.}.
24ce0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
24cf0 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
24d00 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
24d10 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74  pression and put
24d20 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
24d30 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
24d40 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d  et..**.** Also m
24d50 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
24d60 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73  e expression res
24d70 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65  ults into anothe
24d80 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74  r "cache" regist
24d90 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79  er.** and modify
24da0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24db0 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
24dc0 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c   time it is eval
24dd0 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65  uated,.** the re
24de0 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f  sult is a copy o
24df0 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69  f the cache regi
24e00 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ster..**.** This
24e10 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
24e20 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73   for expressions
24e30 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d   that are used m
24e40 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
24e50 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61  s.  They are eva
24e60 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20  luated once and 
24e70 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
24e80 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
24e90 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a   are reused..*/.
24ea0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
24eb0 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
24ec0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
24ed0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
24ee0 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
24ef0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
24f00 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20  .  int iMem;..  
24f10 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
24f20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
24f30 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
24f40 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65  STER );.  sqlite
24f50 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
24f60 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
24f70 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ;.  iMem = ++pPa
24f80 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
24f90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24fa0 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65  , OP_Copy, targe
24fb0 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72  t, iMem);.  expr
24fc0 54 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72  ToRegister(pExpr
24fd0 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iMem);.}../*.*
24fe0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
24ff0 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
25000 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
25010 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
25020 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
25030 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65  n list into a se
25040 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
25050 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ers beginning at
25060 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52   target..**.** R
25070 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
25080 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61   of elements eva
25090 6c 75 61 74 65 64 2e 20 20 54 68 65 20 6e 75 6d  luated.  The num
250a0 62 65 72 20 72 65 74 75 72 6e 65 64 20 77 69 6c  ber returned wil
250b0 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20 62 65 20  l.** usually be 
250c0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 62 75 74  pList->nExpr but
250d0 20 6d 69 67 68 74 20 62 65 20 72 65 64 75 63 65   might be reduce
250e0 64 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c  d if SQLITE_ECEL
250f0 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69 73 20 64  _OMITREF.** is d
25100 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  efined..**.** Th
25110 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  e SQLITE_ECEL_DU
25120 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20  P flag prevents 
25130 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72  the arguments fr
25140 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c  om being.** fill
25150 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70  ed using OP_SCop
25160 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74  y.  OP_Copy must
25170 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
25180 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
25190 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61  TE_ECEL_FACTOR a
251a0 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63  rgument allows c
251b0 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
251c0 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f  s to be.** facto
251d0 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69  red out into ini
251e0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65  tialization code
251f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
25200 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67  TE_ECEL_REF flag
25210 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70 72   means that expr
25220 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c  essions in the l
25230 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72  ist with.** Expr
25240 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72  List.a[].u.x.iOr
25250 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20  derByCol>0 have 
25260 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76 61  already been eva
25270 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65  luated and store
25280 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  d.** in register
25290 73 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64  s at srcReg, and
252a0 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61   so the value ca
252b0 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d  n be copied from
252c0 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66 20 53 51   there..** If SQ
252d0 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
252e0 46 20 69 73 20 61 6c 73 6f 20 73 65 74 2c 20 74  F is also set, t
252f0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 77  hen the values w
25300 69 74 68 20 75 2e 78 2e 69 4f 72 64 65 72 42 79  ith u.x.iOrderBy
25310 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20 73 69 6d  Col>0.** are sim
25320 70 6c 79 20 6f 6d 69 74 74 65 64 20 72 61 74 68  ply omitted rath
25330 65 72 20 74 68 61 6e 20 62 65 69 6e 67 20 63 6f  er than being co
25340 70 69 65 64 20 66 72 6f 6d 20 73 72 63 52 65 67  pied from srcReg
25350 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25360 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
25370 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
25380 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
25390 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
253a0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
253b0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
253c0 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
253d0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
253e0 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
253f0 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
25400 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
25410 73 72 63 52 65 67 2c 20 20 20 20 20 20 20 20 2f  srcReg,        /
25420 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73 74 65  * Source registe
25430 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45  rs if SQLITE_ECE
25440 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c  L_REF */.  u8 fl
25450 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
25460 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66   SQLITE_ECEL_* f
25470 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lags */.){.  str
25480 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
25490 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
254a0 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f  i, j, n;.  u8 co
254b0 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20  pyOp = (flags & 
254c0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
254d0 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f   ? OP_Copy : OP_
254e0 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a 76  SCopy;.  Vdbe *v
254f0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
25500 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
25510 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
25520 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
25530 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
25540 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20  pVdbe!=0 );  /* 
25550 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20  Never gets this 
25560 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f  far otherwise */
25570 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
25580 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73  xpr;.  if( !Cons
25590 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
255a0 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51  ) ) flags &= ~SQ
255b0 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
255c0 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
255d0 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
255e0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
255f0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
25600 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
25610 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
25620 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
25630 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
25640 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65  pItem->bSorterRe
25650 66 20 29 7b 0a 20 20 20 20 20 20 69 2d 2d 3b 0a  f ){.      i--;.
25660 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d        n--;.    }
25670 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
25680 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
25690 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30  ITE_ECEL_REF)!=0
256a0 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e   && (j = pItem->
256b0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29  u.x.iOrderByCol)
256c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
256d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
256e0 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20  CEL_OMITREF ){. 
256f0 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20         i--;.    
25700 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d      n--;.      }
25710 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
25720 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
25730 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63  v, copyOp, j+src
25740 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29  Reg-1, target+i)
25750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
25760 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
25770 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
25780 54 4f 52 29 21 3d 30 0a 20 20 20 20 20 20 20 20  TOR)!=0.        
25790 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
257a0 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
257b0 69 6e 28 70 45 78 70 72 29 0a 20 20 20 20 29 7b  in(pExpr).    ){
257c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
257d0 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
257e0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
257f0 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  et+i);.    }else
25800 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65  {.      int inRe
25810 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
25820 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
25830 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
25840 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  i);.      if( in
25850 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b  Reg!=target+i ){
25860 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
25870 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  *pOp;.        if
25880 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70  ( copyOp==OP_Cop
25890 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  y.         && (p
258a0 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65  Op=sqlite3VdbeGe
258b0 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63  tOp(v, -1))->opc
258c0 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  ode==OP_Copy.   
258d0 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31        && pOp->p1
258e0 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65  +pOp->p3+1==inRe
258f0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  g.         && pO
25900 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p2+pOp->p3+1=
25910 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20  =target+i.      
25920 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
25930 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20  Op->p3++;.      
25940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25960 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20  dOp2(v, copyOp, 
25970 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29  inReg, target+i)
25980 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25990 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
259a0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
259b0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
259c0 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f   for a BETWEEN o
259d0 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  perator..**.**  
259e0 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
259f0 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  D z.**.** The ab
25a00 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ove is equivalen
25a10 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78  t to .**.**    x
25a20 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a  >=y AND x<=z.**.
25a30 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
25a40 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
25a50 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
25a60 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
25a70 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66  * elimination of
25a80 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a   x..**.** The xJ
25a90 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72 20  umpIf parameter 
25aa0 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61 69  determines detai
25ab0 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c  ls:.**.**    NUL
25ac0 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L:              
25ad0 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 62       Store the b
25ae0 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69 6e  oolean result in
25af0 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20   reg[dest].**   
25b00 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
25b10 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74 6f  ue:      Jump to
25b20 20 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a 2a   dest if true.**
25b30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25b40 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70  fFalse:     Jump
25b50 20 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c 73   to dest if fals
25b60 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70  e.**.** The jump
25b70 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65 72  IfNull parameter
25b80 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 78   is ignored if x
25b90 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a  JumpIf is NULL..
25ba0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
25bb0 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a  xprCodeBetween(.
25bc0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25bd0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
25be0 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
25bf0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
25c00 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
25c10 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e    /* The BETWEEN
25c20 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
25c30 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
25c40 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69     /* Jump desti
25c50 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67  nation or storag
25c60 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  e location */.  
25c70 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50 61  void (*xJump)(Pa
25c80 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69  rse*,Expr*,int,i
25c90 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74  nt), /* Action t
25ca0 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20  o take */.  int 
25cb0 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
25cc0 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
25cd0 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
25ce0 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78   NULL */.){.  Ex
25cf0 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20  pr exprAnd;     
25d00 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61  /* The AND opera
25d10 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44  tor in  x>=y AND
25d20 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72   x<=z  */.  Expr
25d30 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a   compLeft;    /*
25d40 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d   The  x>=y  term
25d50 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52   */.  Expr compR
25d60 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20  ight;   /* The  
25d70 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x<=z  term */.  
25d80 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
25d90 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75  ; /* Temporary u
25da0 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  se register */. 
25db0 20 45 78 70 72 20 2a 70 44 65 6c 20 3d 20 30 3b   Expr *pDel = 0;
25dc0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
25dd0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
25de0 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66 74  memset(&compLeft
25df0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
25e00 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f  ));.  memset(&co
25e10 6d 70 52 69 67 68 74 2c 20 30 2c 20 73 69 7a 65  mpRight, 0, size
25e20 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d  of(Expr));.  mem
25e30 73 65 74 28 26 65 78 70 72 41 6e 64 2c 20 30 2c  set(&exprAnd, 0,
25e40 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
25e50 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
25e60 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
25e70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
25e80 20 29 3b 0a 20 20 70 44 65 6c 20 3d 20 73 71 6c   );.  pDel = sql
25e90 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
25ea0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29  pExpr->pLeft, 0)
25eb0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
25ec0 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
25ed0 20 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20     exprAnd.op = 
25ee0 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 65 78 70 72  TK_AND;.    expr
25ef0 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d  And.pLeft = &com
25f00 70 4c 65 66 74 3b 0a 20 20 20 20 65 78 70 72 41  pLeft;.    exprA
25f10 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d  nd.pRight = &com
25f20 70 52 69 67 68 74 3b 0a 20 20 20 20 63 6f 6d 70  pRight;.    comp
25f30 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b  Left.op = TK_GE;
25f40 0a 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c  .    compLeft.pL
25f50 65 66 74 20 3d 20 70 44 65 6c 3b 0a 20 20 20 20  eft = pDel;.    
25f60 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20  compLeft.pRight 
25f70 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
25f80 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
25f90 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
25fa0 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 63 6f 6d 70   TK_LE;.    comp
25fb0 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 70 44  Right.pLeft = pD
25fc0 65 6c 3b 0a 20 20 20 20 63 6f 6d 70 52 69 67 68  el;.    compRigh
25fd0 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
25fe0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
25ff0 70 45 78 70 72 3b 0a 20 20 20 20 65 78 70 72 54  pExpr;.    exprT
26000 6f 52 65 67 69 73 74 65 72 28 70 44 65 6c 2c 20  oRegister(pDel, 
26010 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70  exprCodeVector(p
26020 50 61 72 73 65 2c 20 70 44 65 6c 2c 20 26 72 65  Parse, pDel, &re
26030 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 69 66  gFree1));.    if
26040 28 20 78 4a 75 6d 70 20 29 7b 0a 20 20 20 20 20  ( xJump ){.     
26050 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c 20 26   xJump(pParse, &
26060 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
26070 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
26080 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
26090 4d 61 72 6b 20 74 68 65 20 65 78 70 72 65 73 73  Mark the express
260a0 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 66 72 6f  ion is being fro
260b0 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  m the ON or USIN
260c0 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
260d0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 74  in.      ** so t
260e0 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 45  hat the sqlite3E
260f0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 29 20  xprCodeTarget() 
26100 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74  routine will not
26110 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 6f 76 65   attempt to move
26120 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 6e 74  .      ** it int
26130 6f 20 74 68 65 20 50 61 72 73 65 2e 70 43 6f 6e  o the Parse.pCon
26140 73 74 45 78 70 72 20 6c 69 73 74 2e 20 20 57 65  stExpr list.  We
26150 20 73 68 6f 75 6c 64 20 75 73 65 20 61 20 6e 65   should use a ne
26160 77 20 62 69 74 20 66 6f 72 20 74 68 69 73 2c 0a  w bit for this,.
26170 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 63 6c 61        ** for cla
26180 72 69 74 79 2c 20 62 75 74 20 77 65 20 61 72 65  rity, but we are
26190 20 6f 75 74 20 6f 66 20 62 69 74 73 20 69 6e 20   out of bits in 
261a0 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73 20 66  the Expr.flags f
261b0 69 65 6c 64 20 73 6f 20 77 65 0a 20 20 20 20 20  ield so we.     
261c0 20 2a 2a 20 68 61 76 65 20 74 6f 20 72 65 75 73   ** have to reus
261d0 65 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  e the EP_FromJoi
261e0 6e 20 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20  n bit.  Bummer. 
261f0 2a 2f 0a 20 20 20 20 20 20 70 44 65 6c 2d 3e 66  */.      pDel->f
26200 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a  lags |= EP_FromJ
26210 6f 69 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oin;.      sqlit
26220 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
26230 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
26240 64 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 7d 0a  d, dest);.    }.
26250 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
26260 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
26270 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 7d  , regFree1);.  }
26280 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
26290 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
262a0 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65  .  /* Ensure ade
262b0 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72  quate test cover
262c0 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  age */.  testcas
262d0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
262e0 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
262f0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
26300 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
26310 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26320 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26330 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
26340 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
26350 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
26360 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
26370 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
26380 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
26390 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
263a0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
263b0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
263c0 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
263d0 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
263e0 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
263f0 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
26400 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26410 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
26420 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
26430 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
26440 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
26450 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
26460 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
26470 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
26480 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
26490 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
264a0 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
264b0 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
264c0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
264d0 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
264e0 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
264f0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
26500 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
26510 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
26520 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
26530 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
26540 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
26550 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
26560 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
26570 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
26580 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
26590 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
265a0 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
265b0 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
265c0 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
265d0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
265e0 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  alse..**.** If t
265f0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
26600 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
26610 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
26620 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a  r false), then.*
26630 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
26640 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c  if the jumpIfNul
26650 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45  l flag is SQLITE
26660 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a  _JUMPIFNULL..**.
26670 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
26680 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
26690 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
266a0 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
266b0 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
266c0 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
266d0 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
266e0 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
266f0 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
26700 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
26710 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
26720 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
26730 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
26740 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
26750 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
26760 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
26770 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
26780 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
26790 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
267a0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
267b0 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
267c0 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
267d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
267e0 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
267f0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
26800 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
26810 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
26820 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
26830 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
26840 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
26850 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
26860 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
26870 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
26880 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
26890 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
268a0 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
268b0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
268c0 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
268d0 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20      return;  /* 
268e0 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
268f0 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
26900 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ler */.  if( NEV
26910 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72  ER(pExpr==0) ) r
26920 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61  eturn;  /* No wa
26930 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
26940 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70  n */.  op = pExp
26950 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
26960 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
26970 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
26980 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
26990 45 78 70 72 20 2a 70 41 6c 74 20 3d 20 73 71 6c  Expr *pAlt = sql
269a0 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66 69  ite3ExprSimplifi
269b0 65 64 41 6e 64 4f 72 28 70 45 78 70 72 29 3b 0a  edAndOr(pExpr);.
269c0 20 20 20 20 20 20 69 66 28 20 70 41 6c 74 21 3d        if( pAlt!=
269d0 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  pExpr ){.       
269e0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
269f0 75 65 28 70 50 61 72 73 65 2c 20 70 41 6c 74 2c  ue(pParse, pAlt,
26a00 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
26a10 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  l);.      }else 
26a20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  if( op==TK_AND )
26a30 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 32  {.        int d2
26a40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
26a50 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
26a60 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
26a70 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
26a80 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
26a90 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
26aa0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
26ab0 65 66 74 2c 20 64 32 2c 0a 20 20 20 20 20 20 20  eft, d2,.       
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ad0 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53      jumpIfNull^S
26ae0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
26af0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
26b00 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
26b10 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
26b20 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
26b30 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
26b40 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
26b50 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
26b60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26b70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26b80 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26b90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
26ba0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
26bb0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
26bc0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
26bd0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
26be0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
26bf0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
26c00 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
26c10 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ull);.      }.  
26c20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26c30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
26c40 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
26c50 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
26c60 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
26c70 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
26c80 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26c90 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
26ca0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
26cb0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
26cc0 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20  se TK_TRUTH: {. 
26cd0 20 20 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20       int isNot; 
26ce0 20 20 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54       /* IS NOT T
26cf0 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41  RUE or IS NOT FA
26d00 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  LSE */.      int
26d10 20 69 73 54 72 75 65 3b 20 20 20 20 20 2f 2a 20   isTrue;     /* 
26d20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f  IS TRUE or IS NO
26d30 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20  T TRUE */.      
26d40 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
26d50 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
26d60 20 69 73 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e   isNot = pExpr->
26d70 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20  op2==TK_ISNOT;. 
26d80 20 20 20 20 20 69 73 54 72 75 65 20 3d 20 73 71       isTrue = sq
26d90 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61  lite3ExprTruthVa
26da0 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  lue(pExpr->pRigh
26db0 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
26dc0 73 65 28 20 69 73 54 72 75 65 20 26 26 20 69 73  se( isTrue && is
26dd0 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Not );.      tes
26de0 74 63 61 73 65 28 20 21 69 73 54 72 75 65 20 26  tcase( !isTrue &
26df0 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20  & isNot );.     
26e00 20 69 66 28 20 69 73 54 72 75 65 20 5e 20 69 73   if( isTrue ^ is
26e10 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Not ){.        s
26e20 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
26e30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
26e40 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20  pLeft, dest,.   
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e60 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53         isNot ? S
26e70 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
26e80 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c   : 0);.      }el
26e90 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
26ea0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
26eb0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
26ec0 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20  eft, dest,.     
26ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ee0 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51        isNot ? SQ
26ef0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
26f00 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  : 0);.      }.  
26f10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26f20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
26f30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
26f40 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  OT:.      testca
26f50 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  se( op==TK_IS );
26f60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26f70 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b   op==TK_ISNOT );
26f80 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d  .      op = (op=
26f90 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20  =TK_IS) ? TK_EQ 
26fa0 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a  : TK_NE;.      j
26fb0 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49  umpIfNull = SQLI
26fc0 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
26fd0 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f   /* Fall thru */
26fe0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
26ff0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
27000 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
27010 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
27020 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
27030 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
27040 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
27050 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
27060 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
27070 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78   goto default_ex
27080 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  pr;.      testca
27090 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
270a0 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
270b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
270c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
270d0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
270e0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
270f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
27100 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
27110 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
27120 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
27130 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
27140 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
27150 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
27160 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
27170 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
27180 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
27190 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
271a0 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
271b0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
271c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
271d0 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
271e0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
271f0 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
27200 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
27210 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27220 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
27230 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
27240 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
27250 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
27260 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
27270 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
27280 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
27290 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
272a0 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
272b0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
272c0 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
272d0 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
272e0 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
272f0 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56  =OP_Eq);.      V
27300 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27310 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
27320 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
27330 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
27340 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27350 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
27360 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
27370 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
27380 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
27390 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
273a0 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
273b0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
273c0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
273d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
273e0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
273f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
27400 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
27410 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
27420 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
27430 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
27440 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
27450 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
27460 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
27470 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
27480 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
27490 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
274a0 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
274b0 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
274c0 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20  L==OP_IsNull ); 
274d0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
274e0 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
274f0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
27500 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
27510 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f  l ); testcase( o
27520 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
27530 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
27540 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
27550 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27560 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
27570 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27580 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
27590 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
275a0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
275b0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
275c0 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
275d0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
275e0 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
275f0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
27600 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
27610 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
27620 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
27630 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
27640 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
27650 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
27660 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
27670 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
27680 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  , sqlite3ExprIfT
27690 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  rue, jumpIfNull)
276a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
276b0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
276c0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
276d0 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
276e0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
276f0 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69  stIfFalse = sqli
27700 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
27710 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
27720 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
27730 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65   jumpIfNull ? de
27740 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65  st : destIfFalse
27750 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
27760 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
27770 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46  , pExpr, destIfF
27780 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c  alse, destIfNull
27790 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
277a0 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
277b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
277c0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
277d0 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
277e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
277f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
27800 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64  default: {.    d
27810 65 66 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20  efault_expr:.   
27820 20 20 20 69 66 28 20 45 78 70 72 41 6c 77 61 79     if( ExprAlway
27830 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a  sTrue(pExpr) ){.
27840 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27850 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
27860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
27870 28 20 45 78 70 72 41 6c 77 61 79 73 46 61 6c 73  ( ExprAlwaysFals
27880 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
27890 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a      /* No-op */.
278a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
278b0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
278c0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
278d0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65  arse, pExpr, &re
278e0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
278f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27900 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c  p3(v, OP_If, r1,
27910 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
27920 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56  l!=0);.        V
27930 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
27940 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
27950 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
27960 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
27970 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
27980 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
27990 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
279a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
279b0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
279c0 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
279d0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
279e0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
279f0 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a  gFree2);  .}../*
27a00 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
27a10 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
27a20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
27a30 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
27a40 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
27a50 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
27a60 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
27a70 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74  false but execut
27a80 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
27a90 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
27aa0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
27ab0 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
27ac0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
27ad0 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
27ae0 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
27af0 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65  e nor false) the
27b00 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d  n.** jump if jum
27b10 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54  pIfNull is SQLIT
27b20 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20  E_JUMPIFNULL or 
27b30 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
27b40 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73  jumpIfNull.** is
27b50 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
27b60 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50  te3ExprIfFalse(P
27b70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
27b80 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
27b90 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
27ba0 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
27bb0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
27bc0 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
27bd0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
27be0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
27bf0 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
27c00 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
27c10 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
27c20 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
27c30 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
27c40 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
27c50 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  =0) ) return; /*
27c60 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44   Existence of VD
27c70 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
27c80 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45  ller */.  if( pE
27c90 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75  xpr==0 )    retu
27ca0 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61  rn;..  /* The va
27cb0 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  lue of pExpr->op
27cc0 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61   and op are rela
27cd0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
27ce0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
27cf0 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20  pExpr->op       
27d00 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20       op.  **    
27d10 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20     ---------    
27d20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
27d30 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49  .  **       TK_I
27d40 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f  SNULL          O
27d50 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20  P_NotNull.  **  
27d60 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20       TK_NOTNULL 
27d70 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c          OP_IsNul
27d80 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
27d90 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  NE              
27da0 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Eq.  **      
27db0 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20   TK_EQ          
27dc0 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20      OP_Ne.  **  
27dd0 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20       TK_GT      
27de0 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20          OP_Le.  
27df0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20  **       TK_LE  
27e00 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
27e10 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
27e20 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GE              
27e30 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Lt.  **      
27e40 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20   TK_LT          
27e50 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20      OP_Ge.  **. 
27e60 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61   ** For other va
27e70 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f  lues of pExpr->o
27e80 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e  p, op is undefin
27e90 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20  ed and unused.. 
27ea0 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   ** The value of
27eb0 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
27ec0 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e  stants are arran
27ed0 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65  ged such that we
27ee0 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74  .  ** can comput
27ef0 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62  e the mapping ab
27f00 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f  ove using the fo
27f10 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69  llowing expressi
27f20 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28  on..  ** Assert(
27f30 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74  )s verify that t
27f40 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
27f50 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a  s correct..  */.
27f60 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e    op = ((pExpr->
27f70 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  op+(TK_ISNULL&1)
27f80 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26  )^1)-(TK_ISNULL&
27f90 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  1);..  /* Verify
27fa0 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65   correct alignme
27fb0 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  nt of TK_ and OP
27fc0 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f  _ constants.  */
27fd0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
27fe0 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op!=TK_ISNULL 
27ff0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  || op==OP_NotNul
28000 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
28010 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54  Expr->op!=TK_NOT
28020 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49  NULL || op==OP_I
28030 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  sNull );.  asser
28040 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
28050 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71  _NE || op==OP_Eq
28060 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
28070 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c  xpr->op!=TK_EQ |
28080 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  | op==OP_Ne );. 
28090 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
280a0 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d  op!=TK_LT || op=
280b0 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ge );.  asse
280c0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
280d0 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LE || op==OP_G
280e0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
280f0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20  Expr->op!=TK_GT 
28100 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  || op==OP_Le );.
28110 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
28120 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70  >op!=TK_GE || op
28130 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77  ==OP_Lt );..  sw
28140 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
28150 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
28160 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
28170 4f 52 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  OR: {.      Expr
28180 20 2a 70 41 6c 74 20 3d 20 73 71 6c 69 74 65 33   *pAlt = sqlite3
28190 45 78 70 72 53 69 6d 70 6c 69 66 69 65 64 41 6e  ExprSimplifiedAn
281a0 64 4f 72 28 70 45 78 70 72 29 3b 0a 20 20 20 20  dOr(pExpr);.    
281b0 20 20 69 66 28 20 70 41 6c 74 21 3d 70 45 78 70    if( pAlt!=pExp
281c0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
281d0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
281e0 70 50 61 72 73 65 2c 20 70 41 6c 74 2c 20 64 65  pParse, pAlt, de
281f0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
28200 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
28210 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
28220 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  ND ){.        te
28230 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
28240 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ll==0 );.       
28250 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
28260 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
28270 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
28280 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
28290 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
282a0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
282b0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
282c0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
282d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
282e0 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20         int d2 = 
282f0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
28300 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
28310 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28320 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
28330 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28340 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
28350 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
28360 20 64 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20   d2,.           
28370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
28380 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
28390 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
283a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
283b0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
283c0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
283d0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
283e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
283f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
28400 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
28410 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
28420 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
28430 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
28440 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
28450 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
28460 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
28470 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
28480 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
28490 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
284a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
284b0 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a    case TK_TRUTH:
284c0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e   {.      int isN
284d0 6f 74 3b 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20  ot;   /* IS NOT 
284e0 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46  TRUE or IS NOT F
284f0 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ALSE */.      in
28500 74 20 69 73 54 72 75 65 3b 20 20 2f 2a 20 49 53  t isTrue;  /* IS
28510 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20   TRUE or IS NOT 
28520 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 74 65  TRUE */.      te
28530 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
28540 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ll==0 );.      i
28550 73 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70  sNot = pExpr->op
28560 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20  2==TK_ISNOT;.   
28570 20 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69     isTrue = sqli
28580 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75  te3ExprTruthValu
28590 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  e(pExpr->pRight)
285a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
285b0 28 20 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f  ( isTrue && isNo
285c0 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
285d0 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26 20  ase( !isTrue && 
285e0 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69  isNot );.      i
285f0 66 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e 6f  f( isTrue ^ isNo
28600 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
28610 49 53 20 54 52 55 45 20 61 6e 64 20 49 53 20 4e  IS TRUE and IS N
28620 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20  OT FALSE */.    
28630 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
28640 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
28650 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
28660 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
28670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
28680 4e 6f 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45  Not ? 0 : SQLITE
28690 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 0a 20  _JUMPIFNULL);.. 
286a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
286b0 20 20 20 20 2f 2a 20 49 53 20 46 41 4c 53 45 20      /* IS FALSE 
286c0 61 6e 64 20 49 53 20 4e 4f 54 20 54 52 55 45 20  and IS NOT TRUE 
286d0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
286e0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
286f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
28700 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20  t, dest,.       
28710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28720 20 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53     isNot ? 0 : S
28730 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
28740 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
28750 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
28760 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
28770 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
28780 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28790 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
287a0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
287b0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
287c0 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
287d0 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f    op = (pExpr->o
287e0 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e  p==TK_IS) ? TK_N
287f0 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  E : TK_EQ;.     
28800 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51   jumpIfNull = SQ
28810 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20  LITE_NULLEQ;.   
28820 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
28830 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
28840 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
28850 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
28860 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
28870 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
28880 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
28890 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  Q: {.      if( s
288a0 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
288b0 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  or(pExpr->pLeft)
288c0 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f   ) goto default_
288d0 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74  expr;.      test
288e0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
288f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
28900 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
28910 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
28920 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
28930 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
28940 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
28950 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
28960 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
28970 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
28980 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
28990 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
289a0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
289b0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
289c0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
289d0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
289e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
289f0 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
28a00 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
28a10 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
28a20 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
28a30 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
28a40 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
28a50 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
28a60 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28a70 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
28a80 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
28a90 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
28aa0 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
28ab0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
28ac0 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
28ad0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
28ae0 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
28af0 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
28b00 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
28b10 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
28b20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
28b30 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
28b40 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
28b50 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28b60 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
28b70 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
28b80 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
28b90 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
28ba0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
28bb0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
28bc0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
28bd0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
28be0 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
28bf0 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  e(op==OP_Ne);.  
28c00 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
28c10 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
28c20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
28c30 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
28c40 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
28c50 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
28c60 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
28c70 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
28c80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28c90 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
28ca0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
28cb0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
28cc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
28cd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
28ce0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
28cf0 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
28d00 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
28d10 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
28d20 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
28d30 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
28d40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28d50 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
28d60 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
28d70 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
28d80 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f  NULL );   VdbeCo
28d90 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
28da0 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
28db0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
28dc0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56  TK_NOTNULL );  V
28dd0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
28de0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
28df0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
28e00 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
28e10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
28e20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
28e30 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
28e40 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
28e50 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
28e60 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
28e70 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
28e80 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78   dest, sqlite3Ex
28e90 70 72 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49  prIfFalse, jumpI
28ea0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
28eb0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
28ec0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
28ed0 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
28ee0 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
28ef0 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29  if( jumpIfNull )
28f00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
28f10 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
28f20 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
28f30 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
28f40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
28f50 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71   destIfNull = sq
28f60 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
28f70 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
28f80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
28f90 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
28fa0 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49  xpr, dest, destI
28fb0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
28fc0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
28fd0 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
28fe0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  fNull);.      }.
28ff0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29000 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
29010 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66  fault: {.    def
29020 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20 20  ault_expr: .    
29030 20 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73    if( ExprAlways
29040 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
29050 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
29060 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
29070 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
29080 28 20 45 78 70 72 41 6c 77 61 79 73 54 72 75 65  ( ExprAlwaysTrue
29090 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
290a0 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
290b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
290c0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
290d0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
290e0 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
290f0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
29100 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29110 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  3(v, OP_IfNot, r
29120 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
29130 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  ull!=0);.       
29140 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
29150 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
29160 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
29170 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
29180 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
29190 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
291a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
291b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
291c0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
291d0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
291e0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
291f0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
29200 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a  regFree2);.}../*
29210 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33  .** Like sqlite3
29220 45 78 70 72 49 66 46 61 6c 73 65 28 29 20 65 78  ExprIfFalse() ex
29230 63 65 70 74 20 74 68 61 74 20 61 20 63 6f 70 79  cept that a copy
29240 20 69 73 20 6d 61 64 65 20 6f 66 20 70 45 78 70   is made of pExp
29250 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65  r before.** code
29260 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64   generation, and
29270 20 74 68 61 74 20 63 6f 70 79 20 69 73 20 64 65   that copy is de
29280 6c 65 74 65 64 20 61 66 74 65 72 20 63 6f 64 65  leted after code
29290 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69   generation. Thi
292a0 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 61  s.** ensures tha
292b0 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
292c0 45 78 70 72 20 69 73 20 75 6e 63 68 61 6e 67 65  Expr is unchange
292d0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
292e0 65 33 45 78 70 72 49 66 46 61 6c 73 65 44 75 70  e3ExprIfFalseDup
292f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
29300 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
29310 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66   dest,int jumpIf
29320 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  Null){.  sqlite3
29330 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
29340 62 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 70 79  b;.  Expr *pCopy
29350 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
29360 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
29370 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
29380 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
29390 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
293a0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f  alse(pParse, pCo
293b0 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  py, dest, jumpIf
293c0 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Null);.  }.  sql
293d0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
293e0 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a  b, pCopy);.}../*
293f0 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70  .** Expression p
29400 56 61 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  Var is guarantee
29410 64 20 74 6f 20 62 65 20 61 6e 20 53 51 4c 20 76  d to be an SQL v
29420 61 72 69 61 62 6c 65 2e 20 70 45 78 70 72 20 6d  ariable. pExpr m
29430 61 79 20 62 65 20 61 6e 79 0a 2a 2a 20 74 79 70  ay be any.** typ
29440 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2e  e of expression.
29450 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
29460 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20  is a simple SQL 
29470 76 61 6c 75 65 20 2d 20 61 6e 20 69 6e 74 65 67  value - an integ
29480 65 72 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67  er, real, string
29490 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72 20 4e 55 4c  , blob.** or NUL
294a0 4c 20 76 61 6c 75 65 20 2d 20 74 68 65 6e 20 74  L value - then t
294b0 68 65 20 56 44 42 45 20 63 75 72 72 65 6e 74 6c  he VDBE currentl
294c0 79 20 62 65 69 6e 67 20 70 72 65 70 61 72 65 64  y being prepared
294d0 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a   is configured.*
294e0 2a 20 74 6f 20 72 65 2d 70 72 65 70 61 72 65 20  * to re-prepare 
294f0 65 61 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20  each time a new 
29500 76 61 6c 75 65 20 69 73 20 62 6f 75 6e 64 20 74  value is bound t
29510 6f 20 76 61 72 69 61 62 6c 65 20 70 56 61 72 2e  o variable pVar.
29520 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61  .**.** Additiona
29530 6c 6c 79 2c 20 69 66 20 70 45 78 70 72 20 69 73  lly, if pExpr is
29540 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61   a simple SQL va
29550 6c 75 65 20 61 6e 64 20 74 68 65 20 76 61 6c 75  lue and the valu
29560 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65  e is the.** same
29570 20 61 73 20 74 68 61 74 20 63 75 72 72 65 6e 74   as that current
29580 6c 79 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69  ly bound to vari
29590 61 62 6c 65 20 70 56 61 72 2c 20 6e 6f 6e 2d 7a  able pVar, non-z
295a0 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
295b0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
295c0 66 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  f the values are
295d0 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 6f 72   not the same or
295e0 20 69 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74   if pExpr is not
295f0 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 53 51 4c   a simple.** SQL
29600 20 76 61 6c 75 65 2c 20 7a 65 72 6f 20 69 73 20   value, zero is 
29610 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
29620 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 6d 70  tic int exprComp
29630 61 72 65 56 61 72 69 61 62 6c 65 28 50 61 72 73  areVariable(Pars
29640 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
29650 2a 70 56 61 72 2c 20 45 78 70 72 20 2a 70 45 78  *pVar, Expr *pEx
29660 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d  pr){.  int res =
29670 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 72 3b 0a   0;.  int iVar;.
29680 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
29690 2a 70 4c 2c 20 2a 70 52 20 3d 20 30 3b 0a 20 20  *pL, *pR = 0;.  
296a0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
296b0 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e  romExpr(pParse->
296c0 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54  db, pExpr, SQLIT
296d0 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 41  E_UTF8, SQLITE_A
296e0 46 46 5f 42 4c 4f 42 2c 20 26 70 52 29 3b 0a 20  FF_BLOB, &pR);. 
296f0 20 69 66 28 20 70 52 20 29 7b 0a 20 20 20 20 69   if( pR ){.    i
29700 56 61 72 20 3d 20 70 56 61 72 2d 3e 69 43 6f 6c  Var = pVar->iCol
29710 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  umn;.    sqlite3
29720 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70  VdbeSetVarmask(p
29730 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56  Parse->pVdbe, iV
29740 61 72 29 3b 0a 20 20 20 20 70 4c 20 3d 20 73 71  ar);.    pL = sq
29750 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
29760 64 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70  dValue(pParse->p
29770 52 65 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c  Reprepare, iVar,
29780 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
29790 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 20 29 7b  );.    if( pL ){
297a0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
297b0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4c  e3_value_type(pL
297c0 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  )==SQLITE_TEXT )
297d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
297e0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4c 29  3_value_text(pL)
297f0 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ; /* Make sure t
29800 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 55  he encoding is U
29810 54 46 2d 38 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  TF-8 */.      }.
29820 20 20 20 20 20 20 72 65 73 20 3d 20 20 30 3d 3d        res =  0==
29830 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
29840 65 28 70 4c 2c 20 70 52 2c 20 30 29 3b 0a 20 20  e(pL, pR, 0);.  
29850 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
29860 61 6c 75 65 46 72 65 65 28 70 52 29 3b 0a 20 20  alueFree(pR);.  
29870 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
29880 65 65 28 70 4c 29 3b 0a 20 20 7d 0a 0a 20 20 72  ee(pL);.  }..  r
29890 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
298a0 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
298b0 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
298c0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
298d0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
298e0 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
298f0 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65  sions are comple
29900 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20  tely identical. 
29910 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
29920 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a  y differ only.**
29930 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70   by a COLLATE op
29940 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f  erator at the to
29950 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e  p level.  Return
29960 20 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20   2 if there are 
29970 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f  differences.** o
29980 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f  ther than the to
29990 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20  p-level COLLATE 
299a0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
299b0 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e  If any subelemen
299c0 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72  t of pB has Expr
299d0 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68  .iTable==(-1) th
299e0 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64  en it is allowed
299f0 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65  .** to compare e
29a00 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76  qual to an equiv
29a10 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e  alent element in
29a20 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54   pA with Expr.iT
29a30 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a  able==iTab..**.*
29a40 2a 20 54 68 65 20 70 41 20 73 69 64 65 20 6d 69  * The pA side mi
29a50 67 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f  ght be using TK_
29a60 52 45 47 49 53 54 45 52 2e 20 20 49 66 20 74 68  REGISTER.  If th
29a70 61 74 20 69 73 20 74 68 65 20 63 61 73 65 20 61  at is the case a
29a80 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20  nd pB is.** not 
29a90 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
29aa0 52 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69  R but is otherwi
29ab0 73 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74  se equivalent, t
29ac0 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
29ad0 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69   0..**.** Someti
29ae0 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  mes this routine
29af0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65   will return 2 e
29b00 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65  ven if the two e
29b10 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65  xpressions.** re
29b20 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c  ally are equival
29b30 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e  ent.  If we cann
29b40 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  ot prove that th
29b50 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
29b60 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20  e.** identical, 
29b70 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74  we return 2 just
29b80 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f   to be safe.  So
29b90 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
29ba0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74  .** returns 2, t
29bb0 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72  hen you do not r
29bc0 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63  eally know for c
29bd0 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77  ertain if the tw
29be0 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
29bf0 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
29c00 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61  But if you get a
29c10 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20   0 or 1 return, 
29c20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20  then you.** can 
29c30 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72  be sure the expr
29c40 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
29c50 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c  same.  In the pl
29c60 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68  aces where.** th
29c70 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
29c80 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ed, it does not 
29c90 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65  hurt to get an e
29ca0 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a  xtra 2 - that.**
29cb0 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75   just might resu
29cc0 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68  lt in some sligh
29cd0 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e  tly slower code.
29ce0 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a    But returning.
29cf0 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  ** an incorrect 
29d00 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61  0 or 1 could lea
29d10 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69  d to a malfuncti
29d20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61  on..**.** If pPa
29d30 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  rse is not NULL 
29d40 74 68 65 6e 20 54 4b 5f 56 41 52 49 41 42 4c 45  then TK_VARIABLE
29d50 20 74 65 72 6d 73 20 69 6e 20 70 41 20 77 69 74   terms in pA wit
29d60 68 20 62 69 6e 64 69 6e 67 73 20 69 6e 0a 2a 2a  h bindings in.**
29d70 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70   pParse->pReprep
29d80 61 72 65 20 63 61 6e 20 62 65 20 6d 61 74 63 68  are can be match
29d90 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65 72  ed against liter
29da0 61 6c 73 20 69 6e 20 70 42 2e 20 20 54 68 65 20  als in pB.  The 
29db0 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 56 64 62  .** pParse->pVdb
29dc0 65 2d 3e 65 78 70 6d 61 73 6b 20 62 69 74 6d 61  e->expmask bitma
29dd0 73 6b 20 69 73 20 75 70 64 61 74 65 64 20 66 6f  sk is updated fo
29de0 72 20 65 61 63 68 20 76 61 72 69 61 62 6c 65 20  r each variable 
29df0 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 49  referenced..** I
29e00 66 20 70 50 61 72 73 65 20 69 73 20 4e 55 4c 4c  f pParse is NULL
29e10 20 28 74 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73   (the normal cas
29e20 65 29 20 74 68 65 6e 20 61 6e 79 20 54 4b 5f 56  e) then any TK_V
29e30 41 52 49 41 42 4c 45 20 74 65 72 6d 20 69 6e 20  ARIABLE term in 
29e40 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 50 61  .** Argument pPa
29e50 72 73 65 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  rse should norma
29e60 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20  lly be NULL. If 
29e70 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  it is not NULL a
29e80 6e 64 20 70 41 20 6f 72 0a 2a 2a 20 70 42 20 63  nd pA or.** pB c
29e90 61 75 73 65 73 20 61 20 72 65 74 75 72 6e 20 76  auses a return v
29ea0 61 6c 75 65 20 6f 66 20 32 2e 0a 2a 2f 0a 69 6e  alue of 2..*/.in
29eb0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
29ec0 70 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  pare(Parse *pPar
29ed0 73 65 2c 20 45 78 70 72 20 2a 70 41 2c 20 45 78  se, Expr *pA, Ex
29ee0 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  pr *pB, int iTab
29ef0 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65  ){.  u32 combine
29f00 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41  dFlags;.  if( pA
29f10 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a  ==0 || pB==0 ){.
29f20 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70      return pB==p
29f30 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20  A ? 0 : 2;.  }. 
29f40 20 69 66 28 20 70 50 61 72 73 65 20 26 26 20 70   if( pParse && p
29f50 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  A->op==TK_VARIAB
29f60 4c 45 20 26 26 20 65 78 70 72 43 6f 6d 70 61 72  LE && exprCompar
29f70 65 56 61 72 69 61 62 6c 65 28 70 50 61 72 73 65  eVariable(pParse
29f80 2c 20 70 41 2c 20 70 42 29 20 29 7b 0a 20 20 20  , pA, pB) ){.   
29f90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
29fa0 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d   combinedFlags =
29fb0 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d   pA->flags | pB-
29fc0 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f  >flags;.  if( co
29fd0 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
29fe0 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
29ff0 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26   if( (pA->flags&
2a000 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74  pB->flags&EP_Int
2a010 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d  Value)!=0 && pA-
2a020 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75  >u.iValue==pB->u
2a030 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  .iValue ){.     
2a040 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
2a050 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
2a060 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
2a070 3d 70 42 2d 3e 6f 70 20 7c 7c 20 70 41 2d 3e 6f  =pB->op || pA->o
2a080 70 3d 3d 54 4b 5f 52 41 49 53 45 20 29 7b 0a 20  p==TK_RAISE ){. 
2a090 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
2a0a0 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
2a0b0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2a0c0 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66  pParse, pA->pLef
2a0d0 74 2c 70 42 2c 69 54 61 62 29 3c 32 20 29 7b 0a  t,pB,iTab)<2 ){.
2a0e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2a0f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
2a100 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
2a110 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
2a120 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2a130 41 2c 70 42 2d 3e 70 4c 65 66 74 2c 69 54 61 62  A,pB->pLeft,iTab
2a140 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  )<2 ){.      ret
2a150 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2a160 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20   return 2;.  }. 
2a170 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f   if( pA->op!=TK_
2a180 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70  COLUMN && pA->op
2a190 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
2a1a0 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  && pA->u.zToken 
2a1b0 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  ){.    if( pA->o
2a1c0 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 7c  p==TK_FUNCTION |
2a1d0 7c 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  | pA->op==TK_AGG
2a1e0 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20  _FUNCTION ){.   
2a1f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
2a200 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b  rICmp(pA->u.zTok
2a210 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  en,pB->u.zToken)
2a220 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  !=0 ) return 2;.
2a230 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a240 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
2a250 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41 2d       assert( pA-
2a260 3e 6f 70 3d 3d 70 42 2d 3e 6f 70 20 29 3b 0a 20  >op==pB->op );. 
2a270 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
2a280 50 72 6f 70 65 72 74 79 28 70 41 2c 45 50 5f 57  Property(pA,EP_W
2a290 69 6e 46 75 6e 63 29 21 3d 45 78 70 72 48 61 73  inFunc)!=ExprHas
2a2a0 50 72 6f 70 65 72 74 79 28 70 42 2c 45 50 5f 57  Property(pB,EP_W
2a2b0 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  inFunc) ){.     
2a2c0 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
2a2d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 45     }.      if( E
2a2e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2a2f0 41 2c 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b  A,EP_WinFunc) ){
2a300 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
2a310 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72  ite3WindowCompar
2a320 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 79 2e  e(pParse, pA->y.
2a330 70 57 69 6e 2c 20 70 42 2d 3e 79 2e 70 57 69 6e  pWin, pB->y.pWin
2a340 2c 20 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 1)!=0 ){.     
2a350 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
2a360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2a370 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
2a380 65 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b  e if( pA->op==TK
2a390 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72  _NULL ){.      r
2a3a0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
2a3b0 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54  se if( pA->op==T
2a3c0 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20  K_COLLATE ){.   
2a3d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2a3e0 74 72 69 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  tricmp(pA->u.zTo
2a3f0 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
2a400 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b  )!=0 ) return 2;
2a410 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41  .    }else if( A
2a420 4c 57 41 59 53 28 70 42 2d 3e 75 2e 7a 54 6f 6b  LWAYS(pB->u.zTok
2a430 65 6e 21 3d 30 29 20 26 26 20 73 74 72 63 6d 70  en!=0) && strcmp
2a440 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42  (pA->u.zToken,pB
2a450 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29  ->u.zToken)!=0 )
2a460 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  {.      return 2
2a470 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2a480 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
2a490 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
2a4a0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
2a4b0 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
2a4c0 32 3b 0a 20 20 69 66 28 20 28 63 6f 6d 62 69 6e  2;.  if( (combin
2a4d0 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b  edFlags & EP_Tok
2a4e0 65 6e 4f 6e 6c 79 29 3d 3d 30 20 29 7b 0a 20 20  enOnly)==0 ){.  
2a4f0 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c    if( combinedFl
2a500 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
2a510 63 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  ct ) return 2;. 
2a520 20 20 20 69 66 28 20 28 63 6f 6d 62 69 6e 65 64     if( (combined
2a530 46 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65 64  Flags & EP_Fixed
2a540 43 6f 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  Col)==0.     && 
2a550 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2a560 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70  re(pParse, pA->p
2a570 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c  Left, pB->pLeft,
2a580 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
2a590 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
2a5a0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
2a5b0 61 72 73 65 2c 20 70 41 2d 3e 70 52 69 67 68 74  arse, pA->pRight
2a5c0 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54  , pB->pRight, iT
2a5d0 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
2a5e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2a5f0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
2a600 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e  A->x.pList, pB->
2a610 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29  x.pList, iTab) )
2a620 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
2a630 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54  f( pA->op!=TK_ST
2a640 52 49 4e 47 0a 20 20 20 20 20 26 26 20 70 41 2d  RING.     && pA-
2a650 3e 6f 70 21 3d 54 4b 5f 54 52 55 45 46 41 4c 53  >op!=TK_TRUEFALS
2a660 45 0a 20 20 20 20 20 26 26 20 28 63 6f 6d 62 69  E.     && (combi
2a670 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65  nedFlags & EP_Re
2a680 64 75 63 65 64 29 3d 3d 30 0a 20 20 20 20 29 7b  duced)==0.    ){
2a690 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69  .      if( pA->i
2a6a0 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c  Column!=pB->iCol
2a6b0 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  umn ) return 2;.
2a6c0 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70        if( pA->op
2a6d0 32 21 3d 70 42 2d 3e 6f 70 32 20 29 20 72 65 74  2!=pB->op2 ) ret
2a6e0 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28  urn 2;.      if(
2a6f0 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
2a700 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20  >iTable .       
2a710 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d  && (pA->iTable!=
2a720 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42  iTab || NEVER(pB
2a730 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20  ->iTable>=0)) ) 
2a740 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
2a750 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2a760 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
2a770 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
2a780 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30  jects.  Return 0
2a790 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
2a7a0 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e  ntical and .** n
2a7b0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20  on-zero if they 
2a7c0 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
2a7d0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  y..**.** If any 
2a7e0 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
2a7f0 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
2a800 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
2a810 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
2a820 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
2a830 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
2a840 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
2a850 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
2a860 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Tab..**.** This 
2a870 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
2a880 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  turn non-zero fo
2a890 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70  r equivalent Exp
2a8a0 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20  rLists.  The.** 
2a8b0 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65  only consequence
2a8c0 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65   will be disable
2a8d0 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  d optimizations.
2a8e0 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
2a8f0 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72  ne.** must never
2a900 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
2a910 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
2a920 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72  jects are differ
2a930 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c  ent, or.** a mal
2a940 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
2a950 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  sult..**.** Two 
2a960 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72  NULL pointers ar
2a970 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
2a980 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  be the same.  Bu
2a990 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
2a9a0 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65  .** always diffe
2a9b0 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55  rs from a non-NU
2a9c0 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69  LL pointer..*/.i
2a9d0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  nt sqlite3ExprLi
2a9e0 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69  stCompare(ExprLi
2a9f0 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74  st *pA, ExprList
2aa00 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
2aa10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
2aa20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29  pA==0 && pB==0 )
2aa30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
2aa40 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
2aa50 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
2aa60 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  ( pA->nExpr!=pB-
2aa70 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
2aa80 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
2aa90 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  pA->nExpr; i++){
2aaa0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
2aab0 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78  A = pA->a[i].pEx
2aac0 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  pr;.    Expr *pE
2aad0 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e  xprB = pB->a[i].
2aae0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
2aaf0 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  A->a[i].sortOrde
2ab00 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74  r!=pB->a[i].sort
2ab10 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31  Order ) return 1
2ab20 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2ab30 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
2ab40 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20  pExprA, pExprB, 
2ab50 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31  iTab) ) return 1
2ab60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2ab70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  ;.}../*.** Like 
2ab80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2ab90 72 65 28 29 20 65 78 63 65 70 74 20 43 4f 4c 4c  re() except COLL
2aba0 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 74  ATE operators at
2abb0 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a   the top-level.*
2abc0 2a 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a  * are ignored..*
2abd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2abe0 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 45 78 70  rCompareSkip(Exp
2abf0 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c  r *pA, Expr *pB,
2ac00 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 72 65   int iTab){.  re
2ac10 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
2ac20 43 6f 6d 70 61 72 65 28 30 2c 0a 20 20 20 20 20  Compare(0,.     
2ac30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2ac40 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
2ac50 41 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  A),.            
2ac60 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
2ac70 43 6f 6c 6c 61 74 65 28 70 42 29 2c 0a 20 20 20  Collate(pB),.   
2ac80 20 20 20 20 20 20 20 20 20 20 69 54 61 62 29 3b            iTab);
2ac90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2aca0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 45 78 70   non-zero if Exp
2acb0 72 20 70 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  r p can only be 
2acc0 74 72 75 65 20 69 66 20 70 4e 4e 20 69 73 20 6e  true if pNN is n
2acd0 6f 74 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  ot NULL..*/.stat
2ace0 69 63 20 69 6e 74 20 65 78 70 72 49 6d 70 6c 69  ic int exprImpli
2acf0 65 73 4e 6f 74 4e 75 6c 6c 28 0a 20 20 50 61 72  esNotNull(.  Par
2ad00 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2ad10 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
2ad20 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
2ad30 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2ad40 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
2ad50 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a  o be checked */.
2ad60 20 20 45 78 70 72 20 2a 70 4e 4e 2c 20 20 20 20    Expr *pNN,    
2ad70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
2ad80 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
2ad90 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e  NOT NULL */.  in
2ada0 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
2adb0 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
2adc0 20 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20 20   evaluated */.  
2add0 69 6e 74 20 73 65 65 6e 4e 6f 74 20 20 20 20 20  int seenNot     
2ade0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
2adf0 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f   is an operand o
2ae00 66 20 4e 4f 54 20 2a 2f 0a 29 7b 0a 20 20 61 73  f NOT */.){.  as
2ae10 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73  sert( p );.  ass
2ae20 65 72 74 28 20 70 4e 4e 20 29 3b 0a 20 20 69 66  ert( pNN );.  if
2ae30 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
2ae40 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 2c 20  pare(pParse, p, 
2ae50 70 4e 4e 2c 20 69 54 61 62 29 3d 3d 30 20 29 20  pNN, iTab)==0 ) 
2ae60 72 65 74 75 72 6e 20 31 3b 0a 20 20 73 77 69 74  return 1;.  swit
2ae70 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
2ae80 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
2ae90 20 20 20 20 20 69 66 28 20 73 65 65 6e 4e 6f 74       if( seenNot
2aea0 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
2aeb0 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
2aec0 65 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ect) ) return 0;
2aed0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
2aee0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2aef0 2c 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20  ,EP_xIsSelect). 
2af00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 2d            || (p-
2af10 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 70  >x.pList!=0 && p
2af20 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2af30 3e 30 29 20 29 3b 0a 20 20 20 20 20 20 72 65 74  >0) );.      ret
2af40 75 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e  urn exprImpliesN
2af50 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70  otNull(pParse, p
2af60 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54  ->pLeft, pNN, iT
2af70 61 62 2c 20 73 65 65 6e 4e 6f 74 29 3b 0a 20 20  ab, seenNot);.  
2af80 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
2af90 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
2afa0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
2afb0 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20   = p->x.pList;. 
2afc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
2afd0 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  st!=0 );.      a
2afe0 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
2aff0 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 20 20  xpr==2 );.      
2b000 69 66 28 20 73 65 65 6e 4e 6f 74 20 29 20 72 65  if( seenNot ) re
2b010 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66  turn 0;.      if
2b020 28 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74  ( exprImpliesNot
2b030 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 4c 69  Null(pParse, pLi
2b040 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
2b050 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65 6e 4e  pNN, iTab, seenN
2b060 6f 74 29 0a 20 20 20 20 20 20 20 7c 7c 20 65 78  ot).       || ex
2b070 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c  prImpliesNotNull
2b080 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
2b090 61 5b 31 5d 2e 70 45 78 70 72 2c 20 70 4e 4e 2c  a[1].pExpr, pNN,
2b0a0 20 69 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29 0a   iTab, seenNot).
2b0b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2b0c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2b0d0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
2b0e0 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75  exprImpliesNotNu
2b0f0 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  ll(pParse, p->pL
2b100 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20  eft, pNN, iTab, 
2b110 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a  seenNot);.    }.
2b120 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a      case TK_EQ:.
2b130 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
2b140 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
2b150 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
2b160 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
2b170 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
2b180 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
2b190 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
2b1a0 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
2b1b0 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20  _STAR:.    case 
2b1c0 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
2b1d0 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
2b1e0 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
2b1f0 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
2b200 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
2b210 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
2b220 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63  K_RSHIFT: .    c
2b230 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
2b240 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72 49  .      if( exprI
2b250 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70 50  mpliesNotNull(pP
2b260 61 72 73 65 2c 20 70 2d 3e 70 52 69 67 68 74 2c  arse, p->pRight,
2b270 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65 6e   pNN, iTab, seen
2b280 4e 6f 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Not) ) return 1;
2b290 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
2b2a0 68 72 75 20 69 6e 74 6f 20 74 68 65 20 6e 65 78  hru into the nex
2b2b0 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  t case */.    }.
2b2c0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e      case TK_SPAN
2b2d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
2b2e0 4c 4c 41 54 45 3a 0a 20 20 20 20 63 61 73 65 20  LLATE:.    case 
2b2f0 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
2b300 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20 20  ase TK_UPLUS:.  
2b310 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
2b320 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
2b330 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e   exprImpliesNotN
2b340 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ull(pParse, p->p
2b350 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c  Left, pNN, iTab,
2b360 20 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d   seenNot);.    }
2b370 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55  .    case TK_TRU
2b380 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  TH: {.      if( 
2b390 73 65 65 6e 4e 6f 74 20 29 20 72 65 74 75 72 6e  seenNot ) return
2b3a0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
2b3b0 3e 6f 70 32 21 3d 54 4b 5f 49 53 20 29 20 72 65  >op2!=TK_IS ) re
2b3c0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 72 65  turn 0;.      re
2b3d0 74 75 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73  turn exprImplies
2b3e0 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20  NotNull(pParse, 
2b3f0 70 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69  p->pLeft, pNN, i
2b400 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29 3b 0a 20  Tab, seenNot);. 
2b410 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
2b420 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 72 65  _NOT: {.      re
2b430 74 75 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73  turn exprImplies
2b440 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20  NotNull(pParse, 
2b450 70 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69  p->pLeft, pNN, i
2b460 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  Tab, 1);.    }. 
2b470 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2b480 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2b490 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72  rue if we can pr
2b4a0 6f 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c  ove the pE2 will
2b4b0 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20   always be true 
2b4c0 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75  if pE1 is.** tru
2b4d0 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  e.  Return false
2b4e0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f   if we cannot co
2b4f0 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66  mplete the proof
2b500 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74   or if pE2 might
2b510 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45  .** be false.  E
2b520 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
2b530 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20     pE1: x==5    
2b540 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20     pE2: x==5    
2b550 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a           Result:
2b560 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
2b570 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32  : x>0        pE2
2b580 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
2b590 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
2b5a0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32  .**     pE1: x=2
2b5b0 31 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32  1       pE2: x=2
2b5c0 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65  1 OR y=43     Re
2b5d0 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
2b5e0 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20    pE1: x!=123   
2b5f0 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
2b600 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
2b610 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
2b620 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a   x!=?1      pE2:
2b630 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
2b640 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
2b650 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20  *     pE1: x IS 
2b660 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20  NULL  pE2: x IS 
2b670 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
2b680 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  lt: false.**    
2b690 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20   pE1: x IS ?2   
2b6a0 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
2b6b0 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66  ULL    Reuslt: f
2b6c0 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  alse.**.** When 
2b6d0 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c  comparing TK_COL
2b6e0 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65  UMN nodes betwee
2b6f0 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69  n pE1 and pE2, i
2b700 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70  f pE2 has.** Exp
2b710 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20  r.iTable<0 then 
2b720 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e  assume a table n
2b730 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69  umber given by i
2b740 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50  Tab..**.** If pP
2b750 61 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  arse is not NULL
2b760 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
2b770 73 20 6f 66 20 62 6f 75 6e 64 20 76 61 72 69 61  s of bound varia
2b780 62 6c 65 73 20 69 6e 20 70 45 31 20 61 72 65 20  bles in pE1 are 
2b790 0a 2a 2a 20 63 6f 6d 70 61 72 65 64 20 61 67 61  .** compared aga
2b7a0 69 6e 73 74 20 6c 69 74 65 72 61 6c 20 76 61 6c  inst literal val
2b7b0 75 65 73 20 69 6e 20 70 45 32 20 61 6e 64 20 70  ues in pE2 and p
2b7c0 50 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78  Parse->pVdbe->ex
2b7d0 70 6d 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69  pmask is.** modi
2b7e0 66 69 65 64 20 74 6f 20 72 65 63 6f 72 64 20 77  fied to record w
2b7f0 68 69 63 68 20 62 6f 75 6e 64 20 76 61 72 69 61  hich bound varia
2b800 62 6c 65 73 20 61 72 65 20 72 65 66 65 72 65 6e  bles are referen
2b810 63 65 64 2e 20 20 49 66 20 70 50 61 72 73 65 20  ced.  If pParse 
2b820 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  .** is NULL, the
2b830 6e 20 66 61 6c 73 65 20 77 69 6c 6c 20 62 65 20  n false will be 
2b840 72 65 74 75 72 6e 65 64 20 69 66 20 70 45 31 20  returned if pE1 
2b850 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 62 6f 75  contains any bou
2b860 6e 64 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  nd variables..**
2b870 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  .** When in doub
2b880 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  t, return false.
2b890 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65    Returning true
2b8a0 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65   might give a pe
2b8b0 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70  rformance.** imp
2b8c0 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72  rovement.  Retur
2b8d0 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74  ning false might
2b8e0 20 63 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d   cause a perform
2b8f0 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20  ance reduction, 
2b900 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61  but.** it will a
2b910 6c 77 61 79 73 20 67 69 76 65 20 74 68 65 20 63  lways give the c
2b920 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e  orrect answer an
2b930 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79  d is hence alway
2b940 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s safe..*/.int s
2b950 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
2b960 73 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61  sExpr(Parse *pPa
2b970 72 73 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20  rse, Expr *pE1, 
2b980 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69  Expr *pE2, int i
2b990 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  Tab){.  if( sqli
2b9a0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2b9b0 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2c  Parse, pE1, pE2,
2b9c0 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20   iTab)==0 ){.   
2b9d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
2b9e0 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
2b9f0 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74  _OR.   && (sqlit
2ba00 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
2ba10 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70  r(pParse, pE1, p
2ba20 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  E2->pLeft, iTab)
2ba30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
2ba40 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
2ba50 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c 20  iesExpr(pParse, 
2ba60 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74  pE1, pE2->pRight
2ba70 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20  , iTab) ).  ){. 
2ba80 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
2ba90 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
2baa0 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26  TK_NOTNULL.   &&
2bab0 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e   exprImpliesNotN
2bac0 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 45 31 2c  ull(pParse, pE1,
2bad0 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61   pE2->pLeft, iTa
2bae0 62 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 72  b, 0).  ){.    r
2baf0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
2bb00 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2bb10 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 45 78  * This is the Ex
2bb20 70 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b  pr node callback
2bb30 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72   for sqlite3Expr
2bb40 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f  ImpliesNotNullRo
2bb50 77 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65  w()..** If the e
2bb60 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72  xpression node r
2bb70 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65  equires that the
2bb80 20 74 61 62 6c 65 20 61 74 20 70 57 61 6c 6b 65   table at pWalke
2bb90 72 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65 20  r->iCur.** have 
2bba0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 6f 6e 2d  one or more non-
2bbb0 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  NULL column, the
2bbc0 6e 20 73 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65  n set pWalker->e
2bbd0 43 6f 64 65 20 74 6f 20 31 20 61 6e 64 20 61 62  Code to 1 and ab
2bbe0 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ort..**.** This 
2bbf0 72 6f 75 74 69 6e 65 20 63 6f 6e 74 72 6f 6c 73  routine controls
2bc00 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2bc10 2e 20 20 46 61 6c 73 65 20 70 6f 73 69 74 69 76  .  False positiv
2bc20 65 73 20 28 73 65 74 74 69 6e 67 0a 2a 2a 20 70  es (setting.** p
2bc30 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f  Walker->eCode to
2bc40 20 31 20 77 68 65 6e 20 69 74 20 73 68 6f 75 6c   1 when it shoul
2bc50 64 20 6e 6f 74 20 62 65 29 20 61 72 65 20 64 65  d not be) are de
2bc60 61 64 6c 79 2c 20 62 75 74 20 66 61 6c 73 65 2d  adly, but false-
2bc70 6e 65 67 61 74 69 76 65 73 0a 2a 2a 20 28 6e 65  negatives.** (ne
2bc80 76 65 72 20 73 65 74 74 69 6e 67 20 70 57 61 6c  ver setting pWal
2bc90 6b 65 72 2d 3e 65 43 6f 64 65 29 20 69 73 20 61  ker->eCode) is a
2bca0 20 68 61 72 6d 6c 65 73 73 20 6d 69 73 73 65 64   harmless missed
2bcb0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
2bcc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6d 70  /.static int imp
2bcd0 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57  liesNotNullRow(W
2bce0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2bcf0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2bd00 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2bd10 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
2bd20 4d 4e 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  MN );.  testcase
2bd30 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2bd40 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
2bd50 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
2bd60 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2bd70 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
2bd80 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2bd90 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
2bda0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
2bdb0 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  _ISNOT:.    case
2bdc0 20 54 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63 61 73   TK_NOT:.    cas
2bdd0 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
2bde0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
2bdf0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
2be00 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
2be10 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  :.    case TK_CA
2be20 53 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SE:.    case TK_
2be30 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IN:.    case TK_
2be40 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
2be50 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2be60 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
2be70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2be80 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
2be90 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OT );.      test
2bea0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2beb0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
2bec0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2bed0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  xpr->op==TK_NOTN
2bee0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
2bef0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2bf00 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
2bf10 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2bf20 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ->op==TK_OR );. 
2bf30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2bf40 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53  Expr->op==TK_CAS
2bf50 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
2bf60 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2bf70 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74  TK_IN );.      t
2bf80 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2bf90 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
2bfa0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2bfb0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 63  WRC_Prune;.    c
2bfc0 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
2bfd0 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
2bfe0 2d 3e 75 2e 69 43 75 72 3d 3d 70 45 78 70 72 2d  ->u.iCur==pExpr-
2bff0 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  >iTable ){.     
2c000 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
2c010 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  e = 1;.        r
2c020 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2c030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2c040 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2c050 0a 0a 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ..    /* Virtual
2c060 20 74 61 62 6c 65 73 20 61 72 65 20 61 6c 6c 6f   tables are allo
2c070 77 65 64 20 74 6f 20 75 73 65 20 63 6f 6e 73 74  wed to use const
2c080 72 61 69 6e 74 73 20 6c 69 6b 65 20 78 3d 4e 55  raints like x=NU
2c090 4c 4c 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 61  LL.  So.    ** a
2c0a0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
2c0b0 6d 20 78 3d 79 20 64 6f 65 73 20 6e 6f 74 20 70  m x=y does not p
2c0c0 72 6f 76 65 20 74 68 61 74 20 79 20 69 73 20 6e  rove that y is n
2c0d0 6f 74 20 6e 75 6c 6c 20 69 66 20 78 0a 20 20 20  ot null if x.   
2c0e0 20 2a 2a 20 69 73 20 74 68 65 20 63 6f 6c 75 6d   ** is the colum
2c0f0 6e 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74  n of a virtual t
2c100 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65  able */.    case
2c110 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65   TK_EQ:.    case
2c120 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
2c130 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
2c140 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
2c150 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
2c160 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20 74 65   TK_GE:.      te
2c170 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c180 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
2c190 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2c1a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  r->op==TK_NE );.
2c1b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c1c0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  pExpr->op==TK_LT
2c1d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2c1e0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2c1f0 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LE );.      te
2c200 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c210 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
2c220 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2c230 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  r->op==TK_GE );.
2c240 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72        if( (pExpr
2c250 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
2c260 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 72 74  COLUMN && IsVirt
2c270 75 61 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ual(pExpr->pLeft
2c280 2d 3e 79 2e 70 54 61 62 29 29 0a 20 20 20 20 20  ->y.pTab)).     
2c290 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 70 52 69    || (pExpr->pRi
2c2a0 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ght->op==TK_COLU
2c2b0 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c 28  MN && IsVirtual(
2c2c0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 79  pExpr->pRight->y
2c2d0 2e 70 54 61 62 29 29 0a 20 20 20 20 20 20 29 7b  .pTab)).      ){
2c2e0 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  .       return W
2c2f0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
2c300 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  }.    default:. 
2c310 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2c320 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
2c330 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2c340 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66  ue (non-zero) if
2c350 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 61   expression p ca
2c360 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75 65 20 69  n only be true i
2c370 66 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e  f at least.** on
2c380 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
2c390 65 20 69 54 61 62 20 69 73 20 6e 6f 6e 2d 6e 75  e iTab is non-nu
2c3a0 6c 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ll.  In other wo
2c3b0 72 64 73 2c 20 72 65 74 75 72 6e 20 74 72 75 65  rds, return true
2c3c0 0a 2a 2a 20 69 66 20 65 78 70 72 65 73 73 69 6f  .** if expressio
2c3d0 6e 20 70 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  n p will always 
2c3e0 62 65 20 4e 55 4c 4c 20 6f 72 20 66 61 6c 73 65  be NULL or false
2c3f0 20 69 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   if every column
2c400 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e   of iTab.** is N
2c410 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65  ULL..**.** False
2c420 20 6e 65 67 61 74 69 76 65 73 20 61 72 65 20 61   negatives are a
2c430 63 63 65 70 74 61 62 6c 65 2e 20 20 49 6e 20 6f  cceptable.  In o
2c440 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 69  ther words, it i
2c450 73 20 6f 6b 20 74 6f 20 72 65 74 75 72 6e 0a 2a  s ok to return.*
2c460 2a 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 65  * zero even if e
2c470 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c  xpression p will
2c480 20 6e 65 76 65 72 20 62 65 20 74 72 75 65 20 6f   never be true o
2c490 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f  f every column o
2c4a0 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c  f iTab.** is NUL
2c4b0 4c 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61  L.  A false nega
2c4c0 74 69 76 65 20 69 73 20 6d 65 72 65 6c 79 20 61  tive is merely a
2c4d0 20 6d 69 73 73 65 64 20 6f 70 74 69 6d 69 7a 61   missed optimiza
2c4e0 74 69 6f 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  tion opportunity
2c4f0 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 70 6f  ..**.** False po
2c500 73 69 74 69 76 65 73 20 61 72 65 20 6e 6f 74 20  sitives are not 
2c510 61 6c 6c 6f 77 65 64 2c 20 68 6f 77 65 76 65 72  allowed, however
2c520 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74  .  A false posit
2c530 69 76 65 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a  ive may result.*
2c540 2a 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63  * in an incorrec
2c550 74 20 61 6e 73 77 65 72 2e 0a 2a 2a 0a 2a 2a 20  t answer..**.** 
2c560 54 65 72 6d 73 20 6f 66 20 70 20 74 68 61 74 20  Terms of p that 
2c570 61 72 65 20 6d 61 72 6b 65 64 20 77 69 74 68 20  are marked with 
2c580 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 28 61 6e 64  EP_FromJoin (and
2c590 20 68 65 6e 63 65 20 74 68 61 74 20 63 6f 6d 65   hence that come
2c5a0 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 4f 4e 20   from.** the ON 
2c5b0 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
2c5c0 20 6f 66 20 4c 45 46 54 20 4a 4f 49 4e 53 29 20   of LEFT JOINS) 
2c5d0 61 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f  are excluded fro
2c5e0 6d 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 0a  m the analysis..
2c5f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2c600 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ne is used to ch
2c610 65 63 6b 20 69 66 20 61 20 4c 45 46 54 20 4a 4f  eck if a LEFT JO
2c620 49 4e 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72  IN can be conver
2c630 74 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f  ted into.** an o
2c640 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 20 20 54  rdinary JOIN.  T
2c650 68 65 20 70 20 61 72 67 75 6d 65 6e 74 20 69 73  he p argument is
2c660 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2c670 65 2e 20 20 49 66 20 74 68 65 20 57 48 45 52 45  e.  If the WHERE
2c680 0a 2a 2a 20 63 6c 61 75 73 65 20 72 65 71 75 69  .** clause requi
2c690 72 65 73 20 74 68 61 74 20 73 6f 6d 65 20 63 6f  res that some co
2c6a0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 69 67 68  lumn of the righ
2c6b0 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 4c  t table of the L
2c6c0 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20 62 65 20 6e  EFT JOIN.** be n
2c6d0 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
2c6e0 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20  e LEFT JOIN can 
2c6f0 62 65 20 73 61 66 65 6c 79 20 63 6f 6e 76 65 72  be safely conver
2c700 74 65 64 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 6f  ted into an.** o
2c710 72 64 69 6e 61 72 79 20 6a 6f 69 6e 2e 0a 2a 2f  rdinary join..*/
2c720 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2c730 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f  ImpliesNonNullRo
2c740 77 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  w(Expr *p, int i
2c750 54 61 62 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  Tab){.  Walker w
2c760 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45  ;.  p = sqlite3E
2c770 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
2c780 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  );.  while( p ){
2c790 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
2c7a0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 7b 0a 20 20  TK_NOTNULL ){.  
2c7b0 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74      p = p->pLeft
2c7c0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2c7d0 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  p->op==TK_AND ){
2c7e0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2c7f0 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e  e3ExprImpliesNon
2c800 4e 75 6c 6c 52 6f 77 28 70 2d 3e 70 4c 65 66 74  NullRow(p->pLeft
2c810 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
2c820 20 31 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d   1;.      p = p-
2c830 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 7d 65 6c  >pRight;.    }el
2c840 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  se{.      break;
2c850 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 2e 78  .    }.  }.  w.x
2c860 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 69  ExprCallback = i
2c870 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77  mpliesNotNullRow
2c880 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2c890 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 78  lback = 0;.  w.x
2c8a0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
2c8b0 3d 20 30 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  = 0;.  w.eCode =
2c8c0 20 30 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d   0;.  w.u.iCur =
2c8d0 20 69 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33   iTab;.  sqlite3
2c8e0 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
2c8f0 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
2c900 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  e;.}../*.** An i
2c910 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
2c920 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2c930 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
2c940 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
2c950 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
2c960 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63   an expression c
2c970 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  an be evaluated 
2c980 62 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  by reference to 
2c990 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c  the.** index onl
2c9a0 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  y, without havin
2c9b0 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72 63 68  g to do a search
2c9c0 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
2c9d0 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20  onding.** table 
2c9e0 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64 78 43  entry.  The IdxC
2c9f0 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c 64 20  over.pIdx field 
2ca00 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  is the index.  I
2ca10 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20  dxCover.iCur.** 
2ca20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f  is the cursor fo
2ca30 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  r the table..*/.
2ca40 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20  struct IdxCover 
2ca50 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  {.  Index *pIdx;
2ca60 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2ca70 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 66  x to be tested f
2ca80 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20  or coverage */. 
2ca90 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
2caa0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
2cab0 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
2cac0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2cad0 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d  o the index */.}
2cae0 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ;../*.** Check t
2caf0 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
2cb00 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
2cb10 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c   columns in tabl
2cb20 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75  e .** pWalker->u
2cb30 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72  .pIdxCover->iCur
2cb40 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65   can be satisfie
2cb50 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65  d using the inde
2cb60 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  x.** pWalker->u.
2cb70 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e  pIdxCover->pIdx.
2cb80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
2cb90 78 70 72 49 64 78 43 6f 76 65 72 28 57 61 6c 6b  xprIdxCover(Walk
2cba0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2cbb0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
2cbc0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
2cbd0 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70  OLUMN.   && pExp
2cbe0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b  r->iTable==pWalk
2cbf0 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
2cc00 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69  >iCur.   && sqli
2cc10 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
2cc20 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78  (pWalker->u.pIdx
2cc30 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70 45 78  Cover->pIdx, pEx
2cc40 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20  pr->iColumn)<0. 
2cc50 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
2cc60 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  >eCode = 1;.    
2cc70 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2cc80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  ;.  }.  return W
2cc90 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2cca0 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
2ccb0 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49 64 78  if an index pIdx
2ccc0 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 20 63   on table with c
2ccd0 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e 74 61  ursor iCur conta
2cce0 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20  ins will.** the 
2ccf0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
2cd00 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
2cd10 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f 65 73  f the index does
2cd20 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65 78   cover the.** ex
2cd30 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c  pression and fal
2cd40 73 65 20 69 66 20 74 68 65 20 70 45 78 70 72 20  se if the pExpr 
2cd50 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66 65 72  expression refer
2cd60 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f 6c 75  ences table colu
2cd70 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  mns.** that are 
2cd80 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65  not found in the
2cd90 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
2cda0 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f 76 65  ** An index cove
2cdb0 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69  ring an expressi
2cdc0 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  on means that th
2cdd0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
2cde0 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64   be.** evaluated
2cdf0 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20   using only the 
2ce00 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68 6f 75  index and withou
2ce10 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b  t having to look
2ce20 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  up the.** corres
2ce30 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 65 6e  ponding table en
2ce40 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  try..*/.int sqli
2ce50 74 65 33 45 78 70 72 43 6f 76 65 72 65 64 42 79  te3ExprCoveredBy
2ce60 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20 2a 70  Index(.  Expr *p
2ce70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Expr,        /* 
2ce80 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
2ce90 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  tested */.  int 
2cea0 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
2ceb0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  /* The cursor nu
2cec0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63 6f 72  mber for the cor
2ced0 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
2cee0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
2cef0 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  x         /* The
2cf00 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69 67 68   index that migh
2cf10 74 20 62 65 20 75 73 65 64 20 66 6f 72 20 63 6f  t be used for co
2cf20 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57  verage */.){.  W
2cf30 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63  alker w;.  struc
2cf40 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f 76 3b  t IdxCover xcov;
2cf50 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
2cf60 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78   sizeof(w));.  x
2cf70 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75 72 3b  cov.iCur = iCur;
2cf80 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d 20 70  .  xcov.pIdx = p
2cf90 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  Idx;.  w.xExprCa
2cfa0 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49 64 78  llback = exprIdx
2cfb0 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64  Cover;.  w.u.pId
2cfc0 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a  xCover = &xcov;.
2cfd0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
2cfe0 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  r(&w, pExpr);.  
2cff0 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b  return !w.eCode;
2d000 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .}.../*.** An in
2d010 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2d020 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2d030 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  e is used by the
2d040 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20   tree walker.** 
2d050 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e  to count referen
2d060 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c  ces to table col
2d070 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75  umns in the argu
2d080 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20  ments of an .** 
2d090 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
2d0a0 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  on, in order to 
2d0b0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  implement the.**
2d0c0 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
2d0d0 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e  ThisSrc() routin
2d0e0 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63  e..*/.struct Src
2d0f0 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73  Count {.  SrcLis
2d100 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e  t *pSrc;   /* On
2d110 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f  e particular FRO
2d120 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65  M clause in a ne
2d130 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  sted query */.  
2d140 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20  int nThis;      
2d150 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2d160 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
2d170 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  mns in pSrcList 
2d180 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b  */.  int nOther;
2d190 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d1a0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
2d1b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65   columns in othe
2d1c0 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a  r FROM clauses *
2d1d0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  /.};../*.** Coun
2d1e0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
2d1f0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
2d200 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lumns..*/.static
2d210 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e   int exprSrcCoun
2d220 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
2d230 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
2d240 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28  .  /* The NEVER(
2d250 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  ) on the second 
2d260 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20  term is because 
2d270 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
2d280 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a  sesThisSrc().  *
2d290 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c  * is always call
2d2a0 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  ed before sqlite
2d2b0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2d2c0 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20  egates() and so 
2d2d0 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55  the.  ** TK_COLU
2d2e0 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74  MNs have not yet
2d2f0 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
2d300 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
2d310 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c  MN.  If.  ** sql
2d320 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
2d330 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65  ThisSrc() is use
2d340 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e  d differently in
2d350 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65   the future, the
2d360 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69  .  ** NEVER() wi
2d370 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ll need to be re
2d380 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  moved. */.  if( 
2d390 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
2d3a0 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45  LUMN || NEVER(pE
2d3b0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2d3c0 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69  COLUMN) ){.    i
2d3d0 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
2d3e0 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70   SrcCount *p = p
2d3f0 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f  Walker->u.pSrcCo
2d400 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74  unt;.    SrcList
2d410 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
2d420 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d  ;.    int nSrc =
2d430 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53   pSrc ? pSrc->nS
2d440 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28  rc : 0;.    for(
2d450 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b  i=0; i<nSrc; i++
2d460 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ){.      if( pEx
2d470 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  pr->iTable==pSrc
2d480 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[i].iCursor )
2d490 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2d4a0 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a    if( i<nSrc ){.
2d4b0 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b        p->nThis++
2d4c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d4d0 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a     p->nOther++;.
2d4e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2d4f0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2d500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
2d510 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ine if any of th
2d520 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
2d530 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f  he pExpr Functio
2d540 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70  n reference.** p
2d550 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e  SrcList.  Return
2d560 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f   true if they do
2d570 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74  .  Also return t
2d580 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74  rue if the funct
2d590 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72  ion.** has no ar
2d5a0 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f  guments or has o
2d5b0 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  nly constant arg
2d5c0 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
2d5d0 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a  false if pExpr.*
2d5e0 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c  * references col
2d5f0 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c  umns but not col
2d600 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66  umns of tables f
2d610 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74  ound in pSrcList
2d620 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d630 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
2d640 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c  Src(Expr *pExpr,
2d650 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
2d660 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  st){.  Walker w;
2d670 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75  .  struct SrcCou
2d680 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74  nt cnt;.  assert
2d690 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2d6a0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
2d6b0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2d6c0 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74  k = exprSrcCount
2d6d0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2d6e0 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75  lback = 0;.  w.u
2d6f0 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e  .pSrcCount = &cn
2d700 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20  t;.  cnt.pSrc = 
2d710 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e  pSrcList;.  cnt.
2d720 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74  nThis = 0;.  cnt
2d730 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73  .nOther = 0;.  s
2d740 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
2d750 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e  st(&w, pExpr->x.
2d760 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
2d770 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20   cnt.nThis>0 || 
2d780 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d  cnt.nOther==0;.}
2d790 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
2d7a0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
2d7b0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2d7c0 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
2d7d0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
2d7e0 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
2d7f0 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
2d800 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
2d810 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
2d820 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
2d830 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69  gInfoColumn(sqli
2d840 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
2d850 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
2d860 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c  i;.  pInfo->aCol
2d870 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
2d880 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
2d890 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  db,.       pInfo
2d8a0 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73  ->aCol,.       s
2d8b0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f  izeof(pInfo->aCo
2d8c0 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70  l[0]),.       &p
2d8d0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20  Info->nColumn,. 
2d8e0 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
2d8f0 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
2d900 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
2d910 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
2d920 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2d930 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
2d940 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
2d950 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
2d960 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
2d970 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
2d980 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
2d990 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
2d9a0 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65  gInfoFunc(sqlite
2d9b0 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
2d9c0 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
2d9d0 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20  .  pInfo->aFunc 
2d9e0 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
2d9f0 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
2da00 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  b, .       pInfo
2da10 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->aFunc,.       
2da20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46  sizeof(pInfo->aF
2da30 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  unc[0]),.       
2da40 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20  &pInfo->nFunc,. 
2da50 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
2da60 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
2da70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
2da80 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  he xExprCallback
2da90 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b   for a tree walk
2daa0 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  er.  It is used 
2dab0 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
2dac0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2dad0 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20  zeAggregates(). 
2dae0 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
2daf0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2db00 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f  s.** for additio
2db10 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
2db20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2db30 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28  nalyzeAggregate(
2db40 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2db50 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2db60 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
2db70 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61  ntext *pNC = pWa
2db80 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50  lker->u.pNC;.  P
2db90 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
2dba0 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72  NC->pParse;.  Sr
2dbb0 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
2dbc0 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
2dbd0 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  .  AggInfo *pAgg
2dbe0 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e  Info = pNC->uNC.
2dbf0 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 61 73 73  pAggInfo;..  ass
2dc00 65 72 74 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67  ert( pNC->ncFlag
2dc10 73 20 26 20 4e 43 5f 55 41 67 67 49 6e 66 6f 20  s & NC_UAggInfo 
2dc20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  );.  switch( pEx
2dc30 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
2dc40 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
2dc50 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
2dc60 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  LUMN: {.      te
2dc70 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2dc80 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
2dc90 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2dca0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2dcb0 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
2dcc0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
2dcd0 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e if the column 
2dce0 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  is in one of the
2dcf0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
2dd00 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61  ROM.      ** cla
2dd10 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
2dd20 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  gate query */.  
2dd30 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
2dd40 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  SrcList!=0) ){. 
2dd50 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
2dd60 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2dd70 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
2dd80 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2dd90 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
2dda0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
2ddb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
2ddc0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
2ddd0 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
2dde0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2ddf0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
2de00 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
2de10 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
2de20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
2de30 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
2de40 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >iCursor ){.    
2de50 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
2de60 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
2de70 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
2de80 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f   pExpr refers to
2de90 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20   a table.       
2dea0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
2deb0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2dec0 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
2ded0 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20  ate query.  .   
2dee0 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
2def0 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20          ** Make 
2df00 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  an entry for the
2df10 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49   column in pAggI
2df20 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74  nfo->aCol[] if t
2df30 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
2df40 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e   ** is not an en
2df50 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64  try there alread
2df60 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
2df70 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
2df80 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
2df90 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f   pCol = pAggInfo
2dfa0 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
2dfb0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
2dfc0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
2dfd0 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; k++, pCol++){.
2dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2dff0 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d  ( pCol->iTable==
2e000 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
2e010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e020 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
2e030 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
2e040 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e050 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2e060 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e080 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67       if( (k>=pAg
2e090 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a  gInfo->nColumn).
2e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2e0b0 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43  (k = addAggInfoC
2e0c0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62  olumn(pParse->db
2e0d0 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20  , pAggInfo))>=0 
2e0e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
2e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2e100 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
2e110 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  aCol[k];.       
2e120 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
2e130 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  b = pExpr->y.pTa
2e140 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
2e150 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20   pCol->iTable = 
2e160 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
2e170 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2e180 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  l->iColumn = pEx
2e190 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
2e1a0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2e1b0 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
2e1c0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
2e1d0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
2e1e0 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  terColumn = -1;.
2e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2e200 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  ol->pExpr = pExp
2e210 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
2e220 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70   if( pAggInfo->p
2e230 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
2e240 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
2e250 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , n;.           
2e260 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
2e270 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70  GB = pAggInfo->p
2e280 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
2e290 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2e2a0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
2e2b0 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20  Term = pGB->a;. 
2e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
2e2d0 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20   = pGB->nExpr;. 
2e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
2e2f0 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
2e300 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
2e310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
2e320 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e  pr *pE = pTerm->
2e330 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
2e340 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d           if( pE-
2e350 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
2e360 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  & pE->iTable==pE
2e370 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
2e380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e390 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
2e3a0 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
2e3b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e3c0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
2e3d0 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  orterColumn = j;
2e3e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e3f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e420 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2e430 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2e440 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
2e450 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  rColumn<0 ){.   
2e460 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2e470 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
2e480 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f   = pAggInfo->nSo
2e490 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20  rtingColumn++;. 
2e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2e4b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e4c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72           /* Ther
2e4d0 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72  e is now an entr
2e4e0 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70  y for pExpr in p
2e4f0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
2e500 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20  (either.        
2e510 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69      ** because i
2e520 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f  t was there befo
2e530 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65  re or because we
2e540 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74   just created it
2e550 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
2e560 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45  * Convert the pE
2e570 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41  xpr to be a TK_A
2e580 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72  GG_COLUMN referr
2e590 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20  ing to that.    
2e5a0 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49          ** pAggI
2e5b0 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72  nfo->aCol[] entr
2e5c0 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
2e5d0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  /.            Ex
2e5e0 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2e5f0 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
2e600 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  uce);.          
2e610 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
2e620 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
2e630 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2e640 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c  >op = TK_AGG_COL
2e650 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UMN;.           
2e660 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
2e670 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20  i16)k;.         
2e680 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2e690 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
2e6a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
2e6b0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
2e6c0 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
2e6d0 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
2e6e0 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
2e6f0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2e700 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
2e710 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
2e720 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  CTION: {.      i
2e730 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  f( (pNC->ncFlags
2e740 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29   & NC_InAggFunc)
2e750 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 57  ==0.       && pW
2e760 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70  alker->walkerDep
2e770 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20  th==pExpr->op2. 
2e780 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2e790 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
2e7a0 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75  if pExpr is a du
2e7b0 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
2e7c0 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20  er aggregate .  
2e7d0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
2e7e0 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  n that is alread
2e7f0 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66  y in the pAggInf
2e800 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
2e810 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
2e820 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
2e830 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67  nc *pItem = pAgg
2e840 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20  Info->aFunc;.   
2e850 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2e860 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
2e870 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
2e880 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2e890 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2e8a0 28 30 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  (0, pItem->pExpr
2e8b0 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20  , pExpr, -1)==0 
2e8c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
2e8d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2e8e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2e8f0 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
2e900 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20  nfo->nFunc ){.  
2e910 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72          /* pExpr
2e920 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d   is original.  M
2e930 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ake a new entry 
2e940 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  in pAggInfo->aFu
2e950 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  nc[].          *
2e960 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  /.          u8 e
2e970 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
2e980 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >db);.          
2e990 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75  i = addAggInfoFu
2e9a0 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nc(pParse->db, p
2e9b0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2e9c0 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
2e9d0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
2e9e0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2e9f0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
2ea00 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2ea10 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d           pItem =
2ea20 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   &pAggInfo->aFun
2ea30 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  c[i];.          
2ea40 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
2ea50 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
2ea60 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20      pItem->iMem 
2ea70 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2ea80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
2ea90 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2eaa0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2eab0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
2eac0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2ead0 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >pFunc = sqlite3
2eae0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
2eaf0 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
2eb00 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2eb10 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20  r->u.zToken, .  
2eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb30 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
2eb40 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ? pExpr->x.pList
2eb50 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63  ->nExpr : 0, enc
2eb60 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2eb70 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
2eb80 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
2eb90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2eba0 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
2ebb0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
2ebc0 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b++;.           
2ebd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ebe0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
2ebf0 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
2ec00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ec10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ec20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
2ec30 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20   pExpr point to 
2ec40 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
2ec50 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2ec60 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20  ] entry.        
2ec70 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
2ec80 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2ec90 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
2eca0 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
2ecb0 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45  ed) );.        E
2ecc0 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
2ecd0 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
2ece0 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70  duce);.        p
2ecf0 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
2ed00 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78  6)i;.        pEx
2ed10 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
2ed20 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
2ed30 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2ed40 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
2ed50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
2ed60 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
2ed70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2ed80 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2ed90 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
2eda0 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
2edb0 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c  atesInSelect(Wal
2edc0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
2edd0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
2ede0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2edf0 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  ER(pSelect);.  p
2ee00 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65  Walker->walkerDe
2ee10 70 74 68 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  pth++;.  return 
2ee20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2ee30 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c  static void anal
2ee40 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
2ee50 65 6c 65 63 74 45 6e 64 28 57 61 6c 6b 65 72 20  electEnd(Walker 
2ee60 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
2ee70 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e   *pSelect){.  UN
2ee80 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2ee90 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b  Select);.  pWalk
2eea0 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2d  er->walkerDepth-
2eeb0 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  -;.}../*.** Anal
2eec0 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78  yze the pExpr ex
2eed0 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
2eee0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
2eef0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
2ef00 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
2ef10 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
2ef20 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f  ded to AggInfo o
2ef30 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e  bject that pNC->
2ef40 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e  pAggInfo.** poin
2ef50 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e  ts to.  Addition
2ef60 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d  al entries are m
2ef70 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e  ade on the AggIn
2ef80 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20  fo object as.** 
2ef90 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
2efa0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
2efb0 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
2efc0 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
2efd0 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
2efe0 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
2eff0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
2f000 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76  xprNames()..*/.v
2f010 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
2f020 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2f030 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
2f040 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
2f050 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
2f060 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2f070 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2f080 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  e;.  w.xSelectCa
2f090 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
2f0a0 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
2f0b0 63 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ct;.  w.xSelectC
2f0c0 61 6c 6c 62 61 63 6b 32 20 3d 20 61 6e 61 6c 79  allback2 = analy
2f0d0 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2f0e0 6c 65 63 74 45 6e 64 3b 0a 20 20 77 2e 77 61 6c  lectEnd;.  w.wal
2f0f0 6b 65 72 44 65 70 74 68 20 3d 20 30 3b 0a 20 20  kerDepth = 0;.  
2f100 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20  w.u.pNC = pNC;. 
2f110 20 77 2e 70 50 61 72 73 65 20 3d 20 30 3b 0a 20   w.pParse = 0;. 
2f120 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
2f130 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73  rcList!=0 );.  s
2f140 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
2f150 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  w, pExpr);.}../*
2f160 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
2f170 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2f180 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
2f190 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
2f1a0 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
2f1b0 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
2f1c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
2f1d0 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
2f1e0 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
2f1f0 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
2f200 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76   cut short..*/.v
2f210 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
2f220 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61  nalyzeAggList(Na
2f230 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
2f240 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
2f250 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
2f260 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2f270 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
2f280 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
2f290 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
2f2a0 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
2f2b0 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
2f2c0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
2f2d0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2f2e0 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74  regates(pNC, pIt
2f2f0 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
2f300 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
2f310 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65  llocate a single
2f320 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f   new register fo
2f330 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f  r use to hold so
2f340 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  me intermediate 
2f350 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73  result..*/.int s
2f360 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2f370 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
2f380 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2f390 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20  TempReg==0 ){.  
2f3a0 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73    return ++pPars
2f3b0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72  e->nMem;.  }.  r
2f3c0 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54  eturn pParse->aT
2f3d0 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d  empReg[--pParse-
2f3e0 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f  >nTempReg];.}../
2f3f0 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2f400 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69  a register, maki
2f410 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ng available for
2f420 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20   reuse for some 
2f430 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65  other.** purpose
2f440 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2f450 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2f460 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2f470 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20  nt iReg){.  if( 
2f480 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e  iReg && pParse->
2f490 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
2f4a0 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
2f4b0 52 65 67 29 20 29 7b 0a 20 20 20 20 70 50 61 72  Reg) ){.    pPar
2f4c0 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
2f4d0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
2f4e0 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
2f4f0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
2f500 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
2f510 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
2f520 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
2f530 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
2f540 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50  e3GetTempRange(P
2f550 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2f560 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
2f570 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  , n;.  if( nReg=
2f580 3d 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69  =1 ) return sqli
2f590 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
2f5a0 61 72 73 65 29 3b 0a 20 20 69 20 3d 20 70 50 61  arse);.  i = pPa
2f5b0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a  rse->iRangeReg;.
2f5c0 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52    n = pParse->nR
2f5d0 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e  angeReg;.  if( n
2f5e0 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 70 50  Reg<=n ){.    pP
2f5f0 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
2f600 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61  += nReg;.    pPa
2f610 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d  rse->nRangeReg -
2f620 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  = nReg;.  }else{
2f630 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d  .    i = pParse-
2f640 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
2f650 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
2f660 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
2f670 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  i;.}.void sqlite
2f680 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
2f690 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2f6a0 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
2f6b0 52 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67  Reg){.  if( nReg
2f6c0 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==1 ){.    sqlit
2f6d0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
2f6e0 28 70 50 61 72 73 65 2c 20 69 52 65 67 29 3b 0a  (pParse, iReg);.
2f6f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2f700 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73    if( nReg>pPars
2f710 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a  e->nRangeReg ){.
2f720 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
2f730 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20  geReg = nReg;.  
2f740 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
2f750 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  Reg = iReg;.  }.
2f760 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c  }../*.** Mark al
2f770 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  l temporary regi
2f780 73 74 65 72 73 20 61 73 20 62 65 69 6e 67 20 75  sters as being u
2f790 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72  navailable for r
2f7a0 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  euse..*/.void sq
2f7b0 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
2f7c0 67 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  gCache(Parse *pP
2f7d0 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
2f7e0 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  >nTempReg = 0;. 
2f7f0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2f800 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg = 0;.}../*.**
2f810 20 56 61 6c 69 64 61 74 65 20 74 68 61 74 20 6e   Validate that n
2f820 6f 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  o temporary regi
2f830 73 74 65 72 20 66 61 6c 6c 73 20 77 69 74 68 69  ster falls withi
2f840 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a  n the range of.*
2f850 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c  * iFirst..iLast,
2f860 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 54 68 69   inclusive.  Thi
2f870 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
2f880 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74 68  y call from with
2f890 69 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73  in assert().** s
2f8a0 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69  tatements..*/.#i
2f8b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2f8c0 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 54  G.int sqlite3NoT
2f8d0 65 6d 70 73 49 6e 52 61 6e 67 65 28 50 61 72 73  empsInRange(Pars
2f8e0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
2f8f0 46 69 72 73 74 2c 20 69 6e 74 20 69 4c 61 73 74  First, int iLast
2f900 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
2f910 28 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  ( pParse->nRange
2f920 52 65 67 3e 30 0a 20 20 20 26 26 20 70 50 61 72  Reg>0.   && pPar
2f930 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70 50  se->iRangeReg+pP
2f940 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2f950 3e 20 69 46 69 72 73 74 0a 20 20 20 26 26 20 70  > iFirst.   && p
2f960 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2f970 20 3c 3d 20 69 4c 61 73 74 0a 20 20 29 7b 0a 20   <= iLast.  ){. 
2f980 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2f990 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
2f9a0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b  Parse->nTempReg;
2f9b0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
2f9c0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2f9d0 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50  i]>=iFirst && pP
2f9e0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69  arse->aTempReg[i
2f9f0 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20  ]<=iLast ){.    
2fa00 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
2fa10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
2fa20 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2fa30 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a        LITE_DEBUG */.