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

Artifact 33267aaf04145af9f1f06c1f4c10f8e7a9acce1c681d75526e6a3fa7e58c1d79:


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 7c 45 50 5f 46   EP_WinFunc|EP_F
8590: 69 6c 74 65 72 29 20 29 3b 0a 23 69 66 64 65 66  ilter) );.#ifdef
85a0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
85b0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
85c0: 72 74 79 28 70 2c 20 45 50 5f 4c 65 61 66 29 20  rty(p, EP_Leaf) 
85d0: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
85e0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
85f0: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 61 73 73 65  nly) ){.    asse
8600: 72 74 28 20 70 2d 3e 70 4c 65 66 74 3d 3d 30 20  rt( p->pLeft==0 
8610: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
8620: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
8630: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e     assert( p->x.
8640: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
8650: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  }.#endif.  if( !
8660: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8670: 70 2c 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  p, (EP_TokenOnly
8680: 7c 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20  |EP_Leaf)) ){.  
8690: 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20    /* The Expr.x 
86a0: 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75  union is never u
86b0: 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65 20  sed at the same 
86c0: 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69  time as Expr.pRi
86d0: 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ght */.    asser
86e0: 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30  t( p->x.pList==0
86f0: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30   || p->pRight==0
8700: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   );.    if( p->p
8710: 4c 65 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d 54  Left && p->op!=T
8720: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
8730: 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  ) sqlite3ExprDel
8740: 65 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c 65  eteNN(db, p->pLe
8750: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ft);.    if( p->
8760: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
8770: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8780: 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  eNN(db, p->pRigh
8790: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
87a0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
87b0: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
87c0: 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
87d0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
87e0: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
87f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8800: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
8810: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
8820: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
8830: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8840: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
8850: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
8860: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69  roperty(p, EP_Wi
8870: 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  nFunc) ){.      
8880: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
8890: 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 21 45  K_FUNCTION && !E
88a0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
88b0: 2c 20 45 50 5f 46 69 6c 74 65 72 29 20 29 3b 0a  , EP_Filter) );.
88c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e        sqlite3Win
88d0: 64 6f 77 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  dowDelete(db, p-
88e0: 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20 20 7d 65  >y.pWin);.    }e
88f0: 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50  lse if( ExprHasP
8900: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 69  roperty(p, EP_Fi
8910: 6c 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61  lter) ){.      a
8920: 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
8930: 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 70 2d 3e  _FUNCTION || p->
8940: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
8950: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ION );.      sql
8960: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
8970: 62 2c 20 70 2d 3e 79 2e 70 46 69 6c 74 65 72 29  b, p->y.pFilter)
8980: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8990: 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73   }.  if( ExprHas
89a0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
89b0: 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74  emToken) ) sqlit
89c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
89d0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  u.zToken);.  if(
89e0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
89f0: 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20  y(p, EP_Static) 
8a00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
8a10: 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20  FreeNN(db, p);. 
8a20: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
8a30: 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69  3ExprDelete(sqli
8a40: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
8a50: 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71 6c  ){.  if( p ) sql
8a60: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e  ite3ExprDeleteNN
8a70: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 20 49  (db, p);.}../* I
8a80: 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 52 65 6e  nvoke sqlite3Ren
8a90: 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 29 20 61  ameExprUnmap() a
8aa0: 6e 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  nd sqlite3ExprDe
8ab0: 6c 65 74 65 28 29 20 6f 6e 20 74 68 65 0a 2a 2a  lete() on the.**
8ac0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
8ad0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8ae0: 55 6e 6d 61 70 41 6e 64 44 65 6c 65 74 65 28 50  UnmapAndDelete(P
8af0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
8b00: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  pr *p){.  if( p 
8b10: 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45  ){.    if( IN_RE
8b20: 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
8b30: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61       sqlite3Rena
8b40: 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50 61 72  meExprUnmap(pPar
8b50: 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  se, p);.    }.  
8b60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8b70: 65 74 65 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62  eteNN(pParse->db
8b80: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
8b90: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
8ba0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
8bb0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
8bc0: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
8bd0: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
8be0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
8bf0: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
8c00: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
8c10: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
8c20: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
8c30: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
8c40: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
8c50: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
8c60: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
8c70: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
8c80: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
8c90: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
8ca0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8cb0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
8cc0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
8cd0: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
8ce0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8cf0: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
8d00: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
8d10: 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6d 70  ** Copy the comp
8d20: 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
8d30: 61 6e 20 45 78 70 72 20 6e 6f 64 65 2c 20 74 61  an Expr node, ta
8d40: 6b 69 6e 67 20 63 61 72 65 20 6e 6f 74 20 74 6f  king care not to
8d50: 20 72 65 61 64 0a 2a 2a 20 70 61 73 74 20 74 68   read.** past th
8d60: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74 72  e end of the str
8d70: 75 63 74 75 72 65 20 66 6f 72 20 61 20 72 65 64  ucture for a red
8d80: 75 63 65 64 2d 73 69 7a 65 20 76 65 72 73 69 6f  uced-size versio
8d90: 6e 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 0a  n of the source.
8da0: 2a 2a 20 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74  ** Expr..*/.stat
8db0: 69 63 20 76 6f 69 64 20 65 78 70 72 4e 6f 64 65  ic void exprNode
8dc0: 43 6f 70 79 28 45 78 70 72 20 2a 70 44 65 73 74  Copy(Expr *pDest
8dd0: 2c 20 45 78 70 72 20 2a 70 53 72 63 29 7b 0a 20  , Expr *pSrc){. 
8de0: 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
8df0: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
8e00: 0a 20 20 6d 65 6d 63 70 79 28 70 44 65 73 74 2c  .  memcpy(pDest,
8e10: 20 70 53 72 63 2c 20 65 78 70 72 53 74 72 75 63   pSrc, exprStruc
8e20: 74 53 69 7a 65 28 70 53 72 63 29 29 3b 0a 7d 0a  tSize(pSrc));.}.
8e30: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64  ./*.** The duped
8e40: 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75 74  Expr*Size() rout
8e50: 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72 6e  ines each return
8e60: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
8e70: 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a 2a  ytes required.**
8e80: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70 79   to store a copy
8e90: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
8ea0: 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  n or expression 
8eb0: 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66 66  tree.  They diff
8ec0: 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63  er in.** how muc
8ed0: 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69 73  h of the tree is
8ee0: 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a   measured..**.**
8ef0: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53 74       dupedExprSt
8f00: 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20 53  ructSize()     S
8f10: 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20  ize of only the 
8f20: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 0a  Expr structure .
8f30: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
8f40: 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20 20  NodeSize()      
8f50: 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b 20   Size of Expr + 
8f60: 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a  space for token.
8f70: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
8f80: 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20 20  Size()          
8f90: 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20   Expr + token + 
8fa0: 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e  subtree componen
8fb0: 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ts.**.**********
8fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9000: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  *.**.** The dupe
9010: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
9020: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
9030: 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f 52  ns two values OR
9040: 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20 0a  -ed together:  .
9050: 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63 65  ** (1) the space
9060: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 20   required for a 
9070: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
9080: 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 20   structure only 
9090: 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65 20  and .** (2) the 
90a0: 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68 61  EP_xxx flags tha
90b0: 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20  t indicate what 
90c0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73 69  the structure si
90d0: 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a  ze should be..**
90e0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
90f0: 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  es is always one
9100: 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   of:.**.**      
9110: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a  EXPR_FULLSIZE.**
9120: 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55 43        EXPR_REDUC
9130: 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52 65  EDSIZE   | EP_Re
9140: 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45 58  duced.**      EX
9150: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
9160: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a   | EP_TokenOnly.
9170: 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  **.** The size o
9180: 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
9190: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
91a0: 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74 75  masking the retu
91b0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  rn value.** of t
91c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
91d0: 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c 61   0xfff.  The fla
91e0: 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  gs can be found 
91f0: 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a  by masking the.*
9200: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77  * return value w
9210: 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ith EP_Reduced|E
9220: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a  P_TokenOnly..**.
9230: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69 74  ** Note that wit
9240: 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  h flags==EXPRDUP
9250: 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72 6f  _REDUCE, this ro
9260: 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20  utines works on 
9270: 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e  full-size.** (un
9280: 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f 62  reduced) Expr ob
9290: 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f 72  jects as they or
92a0: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73   originally cons
92b0: 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20 70  tructed by the p
92c0: 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67  arser..** During
92d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
92e0: 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66 6f  ysis, extra info
92f0: 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75  rmation is compu
9300: 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e  ted and moved in
9310: 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72 74  to.** later part
9320: 73 20 6f 66 20 74 68 65 20 45 78 70 72 20 6f 62  s of the Expr ob
9330: 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65 78  ject and that ex
9340: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
9350: 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70 65  might get choppe
9360: 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65 20  d.** off if the 
9370: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
9380: 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73  duced.  Note als
9390: 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  o that it does n
93a0: 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61  ot work to.** ma
93b0: 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f 52 45  ke an EXPRDUP_RE
93c0: 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72  DUCE copy of a r
93d0: 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69 6f  educed expressio
93e0: 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c  n.  It is only l
93f0: 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63  egal.** to reduc
9400: 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78 70  e a pristine exp
9410: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f  ression tree fro
9420: 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 54  m the parser.  T
9430: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
9440: 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70  n.** of dupedExp
9450: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f  rStructSize() co
9460: 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61  ntain multiple a
9470: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
9480: 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a  ts that attempt.
9490: 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ** to enforce th
94a0: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a  is constraint..*
94b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
94c0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
94d0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
94e0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a  ags){.  int nSiz
94f0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  e;.  assert( fla
9500: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
9510: 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29  CE || flags==0 )
9520: 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c  ; /* Only one fl
9530: 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64  ag value allowed
9540: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45 58   */.  assert( EX
9550: 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66  PR_FULLSIZE<=0xf
9560: 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ff );.  assert( 
9570: 28 30 78 66 66 66 20 26 20 28 45 50 5f 52 65 64  (0xfff & (EP_Red
9580: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
9590: 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  y))==0 );.  if( 
95a0: 30 3d 3d 66 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f  0==flags || p->o
95b0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
95c0: 55 4d 4e 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  UMN .#ifndef SQL
95d0: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
95e0: 55 4e 43 0a 20 20 20 7c 7c 20 45 78 70 72 48 61  UNC.   || ExprHa
95f0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9600: 57 69 6e 46 75 6e 63 29 0a 23 65 6e 64 69 66 0a  WinFunc).#endif.
9610: 20 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d    ){.    nSize =
9620: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
9630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
9640: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
9650: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
9660: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
9670: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
9680: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
9690: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
96a0: 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74  ) ); .    assert
96b0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
96c0: 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65  ty(p, EP_MemToke
96d0: 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  n) );.    assert
96e0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
96f0: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
9700: 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  e) );.    if( p-
9710: 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70  >pLeft || p->x.p
9720: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53  List ){.      nS
9730: 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43  ize = EXPR_REDUC
9740: 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75  EDSIZE | EP_Redu
9750: 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ced;.    }else{.
9760: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9770: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
9780: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
9790: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
97a0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20   EP_TokenOnly;. 
97b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
97c0: 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nSize;.}../*.*
97d0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
97e0: 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61 63  returns the spac
97f0: 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75 69  e in bytes requi
9800: 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  red to store the
9810: 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65   copy .** of the
9820: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
9830: 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68  and a copy of th
9840: 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  e Expr.u.zToken 
9850: 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a  string (if that.
9860: 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65 66  ** string is def
9870: 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ined.).*/.static
9880: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f   int dupedExprNo
9890: 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  deSize(Expr *p, 
98a0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
98b0: 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45  t nByte = dupedE
98c0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
98d0: 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b   flags) & 0xfff;
98e0: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
98f0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
9900: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
9910: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42  zToken ){.    nB
9920: 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
9930: 72 6c 65 6e 33 30 4e 4e 28 70 2d 3e 75 2e 7a 54  rlen30NN(p->u.zT
9940: 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72  oken)+1;.  }.  r
9950: 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79  eturn ROUND8(nBy
9960: 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  te);.}../*.** Re
9970: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
9980: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
9990: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75  d to create a du
99a0: 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a  plicate of the .
99b0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  ** expression pa
99c0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
99d0: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  t argument. The 
99e0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
99f0: 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e  is a.** mask con
9a00: 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f  taining EXPRDUP_
9a10: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  XXX flags..**.**
9a20: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
9a30: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61  ned includes spa
9a40: 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63  ce to create a c
9a50: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20  opy of the Expr 
9a60: 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66  struct.** itself
9a70: 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20   and the buffer 
9a80: 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45  referred to by E
9a90: 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66  xpr.u.zToken, if
9aa0: 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   any..**.** If t
9ab0: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
9ac0: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
9ad0: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
9ae0: 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a  alue includes .*
9af0: 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69  * space to dupli
9b00: 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f  cate all Expr no
9b10: 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20  des in the tree 
9b20: 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70  formed by Expr.p
9b30: 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70  Left .** and Exp
9b40: 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c  r.pRight variabl
9b50: 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20  es (but not for 
9b60: 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70  any structures p
9b70: 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a  ointed to or .**
9b80: 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20   descended from 
9b90: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
9ba0: 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65   or Expr.x.pSele
9bb0: 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a  ct variables)..*
9bc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
9bd0: 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20  edExprSize(Expr 
9be0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
9bf0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b    int nByte = 0;
9c00: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
9c10: 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70  nByte = dupedExp
9c20: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61  rNodeSize(p, fla
9c30: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  gs);.    if( fla
9c40: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
9c50: 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  E ){.      nByte
9c60: 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a   += dupedExprSiz
9c70: 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67  e(p->pLeft, flag
9c80: 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69  s) + dupedExprSi
9c90: 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c  ze(p->pRight, fl
9ca0: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ags);.    }.  }.
9cb0: 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a    return nByte;.
9cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
9cd0: 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
9ce0: 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  r to sqlite3Expr
9cf0: 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68  Dup(), except th
9d00: 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a  at if pzBuffer .
9d10: 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  ** is not NULL t
9d20: 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73  hen *pzBuffer is
9d30: 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e   assumed to poin
9d40: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61  t to a buffer la
9d50: 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74  rge enough .** t
9d60: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
9d70: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
9d80: 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  , the copies of 
9d90: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28  p->u.zToken.** (
9da0: 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20  if applicable), 
9db0: 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f  and the copies o
9dc0: 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61  f the p->pLeft a
9dd0: 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70  nd p->pRight exp
9de0: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20  ressions,.** if 
9df0: 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75  any. Before retu
9e00: 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72  rning, *pzBuffer
9e10: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66   is set to the f
9e20: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
9e30: 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66  he.** portion of
9e40: 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70 69   the buffer copi
9e50: 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20  ed into by this 
9e60: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
9e70: 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44 75  tic Expr *exprDu
9e80: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
9e90: 78 70 72 20 2a 70 2c 20 69 6e 74 20 64 75 70 46  xpr *p, int dupF
9ea0: 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66  lags, u8 **pzBuf
9eb0: 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  fer){.  Expr *pN
9ec0: 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ew;           /*
9ed0: 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
9ee0: 20 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63   */.  u8 *zAlloc
9ef0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ;           /* M
9f00: 65 6d 6f 72 79 20 73 70 61 63 65 20 66 72 6f 6d  emory space from
9f10: 20 77 68 69 63 68 20 74 6f 20 62 75 69 6c 64 20   which to build 
9f20: 45 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Expr object */. 
9f30: 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67 3b   u32 staticFlag;
9f40: 20 20 20 20 20 20 20 2f 2a 20 45 50 5f 53 74 61         /* EP_Sta
9f50: 74 69 63 20 69 66 20 73 70 61 63 65 20 6e 6f 74  tic if space not
9f60: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
9f70: 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65  alloc */..  asse
9f80: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61  rt( db!=0 );.  a
9f90: 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73  ssert( p );.  as
9fa0: 73 65 72 74 28 20 64 75 70 46 6c 61 67 73 3d 3d  sert( dupFlags==
9fb0: 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45  0 || dupFlags==E
9fc0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b  XPRDUP_REDUCE );
9fd0: 0a 20 20 61 73 73 65 72 74 28 20 70 7a 42 75 66  .  assert( pzBuf
9fe0: 66 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61  fer==0 || dupFla
9ff0: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
a000: 43 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  CE );..  /* Figu
a010: 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f 20  re out where to 
a020: 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 45 78  write the new Ex
a030: 70 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  pr structure. */
a040: 0a 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20  .  if( pzBuffer 
a050: 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20  ){.    zAlloc = 
a060: 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 73  *pzBuffer;.    s
a070: 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53  taticFlag = EP_S
a080: 74 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tatic;.  }else{.
a090: 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c      zAlloc = sql
a0a0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
a0b0: 4e 28 64 62 2c 20 64 75 70 65 64 45 78 70 72 53  N(db, dupedExprS
a0c0: 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29  ize(p, dupFlags)
a0d0: 29 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61  );.    staticFla
a0e0: 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  g = 0;.  }.  pNe
a0f0: 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c  w = (Expr *)zAll
a100: 6f 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 20  oc;..  if( pNew 
a110: 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e  ){.    /* Set nN
a120: 65 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  ewSize to the si
a130: 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ze allocated for
a140: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
a150: 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a  ointed to.    **
a160: 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69   by pNew. This i
a170: 73 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55  s either EXPR_FU
a180: 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44  LLSIZE, EXPR_RED
a190: 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20  UCEDSIZE or.    
a1a0: 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  ** EXPR_TOKENONL
a1b0: 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73  YSIZE. nToken is
a1c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
a1d0: 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73  er of bytes cons
a1e0: 75 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  umed.    ** by t
a1f0: 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70  he copy of the p
a200: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
a210: 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  g (if any)..    
a220: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  */.    const uns
a230: 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a  igned nStructSiz
a240: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
a250: 75 63 74 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  uctSize(p, dupFl
a260: 61 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ags);.    const 
a270: 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e  int nNewSize = n
a280: 53 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66  StructSize & 0xf
a290: 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b  ff;.    int nTok
a2a0: 65 6e 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70  en;.    if( !Exp
a2b0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
a2c0: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20  EP_IntValue) && 
a2d0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  p->u.zToken ){. 
a2e0: 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71       nToken = sq
a2f0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
a300: 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a  >u.zToken) + 1;.
a310: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a320: 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20   nToken = 0;.   
a330: 20 7d 0a 20 20 20 20 69 66 28 20 64 75 70 46 6c   }.    if( dupFl
a340: 61 67 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ags ){.      ass
a350: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
a360: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
a370: 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ed)==0 );.      
a380: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
a390: 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20  , nNewSize);.   
a3a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33   }else{.      u3
a3b0: 32 20 6e 53 69 7a 65 20 3d 20 28 75 33 32 29 65  2 nSize = (u32)e
a3c0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29  xprStructSize(p)
a3d0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
a3e0: 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29  Alloc, p, nSize)
a3f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 69 7a  ;.      if( nSiz
a400: 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20  e<EXPR_FULLSIZE 
a410: 29 7b 20 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  ){ .        mems
a420: 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65  et(&zAlloc[nSize
a430: 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53  ], 0, EXPR_FULLS
a440: 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20  IZE-nSize);.    
a450: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
a460: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65 64  * Set the EP_Red
a470: 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  uced, EP_TokenOn
a480: 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74 69  ly, and EP_Stati
a490: 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69  c flags appropri
a4a0: 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e  ately. */.    pN
a4b0: 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45  ew->flags &= ~(E
a4c0: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
a4d0: 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63  enOnly|EP_Static
a4e0: 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20  |EP_MemToken);. 
a4f0: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
a500: 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20  = nStructSize & 
a510: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
a520: 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70  okenOnly);.    p
a530: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74  New->flags |= st
a540: 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f  aticFlag;..    /
a550: 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e  * Copy the p->u.
a560: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69  zToken string, i
a570: 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66  f any. */.    if
a580: 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( nToken ){.    
a590: 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d    char *zToken =
a5a0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
a5b0: 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63  = (char*)&zAlloc
a5c0: 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20  [nNewSize];.    
a5d0: 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c    memcpy(zToken,
a5e0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54   p->u.zToken, nT
a5f0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  oken);.    }..  
a600: 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c    if( 0==((p->fl
a610: 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29  ags|pNew->flags)
a620: 20 26 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79   & (EP_TokenOnly
a630: 7c 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20  |EP_Leaf)) ){.  
a640: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
a650: 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65  he pNew->x.pSele
a660: 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c  ct or pNew->x.pL
a670: 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20  ist member. */. 
a680: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
a690: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
a6a0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
a6b0: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65       pNew->x.pSe
a6c0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
a6d0: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78  lectDup(db, p->x
a6e0: 2e 70 53 65 6c 65 63 74 2c 20 64 75 70 46 6c 61  .pSelect, dupFla
a6f0: 67 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  gs);.      }else
a700: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a710: 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  x.pList = sqlite
a720: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
a730: 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70   p->x.pList, dup
a740: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a  Flags);.      }.
a750: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69      }..    /* Fi
a760: 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66  ll in pNew->pLef
a770: 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67  t and pNew->pRig
a780: 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 45  ht. */.    if( E
a790: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a7a0: 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c  New, EP_Reduced|
a7b0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
a7c0: 57 69 6e 46 75 6e 63 7c 45 50 5f 46 69 6c 74 65  WinFunc|EP_Filte
a7d0: 72 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  r) ){.      zAll
a7e0: 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e  oc += dupedExprN
a7f0: 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  odeSize(p, dupFl
a800: 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
a810: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a820: 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f  (pNew, EP_TokenO
a830: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
a840: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
a850: 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f  eft = p->pLeft ?
a860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a870: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a880: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50  b, p->pLeft, EXP
a890: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
a8a0: 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20  lloc) : 0;.     
a8b0: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
a8c0: 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20  = p->pRight ?.  
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8e0: 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c       exprDup(db,
a8f0: 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52   p->pRight, EXPR
a900: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
a910: 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  loc) : 0;.      
a920: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
a930: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
a940: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
a950: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
a960: 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20  _WinFunc) ){.   
a970: 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70 57 69       pNew->y.pWi
a980: 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  n = sqlite3Windo
a990: 77 44 75 70 28 64 62 2c 20 70 4e 65 77 2c 20 70  wDup(db, pNew, p
a9a0: 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20 20 20  ->y.pWin);.     
a9b0: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
a9c0: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
a9d0: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a   EP_WinFunc) );.
a9e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a9f0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
aa00: 79 28 70 2c 20 45 50 5f 46 69 6c 74 65 72 29 20  y(p, EP_Filter) 
aa10: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
aa20: 3e 79 2e 70 46 69 6c 74 65 72 20 3d 20 73 71 6c  >y.pFilter = sql
aa30: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
aa40: 70 2d 3e 79 2e 70 46 69 6c 74 65 72 2c 20 30 29  p->y.pFilter, 0)
aa50: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
aa60: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
aa70: 79 28 70 4e 65 77 2c 20 45 50 5f 46 69 6c 74 65  y(pNew, EP_Filte
aa80: 72 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  r) );.      }.#e
aa90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
aaa0: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a  MIT_WINDOWFUNC *
aab0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 7a 42 75  /.      if( pzBu
aac0: 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ffer ){.        
aad0: 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c  *pzBuffer = zAll
aae0: 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  oc;.      }.    
aaf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
ab00: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
ab10: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
ab20: 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20  y|EP_Leaf) ){.  
ab30: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
ab40: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op==TK_SELECT_CO
ab50: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
ab60: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
ab70: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
ab80: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
ab90: 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e  Column==0 || p->
aba0: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
abb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
abc0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20  ->pRight==0  || 
abd0: 70 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c  p->pRight==p->pL
abe0: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  eft );.        }
abf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ac00: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71  pNew->pLeft = sq
ac10: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
ac20: 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20   p->pLeft, 0);. 
ac30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ac40: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
ac50: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
ac60: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29  b, p->pRight, 0)
ac70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ac80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
ac90: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  w;.}../*.** Crea
aca0: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
acb0: 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65  deep copy of the
acc0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
acd0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
ace0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e   argument. If an
acf0: 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69   OOM condition i
ad00: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e  s encountered, N
ad10: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ULL is returned.
ad20: 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d  ** and the db->m
ad30: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
ad40: 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   set..*/.#ifndef
ad50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
ad60: 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69  .static With *wi
ad70: 74 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  thDup(sqlite3 *d
ad80: 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57  b, With *p){.  W
ad90: 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  ith *pRet = 0;. 
ada0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71   if( p ){.    sq
adb0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
adc0: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
add0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29   sizeof(p->a[0])
ade0: 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a   * (p->nCte-1);.
adf0: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
ae00: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
ae10: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  b, nByte);.    i
ae20: 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
ae30: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 52   int i;.      pR
ae40: 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43  et->nCte = p->nC
ae50: 74 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  te;.      for(i=
ae60: 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b  0; i<p->nCte; i+
ae70: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74  +){.        pRet
ae80: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[i].pSelect =
ae90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
aea0: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53  p(db, p->a[i].pS
aeb0: 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
aec0: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43     pRet->a[i].pC
aed0: 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ols = sqlite3Exp
aee0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
aef0: 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a  a[i].pCols, 0);.
af00: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
af10: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
af20: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
af30: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
af40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
af50: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
af60: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
af70: 20 77 69 74 68 44 75 70 28 78 2c 79 29 20 30 0a   withDup(x,y) 0.
af80: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
af90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
afa0: 4f 57 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 54 68 65  OWFUNC./*.** The
afb0: 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e   gatherSelectWin
afc0: 64 6f 77 73 28 29 20 70 72 6f 63 65 64 75 72 65  dows() procedure
afd0: 20 61 6e 64 20 69 74 73 20 68 65 6c 70 65 72 20   and its helper 
afe0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 67 61 74 68 65  routine.** gathe
aff0: 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 43 61  rSelectWindowsCa
b000: 6c 6c 62 61 63 6b 28 29 20 61 72 65 20 75 73 65  llback() are use
b010: 64 20 74 6f 20 73 63 61 6e 20 61 6c 6c 20 74 68  d to scan all th
b020: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  e expressions.**
b030: 20 61 6e 20 61 20 6e 65 77 6c 79 20 64 75 70 6c   an a newly dupl
b040: 69 63 61 74 65 64 20 53 45 4c 45 43 54 20 73 74  icated SELECT st
b050: 61 74 65 6d 65 6e 74 20 61 6e 64 20 67 61 74 68  atement and gath
b060: 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 69  er all of the Wi
b070: 6e 64 6f 77 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ndow.** objects 
b080: 66 6f 75 6e 64 20 74 68 65 72 65 2c 20 61 73 73  found there, ass
b090: 65 6d 62 6c 69 6e 67 20 74 68 65 6d 20 6f 6e 74  embling them ont
b0a0: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
b0b0: 74 20 61 74 20 53 65 6c 65 63 74 2d 3e 70 57 69  t at Select->pWi
b0c0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b0d0: 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e   gatherSelectWin
b0e0: 64 6f 77 73 43 61 6c 6c 62 61 63 6b 28 57 61 6c  dowsCallback(Wal
b0f0: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
b100: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66  pr *pExpr){.  if
b110: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
b120: 46 55 4e 43 54 49 4f 4e 20 26 26 20 45 78 70 72  FUNCTION && Expr
b130: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
b140: 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  r, EP_WinFunc) )
b150: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
b160: 78 70 72 2d 3e 79 2e 70 57 69 6e 20 29 3b 0a 20  xpr->y.pWin );. 
b170: 20 20 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e     pExpr->y.pWin
b180: 2d 3e 70 4e 65 78 74 57 69 6e 20 3d 20 70 57 61  ->pNextWin = pWa
b190: 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 2d  lker->u.pSelect-
b1a0: 3e 70 57 69 6e 3b 0a 20 20 20 20 70 57 61 6c 6b  >pWin;.    pWalk
b1b0: 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 2d 3e 70  er->u.pSelect->p
b1c0: 57 69 6e 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70  Win = pExpr->y.p
b1d0: 57 69 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Win;.  }.  retur
b1e0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
b1f0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 67 61 74  }.static int gat
b200: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
b210: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 28 57  SelectCallback(W
b220: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
b230: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 72 65  Select *p){.  re
b240: 74 75 72 6e 20 70 3d 3d 70 57 61 6c 6b 65 72 2d  turn p==pWalker-
b250: 3e 75 2e 70 53 65 6c 65 63 74 20 3f 20 57 52 43  >u.pSelect ? WRC
b260: 5f 43 6f 6e 74 69 6e 75 65 20 3a 20 57 52 43 5f  _Continue : WRC_
b270: 50 72 75 6e 65 3b 0a 7d 0a 73 74 61 74 69 63 20  Prune;.}.static 
b280: 76 6f 69 64 20 67 61 74 68 65 72 53 65 6c 65 63  void gatherSelec
b290: 74 57 69 6e 64 6f 77 73 28 53 65 6c 65 63 74 20  tWindows(Select 
b2a0: 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  *p){.  Walker w;
b2b0: 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
b2c0: 63 6b 20 3d 20 67 61 74 68 65 72 53 65 6c 65 63  ck = gatherSelec
b2d0: 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63 6b  tWindowsCallback
b2e0: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
b2f0: 6c 62 61 63 6b 20 3d 20 67 61 74 68 65 72 53 65  lback = gatherSe
b300: 6c 65 63 74 57 69 6e 64 6f 77 73 53 65 6c 65 63  lectWindowsSelec
b310: 74 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 77 2e 78  tCallback;.  w.x
b320: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
b330: 3d 20 30 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  = 0;.  w.pParse 
b340: 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 65 6c 65  = 0;.  w.u.pSele
b350: 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  ct = p;.  sqlite
b360: 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
b370: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  p);.}.#endif.../
b380: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
b390: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
b3a0: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
b3b0: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
b3c0: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
b3d0: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
b3e0: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
b3f0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
b400: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
b410: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
b420: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
b430: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
b440: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
b450: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
b460: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
b470: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
b480: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
b490: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
b4a0: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
b4b0: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
b4c0: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
b4d0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
b4e0: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
b4f0: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
b500: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
b510: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
b520: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
b530: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
b540: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
b550: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
b560: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
b570: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
b580: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
b590: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
b5a0: 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
b5b0: 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69  ains a combinati
b5c0: 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55  on of the EXPRDU
b5d0: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20  P_XXX flags..** 
b5e0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
b5f0: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
b600: 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75  t, then the stru
b610: 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69  cture returned i
b620: 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64  s a.** truncated
b630: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
b640: 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63  usual Expr struc
b650: 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
b660: 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70  e stored as.** p
b670: 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  art of the in-me
b680: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
b690: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
b6a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45  ase schema..*/.E
b6b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
b6c0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
b6d0: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
b6e0: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
b6f0: 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
b700: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
b710: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20  E );.  return p 
b720: 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c  ? exprDup(db, p,
b730: 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a   flags, 0) : 0;.
b740: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
b750: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73  te3ExprListDup(s
b760: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
b770: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
b780: 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  gs){.  ExprList 
b790: 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20  *pNew;.  struct 
b7a0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
b7b0: 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b  Item, *pOldItem;
b7c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
b7d0: 20 2a 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f   *pPriorSelectCo
b7e0: 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  l = 0;.  assert(
b7f0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
b800: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
b810: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
b820: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
b830: 62 2c 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  b, sqlite3DbMall
b840: 6f 63 53 69 7a 65 28 64 62 2c 20 70 29 29 3b 0a  ocSize(db, p));.
b850: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
b860: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
b870: 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78  ->nExpr = p->nEx
b880: 70 72 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e  pr;.  pItem = pN
b890: 65 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65  ew->a;.  pOldIte
b8a0: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
b8b0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
b8c0: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
b8d0: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
b8e0: 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d  Expr *pOldExpr =
b8f0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
b900: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  ;.    Expr *pNew
b910: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
b920: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
b930: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
b940: 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Expr, flags);.  
b950: 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 20 0a    if( pOldExpr .
b960: 20 20 20 20 20 26 26 20 70 4f 6c 64 45 78 70 72       && pOldExpr
b970: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
b980: 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 28  COLUMN.     && (
b990: 70 4e 65 77 45 78 70 72 20 3d 20 70 49 74 65 6d  pNewExpr = pItem
b9a0: 2d 3e 70 45 78 70 72 29 21 3d 30 20 0a 20 20 20  ->pExpr)!=0 .   
b9b0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
b9c0: 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c  ( pNewExpr->iCol
b9d0: 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b  umn==0 || i>0 );
b9e0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 45  .      if( pNewE
b9f0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20  xpr->iColumn==0 
ba00: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
ba10: 74 28 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65  t( pOldExpr->pLe
ba20: 66 74 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52  ft==pOldExpr->pR
ba30: 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 20 20  ight );.        
ba40: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20  pPriorSelectCol 
ba50: 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66  = pNewExpr->pLef
ba60: 74 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 52  t = pNewExpr->pR
ba70: 69 67 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ight;.      }els
ba80: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
ba90: 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  t( i>0 );.      
baa0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 5b    assert( pItem[
bab0: 2d 31 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a  -1].pExpr!=0 );.
bac0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
bad0: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
bae0: 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78  n==pItem[-1].pEx
baf0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b  pr->iColumn+1 );
bb00: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
bb10: 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c   pPriorSelectCol
bb20: 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70  ==pItem[-1].pExp
bb30: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  r->pLeft );.    
bb40: 20 20 20 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c      pNewExpr->pL
bb50: 65 66 74 20 3d 20 70 50 72 69 6f 72 53 65 6c 65  eft = pPriorSele
bb60: 63 74 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  ctCol;.      }. 
bb70: 20 20 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e     }.    pItem->
bb80: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
bb90: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
bba0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
bbb0: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
bbc0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
bbd0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
bbe0: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
bbf0: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  ->sortOrder = pO
bc00: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  ldItem->sortOrde
bc10: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  r;.    pItem->do
bc20: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ne = 0;.    pIte
bc30: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  m->bSpanIsTab = 
bc40: 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49  pOldItem->bSpanI
bc50: 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d  sTab;.    pItem-
bc60: 3e 62 53 6f 72 74 65 72 52 65 66 20 3d 20 70 4f  >bSorterRef = pO
bc70: 6c 64 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52  ldItem->bSorterR
bc80: 65 66 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75  ef;.    pItem->u
bc90: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a   = pOldItem->u;.
bca0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
bcb0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
bcc0: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
bcd0: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
bce0: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
bcf0: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
bd00: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
bd10: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
bd20: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
bd30: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
bd40: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
bd50: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
bd60: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
bd70: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
bd80: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
bd90: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
bda0: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
bdb0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
bdc0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
bdd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
bde0: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
bdf0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
be00: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
be10: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
be20: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
be30: 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74   SrcList *p, int
be40: 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69   flags){.  SrcLi
be50: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
be60: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
be70: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
be80: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
be90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74  return 0;.  nByt
bea0: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
beb0: 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69   (p->nSrc>0 ? si
bec0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20  zeof(p->a[0]) * 
bed0: 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29  (p->nSrc-1) : 0)
bee0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
bef0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
bf00: 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
bf10: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
bf20: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
bf30: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
bf40: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
bf50: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
bf60: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
bf70: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
bf80: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
bf90: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
bfa0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
bfb0: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
bfc0: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62  p->a[i];.    Tab
bfd0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e  le *pTab;.    pN
bfe0: 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20  ewItem->pSchema 
bff0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68  = pOldItem->pSch
c000: 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ema;.    pNewIte
c010: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
c020: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c030: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
c040: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
c050: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
c060: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c070: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
c080: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
c090: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
c0a0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
c0b0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
c0c0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
c0d0: 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  >fg = pOldItem->
c0e0: 66 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  fg;.    pNewItem
c0f0: 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64  ->iCursor = pOld
c100: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
c110: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64     pNewItem->add
c120: 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49  rFillSub = pOldI
c130: 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
c140: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
c150: 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64  regReturn = pOld
c160: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
c170: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65  .    if( pNewIte
c180: 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
c190: 79 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49  y ){.      pNewI
c1a0: 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
c1b0: 42 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  By = sqlite3DbSt
c1c0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
c1d0: 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
c1e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
c1f0: 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20  wItem->pIBIndex 
c200: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49  = pOldItem->pIBI
c210: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e  ndex;.    if( pN
c220: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62  ewItem->fg.isTab
c230: 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e  Func ){.      pN
c240: 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ewItem->u1.pFunc
c250: 41 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20  Arg = .         
c260: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c270: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c280: 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66  ->u1.pFuncArg, f
c290: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lags);.    }.   
c2a0: 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d   pTab = pNewItem
c2b0: 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  ->pTab = pOldIte
c2c0: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
c2d0: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
c2e0: 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a  Tab->nTabRef++;.
c2f0: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
c300: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
c310: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
c320: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65  b, pOldItem->pSe
c330: 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  lect, flags);.  
c340: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20    pNewItem->pOn 
c350: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c360: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
c370: 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  On, flags);.    
c380: 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pNewItem->pUsing
c390: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
c3a0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c3b0: 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70  ->pUsing);.    p
c3c0: 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  NewItem->colUsed
c3d0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c   = pOldItem->col
c3e0: 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Used;.  }.  retu
c3f0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73  rn pNew;.}.IdLis
c400: 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
c410: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
c420: 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49   IdList *p){.  I
c430: 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  dList *pNew;.  i
c440: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
c450: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
c460: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
c470: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
c480: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
c490: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
c4a0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
c4b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
c4c0: 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49  New->nId = p->nI
c4d0: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
c4e0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c4f0: 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73  wNN(db, p->nId*s
c500: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
c510: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
c520: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
c530: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e  3DbFreeNN(db, pN
c540: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
c550: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65  0;.  }.  /* Note
c560: 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68   that because th
c570: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c  e size of the al
c580: 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e  location for p->
c590: 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  a[] is not.  ** 
c5a0: 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f  necessarily a po
c5b0: 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69  wer of two, sqli
c5c0: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
c5d0: 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c  ) may not be cal
c5e0: 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  led.  ** on the 
c5f0: 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65  duplicate create
c600: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
c610: 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  on. */.  for(i=0
c620: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
c630: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
c640: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
c650: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
c660: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
c670: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
c680: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
c690: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
c6a0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
c6b0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
c6c0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
c6d0: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
c6e0: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
c6f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
c700: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
c710: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
c720: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
c730: 2a 70 44 75 70 2c 20 69 6e 74 20 66 6c 61 67 73  *pDup, int flags
c740: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 65  ){.  Select *pRe
c750: 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20  t = 0;.  Select 
c760: 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53 65  *pNext = 0;.  Se
c770: 6c 65 63 74 20 2a 2a 70 70 20 3d 20 26 70 52 65  lect **pp = &pRe
c780: 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a  t;.  Select *p;.
c790: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
c7a0: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75 70   );.  for(p=pDup
c7b0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72  ; p; p=p->pPrior
c7c0: 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
c7d0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
c7e0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
c7f0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20  izeof(*p) );.   
c800: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 62   if( pNew==0 ) b
c810: 72 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  reak;.    pNew->
c820: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
c830: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
c840: 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73  p->pEList, flags
c850: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 72  );.    pNew->pSr
c860: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
c870: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72  stDup(db, p->pSr
c880: 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  c, flags);.    p
c890: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  New->pWhere = sq
c8a0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c8b0: 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67   p->pWhere, flag
c8c0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47  s);.    pNew->pG
c8d0: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
c8e0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
c8f0: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61  p->pGroupBy, fla
c900: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
c910: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
c920: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
c930: 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a  Having, flags);.
c940: 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72      pNew->pOrder
c950: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
c960: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
c970: 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b  OrderBy, flags);
c980: 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  .    pNew->op = 
c990: 70 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  p->op;.    pNew-
c9a0: 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a  >pNext = pNext;.
c9b0: 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
c9c0: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
c9d0: 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
c9e0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
c9f0: 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Limit, flags);. 
ca00: 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20     pNew->iLimit 
ca10: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
ca20: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
ca30: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
ca40: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e   p->selFlags & ~
ca50: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
ca60: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
ca70: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
ca80: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
ca90: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
caa0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c  ;.    pNew->nSel
cab0: 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c  ectRow = p->nSel
cac0: 65 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77  ectRow;.    pNew
cad0: 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75  ->pWith = withDu
cae0: 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  p(db, p->pWith);
caf0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cb00: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
cb10: 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d      pNew->pWin =
cb20: 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57   0;.    pNew->pW
cb30: 69 6e 44 65 66 6e 20 3d 20 73 71 6c 69 74 65 33  inDefn = sqlite3
cb40: 57 69 6e 64 6f 77 4c 69 73 74 44 75 70 28 64 62  WindowListDup(db
cb50: 2c 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a  , p->pWinDefn);.
cb60: 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20      if( p->pWin 
cb70: 29 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69  ) gatherSelectWi
cb80: 6e 64 6f 77 73 28 70 4e 65 77 29 3b 0a 23 65 6e  ndows(pNew);.#en
cb90: 64 69 66 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65  dif.    pNew->se
cba0: 6c 49 64 20 3d 20 70 2d 3e 73 65 6c 49 64 3b 0a  lId = p->selId;.
cbb0: 20 20 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a      *pp = pNew;.
cbc0: 20 20 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e      pp = &pNew->
cbd0: 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78  pPrior;.    pNex
cbe0: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20  t = pNew;.  }.. 
cbf0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
cc00: 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71  #else.Select *sq
cc10: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
cc20: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
cc30: 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  ct *p, int flags
cc40: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
cc50: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  0 );.  return 0;
cc60: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
cc70: 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
cc80: 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ent to the end o
cc90: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
cca0: 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20  list.  If pList 
ccb0: 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20  is.** initially 
ccc0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74  NULL, then creat
ccd0: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
cce0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  on list..**.** T
ccf0: 68 65 20 70 4c 69 73 74 20 61 72 67 75 6d 65 6e  he pList argumen
cd00: 74 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  t must be either
cd10: 20 4e 55 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74   NULL or a point
cd20: 65 72 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73  er to an ExprLis
cd30: 74 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  t.** obtained fr
cd40: 6f 6d 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  om a prior call 
cd50: 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  to sqlite3ExprLi
cd60: 73 74 41 70 70 65 6e 64 28 29 2e 20 20 54 68 69  stAppend().  Thi
cd70: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79  s routine.** may
cd80: 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74   not be used wit
cd90: 68 20 61 6e 20 45 78 70 72 4c 69 73 74 20 6f 62  h an ExprList ob
cda0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
cdb0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29  te3ExprListDup()
cdc0: 2e 0a 2a 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68  ..** Reason:  Th
cdd0: 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d  is routine assum
cde0: 65 73 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  es that the numb
cdf0: 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70  er of slots in p
ce00: 4c 69 73 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20  List->a[].** is 
ce10: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20  a power of two. 
ce20: 20 54 68 61 74 20 69 73 20 74 72 75 65 20 66 6f   That is true fo
ce30: 72 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  r sqlite3ExprLis
ce40: 74 41 70 70 65 6e 64 28 29 20 72 65 74 75 72 6e  tAppend() return
ce50: 73 0a 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20  s.** but is not 
ce60: 6e 65 63 65 73 73 61 72 69 6c 79 20 74 72 75 65  necessarily true
ce70: 20 66 72 6f 6d 20 74 68 65 20 72 65 74 75 72 6e   from the return
ce80: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
ce90: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a  3ExprListDup()..
cea0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
ceb0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
cec0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65  or occurs, the e
ced0: 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72  ntire list is fr
cee0: 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20  eed and.** NULL 
cef0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
cf00: 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74   non-NULL is ret
cf10: 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69  urned, then it i
cf20: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
cf30: 74 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74  that the new ent
cf40: 72 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ry was successfu
cf50: 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f  lly appended..*/
cf60: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
cf70: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
cf80: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
cf90: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
cfa0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
cfb0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
cfc0: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
cfd0: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
cfe0: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
cff0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
d000: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
d010: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
d020: 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e   to be appended.
d030: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
d040: 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  /.){.  struct Ex
d050: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
d060: 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
d070: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
d080: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
d090: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  );.  if( pList==
d0a0: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
d0b0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
d0c0: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
d0d0: 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20  (ExprList) );.  
d0e0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
d0f0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
d100: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
d110: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b  List->nExpr = 0;
d120: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c  .  }else if( (pL
d130: 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c  ist->nExpr & (pL
d140: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d  ist->nExpr-1))==
d150: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  0 ){.    ExprLis
d160: 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65  t *pNew;.    pNe
d170: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
d180: 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 20  lloc(db, pList, 
d190: 0a 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66  .         sizeof
d1a0: 28 2a 70 4c 69 73 74 29 2b 28 32 2a 28 73 71 6c  (*pList)+(2*(sql
d1b0: 69 74 65 33 5f 69 6e 74 36 34 29 70 4c 69 73 74  ite3_int64)pList
d1c0: 2d 3e 6e 45 78 70 72 2d 31 29 2a 73 69 7a 65 6f  ->nExpr-1)*sizeo
d1d0: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
d1e0: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
d1f0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
d200: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
d210: 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20   pList = pNew;. 
d220: 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c   }.  pItem = &pL
d230: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
d240: 78 70 72 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74  xpr++];.  assert
d250: 28 20 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63  ( offsetof(struc
d260: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c  t ExprList_item,
d270: 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65 6f 66 28 70  zName)==sizeof(p
d280: 49 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 3b 0a  Item->pExpr) );.
d290: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
d2a0: 6f 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69  of(struct ExprLi
d2b0: 73 74 5f 69 74 65 6d 2c 70 45 78 70 72 29 3d 3d  st_item,pExpr)==
d2c0: 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  0 );.  memset(&p
d2d0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69  Item->zName,0,si
d2e0: 7a 65 6f 66 28 2a 70 49 74 65 6d 29 2d 6f 66 66  zeof(*pItem)-off
d2f0: 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70  setof(struct Exp
d300: 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65  rList_item,zName
d310: 29 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78  ));.  pItem->pEx
d320: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 72 65  pr = pExpr;.  re
d330: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f  turn pList;..no_
d340: 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41  mem:     .  /* A
d350: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
d360: 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61  ory if malloc ha
d370: 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73  s failed. */.  s
d380: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
d390: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73  (db, pExpr);.  s
d3a0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
d3b0: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
d3c0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
d3d0: 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61  /*.** pColumns a
d3e0: 6e 64 20 70 45 78 70 72 20 66 6f 72 6d 20 61 20  nd pExpr form a 
d3f0: 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e  vector assignmen
d400: 74 20 77 68 69 63 68 20 69 73 20 70 61 72 74 20  t which is part 
d410: 6f 66 20 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c  of the SET.** cl
d420: 61 75 73 65 20 6f 66 20 61 6e 20 55 50 44 41 54  ause of an UPDAT
d430: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69  E statement.  Li
d440: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
d450: 20 20 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20        (a,b,c) = 
d460: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
d470: 72 33 29 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61  r3).** Or:    (a
d480: 2c 62 2c 63 29 20 3d 20 28 53 45 4c 45 43 54 20  ,b,c) = (SELECT 
d490: 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29  x,y,z FROM ....)
d4a0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  .**.** For each 
d4b0: 74 65 72 6d 20 6f 66 20 74 68 65 20 76 65 63 74  term of the vect
d4c0: 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61  or assignment, a
d4d0: 70 70 65 6e 64 20 6e 65 77 20 65 6e 74 72 69 65  ppend new entrie
d4e0: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72  s to the.** expr
d4f0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73  ession list pLis
d500: 74 2e 20 20 49 6e 20 74 68 65 20 63 61 73 65 20  t.  In the case 
d510: 6f 66 20 61 20 73 75 62 71 75 65 72 79 20 6f 6e  of a subquery on
d520: 20 74 68 65 20 52 48 53 2c 20 61 70 70 65 6e 64   the RHS, append
d530: 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  .** TK_SELECT_CO
d540: 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 73  LUMN expressions
d550: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
d560: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
d570: 70 65 6e 64 56 65 63 74 6f 72 28 0a 20 20 50 61  pendVector(.  Pa
d580: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
d590: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
d5a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
d5b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
d5c0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
d5d0: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
d5e0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
d5f0: 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75  .  IdList *pColu
d600: 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73  mns,      /* Lis
d610: 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48  t of names of LH
d620: 53 20 6f 66 20 74 68 65 20 61 73 73 69 67 6e 6d  S of the assignm
d630: 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ent */.  Expr *p
d640: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
d650: 2f 2a 20 56 65 63 74 6f 72 20 65 78 70 72 65 73  /* Vector expres
d660: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
d670: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
d680: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
d690: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d6a0: 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  >db;.  int n;.  
d6b0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 46 69  int i;.  int iFi
d6c0: 72 73 74 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  rst = pList ? pL
d6d0: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  ist->nExpr : 0;.
d6e0: 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61    /* pColumns ca
d6f0: 6e 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64  n only be NULL d
d700: 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74  ue to an OOM but
d710: 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75   an OOM will cau
d720: 73 65 20 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20  se an.  ** exit 
d730: 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f  prior to this ro
d740: 75 74 69 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f  utine being invo
d750: 6b 65 64 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ked */.  if( NEV
d760: 45 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20  ER(pColumns==0) 
d770: 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70  ) goto vector_ap
d780: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66  pend_error;.  if
d790: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 67 6f 74  ( pExpr==0 ) got
d7a0: 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f  o vector_append_
d7b0: 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20  error;..  /* If 
d7c0: 74 68 65 20 52 48 53 20 69 73 20 61 20 76 65 63  the RHS is a vec
d7d0: 74 6f 72 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  tor, then we can
d7e0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 63 68 65   immediately che
d7f0: 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 0a  ck to see that .
d800: 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66    ** the size of
d810: 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53   the RHS and LHS
d820: 20 6d 61 74 63 68 2e 20 20 42 75 74 20 69 66 20   match.  But if 
d830: 74 68 65 20 52 48 53 20 69 73 20 61 20 53 45 4c  the RHS is a SEL
d840: 45 43 54 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63  ECT, .  ** wildc
d850: 61 72 64 73 20 28 22 2a 22 29 20 69 6e 20 74 68  ards ("*") in th
d860: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
d870: 74 68 65 20 53 45 4c 45 43 54 20 6d 75 73 74 20  the SELECT must 
d880: 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
d890: 72 65 0a 20 20 2a 2a 20 77 65 20 63 61 6e 20 64  re.  ** we can d
d8a0: 6f 20 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b  o the size check
d8b0: 2c 20 73 6f 20 64 65 66 65 72 20 74 68 65 20 73  , so defer the s
d8c0: 69 7a 65 20 63 68 65 63 6b 20 75 6e 74 69 6c 20  ize check until 
d8d0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e  code generation.
d8e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
d8f0: 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54  r->op!=TK_SELECT
d900: 20 26 26 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49   && pColumns->nI
d910: 64 21 3d 28 6e 3d 73 71 6c 69 74 65 33 45 78 70  d!=(n=sqlite3Exp
d920: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
d930: 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r)) ){.    sqlit
d940: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d950: 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61  e, "%d columns a
d960: 73 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65  ssigned %d value
d970: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
d980: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73          pColumns
d990: 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67  ->nId, n);.    g
d9a0: 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e  oto vector_appen
d9b0: 64 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  d_error;.  }..  
d9c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75  for(i=0; i<pColu
d9d0: 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  mns->nId; i++){.
d9e0: 20 20 20 20 45 78 70 72 20 2a 70 53 75 62 45 78      Expr *pSubEx
d9f0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
da00: 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70  ForVectorField(p
da10: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 69 29  Parse, pExpr, i)
da20: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
da30: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
da40: 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73  end(pParse, pLis
da50: 74 2c 20 70 53 75 62 45 78 70 72 29 3b 0a 20 20  t, pSubExpr);.  
da60: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
da70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
da80: 73 74 2d 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73  st->nExpr==iFirs
da90: 74 2b 69 2b 31 20 29 3b 0a 20 20 20 20 20 20 70  t+i+1 );.      p
daa0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
dab0: 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
dac0: 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a  pColumns->a[i].z
dad0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Name;.      pCol
dae0: 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  umns->a[i].zName
daf0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
db00: 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
db10: 6f 63 46 61 69 6c 65 64 20 26 26 20 70 45 78 70  ocFailed && pExp
db20: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
db30: 20 26 26 20 41 4c 57 41 59 53 28 70 4c 69 73 74   && ALWAYS(pList
db40: 21 3d 30 29 20 29 7b 0a 20 20 20 20 45 78 70 72  !=0) ){.    Expr
db50: 20 2a 70 46 69 72 73 74 20 3d 20 70 4c 69 73 74   *pFirst = pList
db60: 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70  ->a[iFirst].pExp
db70: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
db80: 46 69 72 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  First!=0 );.    
db90: 61 73 73 65 72 74 28 20 70 46 69 72 73 74 2d 3e  assert( pFirst->
dba0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op==TK_SELECT_CO
dbb0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20  LUMN );.     .  
dbc0: 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 53    /* Store the S
dbd0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
dbe0: 69 6e 20 70 52 69 67 68 74 20 73 6f 20 69 74 20  in pRight so it 
dbf0: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20  will be deleted 
dc00: 77 68 65 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69  when.    ** sqli
dc10: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
dc20: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f  e() is called */
dc30: 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 70 52 69  .    pFirst->pRi
dc40: 67 68 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  ght = pExpr;.   
dc50: 20 70 45 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20   pExpr = 0;..   
dc60: 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65   /* Remember the
dc70: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 4c 48 53   size of the LHS
dc80: 20 69 6e 20 69 54 61 62 6c 65 20 73 6f 20 74 68   in iTable so th
dc90: 61 74 20 77 65 20 63 61 6e 20 63 68 65 63 6b 20  at we can check 
dca0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
dcb0: 52 48 53 20 61 6e 64 20 4c 48 53 20 73 69 7a 65  RHS and LHS size
dcc0: 73 20 6d 61 74 63 68 20 64 75 72 69 6e 67 20 63  s match during c
dcd0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20  ode generation. 
dce0: 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 69  */.    pFirst->i
dcf0: 54 61 62 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73  Table = pColumns
dd00: 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74  ->nId;.  }..vect
dd10: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a  or_append_error:
dd20: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 55 6e  .  sqlite3ExprUn
dd30: 6d 61 70 41 6e 64 44 65 6c 65 74 65 28 70 50 61  mapAndDelete(pPa
dd40: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 73  rse, pExpr);.  s
dd50: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
dd60: 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29  te(db, pColumns)
dd70: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
dd80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
dd90: 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 66 6f  he sort order fo
dda0: 72 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65  r the last eleme
ddb0: 6e 74 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  nt on the given 
ddc0: 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ExprList..*/.voi
ddd0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
dde0: 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 45 78  tSetSortOrder(Ex
ddf0: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 69  prList *p, int i
de00: 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20 69 66  SortOrder){.  if
de10: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
de20: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
de30: 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30  E_SO_UNDEFINED<0
de40: 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53   && SQLITE_SO_AS
de50: 43 3e 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53  C>=0 && SQLITE_S
de60: 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73  O_DESC>0 );.  as
de70: 73 65 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30  sert( p->nExpr>0
de80: 20 29 3b 0a 20 20 69 66 28 20 69 53 6f 72 74 4f   );.  if( iSortO
de90: 72 64 65 72 3c 30 20 29 7b 0a 20 20 20 20 61 73  rder<0 ){.    as
dea0: 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45  sert( p->a[p->nE
deb0: 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72  xpr-1].sortOrder
dec0: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20  ==SQLITE_SO_ASC 
ded0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
dee0: 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78   }.  p->a[p->nEx
def0: 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20  pr-1].sortOrder 
df00: 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65 72  = (u8)iSortOrder
df10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
df20: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
df30: 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66  zName element of
df40: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
df50: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
df60: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
df70: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
df80: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
df90: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
dfa0: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
dfb0: 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76  pName should nev
dfc0: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
dfd0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
dfe0: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
dff0: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
e000: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
e010: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
e020: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
e030: 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72  stSetName(.  Par
e040: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e050: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e060: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
e070: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
e080: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
e090: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
e0a0: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   span. */.  Toke
e0b0: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
e0c0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62      /* Name to b
e0d0: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
e0e0: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
e0f0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
e100: 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74  cause the name t
e110: 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f  o be dequoted */
e120: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  .){.  assert( pL
e130: 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ist!=0 || pParse
e140: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
e150: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
e160: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
e170: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
e180: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
e190: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
e1a0: 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  r>0 );.    pItem
e1b0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
e1c0: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
e1d0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
e1e0: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20  >zName==0 );.   
e1f0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
e200: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
e210: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
e220: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
e230: 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74  ;.    if( dequot
e240: 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f  e ) sqlite3Dequo
e250: 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  te(pItem->zName)
e260: 3b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e  ;.    if( IN_REN
e270: 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
e280: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
e290: 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65  eTokenMap(pParse
e2a0: 2c 20 28 76 6f 69 64 2a 29 70 49 74 65 6d 2d 3e  , (void*)pItem->
e2b0: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20  zName, pName);. 
e2c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e2d0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
e2e0: 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65  st.a[].zSpan ele
e2f0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
e300: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
e310: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
e320: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
e330: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
e340: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
e350: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
e360: 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f  .  But pSpan sho
e370: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
e380: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
e390: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
e3a0: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
e3b0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
e3c0: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
e3d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e3e0: 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e  3ExprListSetSpan
e3f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e400: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
e410: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e420: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
e430: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
e440: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
e450: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
e460: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e470: 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 53 74  Start,     /* St
e480: 61 72 74 20 6f 66 20 74 68 65 20 73 70 61 6e 20  art of the span 
e490: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e4a0: 2a 7a 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20  *zEnd        /* 
e4b0: 45 6e 64 20 6f 66 20 74 68 65 20 73 70 61 6e 20  End of the span 
e4c0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
e4d0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
e4e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
e4f0: 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  t!=0 || db->mall
e500: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
e510: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
e520: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
e530: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
e540: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
e550: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
e560: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
e570: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 73 71 6c  xpr>0 );.    sql
e580: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
e590: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
e5a0: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
e5b0: 20 73 71 6c 69 74 65 33 44 62 53 70 61 6e 44 75   sqlite3DbSpanDu
e5c0: 70 28 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45  p(db, zStart, zE
e5d0: 6e 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nd);.  }.}../*.*
e5e0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
e5f0: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
e600: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
e610: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
e620: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
e630: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
e640: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
e650: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e660: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
e670: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
e680: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
e690: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e6a0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
e6b0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
e6c0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
e6d0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
e6e0: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
e6f0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
e700: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
e710: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
e720: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
e730: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
e740: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
e750: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
e760: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e770: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
e780: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
e790: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
e7a0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
e7b0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
e7c0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ion list..*/.sta
e7d0: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
e7e0: 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73  INE void exprLis
e7f0: 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65  tDeleteNN(sqlite
e800: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
e810: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
e820: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
e830: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
e840: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
e850: 20 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 61 73    pList->a;.  as
e860: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
e870: 70 72 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  pr>0 );.  do{.  
e880: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
e890: 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
e8a0: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
e8b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
e8c0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
e8d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e8e0: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
e8f0: 0a 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20  .    pItem++;.  
e900: 7d 77 68 69 6c 65 28 20 2d 2d 69 3e 30 20 29 3b  }while( --i>0 );
e910: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
e920: 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
e930: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
e940: 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  rListDelete(sqli
e950: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
e960: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28  t *pList){.  if(
e970: 20 70 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73   pList ) exprLis
e980: 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c  tDeleteNN(db, pL
e990: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ist);.}../*.** R
e9a0: 65 74 75 72 6e 20 74 68 65 20 62 69 74 77 69 73  eturn the bitwis
e9b0: 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72  e-OR of all Expr
e9c0: 2e 66 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e  .flags fields in
e9d0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78   the given.** Ex
e9e0: 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73  prList..*/.u32 s
e9f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
ea00: 61 67 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69  ags(const ExprLi
ea10: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
ea20: 74 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30  t i;.  u32 m = 0
ea30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
ea40: 74 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  t!=0 );.  for(i=
ea50: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
ea60: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 45 78  r; i++){.     Ex
ea70: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
ea80: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
ea90: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
eaa0: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 6d 20 7c  r!=0 );.     m |
eab0: 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a  = pExpr->flags;.
eac0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a    }.  return m;.
ead0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
eae0: 20 61 20 53 45 4c 45 43 54 2d 6e 6f 64 65 20 63   a SELECT-node c
eaf0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
eb00: 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65  expression walke
eb10: 72 20 74 68 61 74 0a 2a 2a 20 61 6c 77 61 79 73  r that.** always
eb20: 20 22 66 61 69 6c 73 22 2e 20 20 42 79 20 22 66   "fails".  By "f
eb30: 61 69 6c 22 20 69 6e 20 74 68 69 73 20 63 61 73  ail" in this cas
eb40: 65 2c 20 77 65 20 6d 65 61 6e 20 73 65 74 0a 2a  e, we mean set.*
eb50: 2a 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  * pWalker->eCode
eb60: 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 61 62 6f   to zero and abo
eb70: 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  rt..**.** This c
eb80: 61 6c 6c 62 61 63 6b 20 69 73 20 75 73 65 64 20  allback is used 
eb90: 62 79 20 6d 75 6c 74 69 70 6c 65 20 65 78 70 72  by multiple expr
eba0: 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72 73 2e 0a  ession walkers..
ebb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
ebc0: 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28 57 61 6c  lectWalkFail(Wal
ebd0: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
ebe0: 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  lect *NotUsed){.
ebf0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
ec00: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70  ER(NotUsed);.  p
ec10: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
ec20: 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
ec30: 41 62 6f 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Abort;.}../*.** 
ec40: 49 66 20 74 68 65 20 69 6e 70 75 74 20 65 78 70  If the input exp
ec50: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 49 44  ression is an ID
ec60: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 22   with the name "
ec70: 74 72 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22  true" or "false"
ec80: 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  .** then convert
ec90: 20 69 74 20 69 6e 74 6f 20 61 6e 20 54 4b 5f 54   it into an TK_T
eca0: 52 55 45 46 41 4c 53 45 20 74 65 72 6d 2e 20 20  RUEFALSE term.  
ecb0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
ecc0: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 76 65 72  if.** the conver
ecd0: 73 69 6f 6e 20 68 61 70 70 65 6e 65 64 2c 20 61  sion happened, a
ece0: 6e 64 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  nd zero if the e
ecf0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 61  xpression is una
ed00: 6c 74 65 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ltered..*/.int s
ed10: 71 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54 72  qlite3ExprIdToTr
ed20: 75 65 46 61 6c 73 65 28 45 78 70 72 20 2a 70 45  ueFalse(Expr *pE
ed30: 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  xpr){.  assert( 
ed40: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pExpr->op==TK_ID
ed50: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
ed60: 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 69 66  K_STRING );.  if
ed70: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
ed80: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 51 75 6f  ty(pExpr, EP_Quo
ed90: 74 65 64 29 0a 20 20 20 26 26 20 28 73 71 6c 69  ted).   && (sqli
eda0: 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
edb0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 74 72 75  ->u.zToken, "tru
edc0: 65 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  e")==0.       ||
edd0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
ede0: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
edf0: 20 22 66 61 6c 73 65 22 29 3d 3d 30 29 0a 20 20   "false")==0).  
ee00: 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  ){.    pExpr->op
ee10: 20 3d 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3b   = TK_TRUEFALSE;
ee20: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
ee30: 65 72 74 79 28 70 45 78 70 72 2c 20 70 45 78 70  erty(pExpr, pExp
ee40: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d  r->u.zToken[4]==
ee50: 30 20 3f 20 45 50 5f 49 73 54 72 75 65 20 3a 20  0 ? EP_IsTrue : 
ee60: 45 50 5f 49 73 46 61 6c 73 65 29 3b 0a 20 20 20  EP_IsFalse);.   
ee70: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
ee80: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
ee90: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
eea0: 20 6d 75 73 74 20 62 65 20 61 20 54 4b 5f 54 52   must be a TK_TR
eeb0: 55 45 46 41 4c 53 45 20 45 78 70 72 20 6e 6f 64  UEFALSE Expr nod
eec0: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
eed0: 69 74 20 69 73 20 54 52 55 45 0a 2a 2a 20 61 6e  it is TRUE.** an
eee0: 64 20 30 20 69 66 20 69 74 20 69 73 20 46 41 4c  d 0 if it is FAL
eef0: 53 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  SE..*/.int sqlit
ef00: 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65  e3ExprTruthValue
ef10: 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78  (const Expr *pEx
ef20: 70 72 29 7b 0a 20 20 70 45 78 70 72 20 3d 20 73  pr){.  pExpr = s
ef30: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
ef40: 6c 6c 61 74 65 28 28 45 78 70 72 2a 29 70 45 78  llate((Expr*)pEx
ef50: 70 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pr);.  assert( p
ef60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55  Expr->op==TK_TRU
ef70: 45 46 41 4c 53 45 20 29 3b 0a 20 20 61 73 73 65  EFALSE );.  asse
ef80: 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  rt( sqlite3StrIC
ef90: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
efa0: 65 6e 2c 22 74 72 75 65 22 29 3d 3d 30 0a 20 20  en,"true")==0.  
efb0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53       || sqlite3S
efc0: 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e  trICmp(pExpr->u.
efd0: 7a 54 6f 6b 65 6e 2c 22 66 61 6c 73 65 22 29 3d  zToken,"false")=
efe0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
eff0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34  Expr->u.zToken[4
f000: 5d 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ]==0;.}../*.** I
f010: 66 20 70 45 78 70 72 20 69 73 20 61 6e 20 41 4e  f pExpr is an AN
f020: 44 20 6f 72 20 4f 52 20 65 78 70 72 65 73 73 69  D or OR expressi
f030: 6f 6e 2c 20 74 72 79 20 74 6f 20 73 69 6d 70 6c  on, try to simpl
f040: 69 66 79 20 69 74 20 62 79 20 65 6c 69 6d 69 6e  ify it by elimin
f050: 61 74 69 6e 67 0a 2a 2a 20 74 65 72 6d 73 20 74  ating.** terms t
f060: 68 61 74 20 61 72 65 20 61 6c 77 61 79 73 20 74  hat are always t
f070: 72 75 65 20 6f 72 20 66 61 6c 73 65 2e 20 20 52  rue or false.  R
f080: 65 74 75 72 6e 20 74 68 65 20 73 69 6d 70 6c 69  eturn the simpli
f090: 66 69 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e  fied expression.
f0a0: 0a 2a 2a 20 4f 72 20 72 65 74 75 72 6e 20 74 68  .** Or return th
f0b0: 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65  e original expre
f0c0: 73 73 69 6f 6e 20 69 66 20 6e 6f 20 73 69 6d 70  ssion if no simp
f0d0: 6c 69 66 69 63 61 74 69 6f 6e 20 69 73 20 70 6f  lification is po
f0e0: 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  ssible..**.** Ex
f0f0: 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
f100: 20 20 28 78 3c 31 30 29 20 41 4e 44 20 74 72 75    (x<10) AND tru
f110: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
f120: 20 3d 3e 20 20 20 28 78 3c 31 30 29 0a 2a 2a 20   =>   (x<10).** 
f130: 20 20 20 20 28 78 3c 31 30 29 20 41 4e 44 20 66      (x<10) AND f
f140: 61 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  alse            
f150: 20 20 20 3d 3e 20 20 20 66 61 6c 73 65 0a 2a 2a     =>   false.**
f160: 20 20 20 20 20 28 78 3c 31 30 29 20 41 4e 44 20       (x<10) AND 
f170: 28 79 3d 32 32 20 4f 52 20 66 61 6c 73 65 29 20  (y=22 OR false) 
f180: 20 20 20 20 3d 3e 20 20 20 28 78 3c 31 30 29 20      =>   (x<10) 
f190: 41 4e 44 20 28 79 3d 32 32 29 0a 2a 2a 20 20 20  AND (y=22).**   
f1a0: 20 20 28 78 3c 31 30 29 20 41 4e 44 20 28 79 3d    (x<10) AND (y=
f1b0: 32 32 20 4f 52 20 74 72 75 65 29 20 20 20 20 20  22 OR true)     
f1c0: 20 3d 3e 20 20 20 28 78 3c 31 30 29 0a 2a 2a 20   =>   (x<10).** 
f1d0: 20 20 20 20 28 79 3d 32 32 29 20 4f 52 20 74 72      (y=22) OR tr
f1e0: 75 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ue              
f1f0: 20 20 20 3d 3e 20 20 20 74 72 75 65 0a 2a 2f 0a     =>   true.*/.
f200: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
f210: 72 53 69 6d 70 6c 69 66 69 65 64 41 6e 64 4f 72  rSimplifiedAndOr
f220: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
f230: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d   assert( pExpr!=
f240: 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  0 );.  if( pExpr
f250: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 7c 7c 20  ->op==TK_AND || 
f260: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  pExpr->op==TK_OR
f270: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52   ){.    Expr *pR
f280: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
f290: 70 72 53 69 6d 70 6c 69 66 69 65 64 41 6e 64 4f  prSimplifiedAndO
f2a0: 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  r(pExpr->pRight)
f2b0: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  ;.    Expr *pLef
f2c0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  t = sqlite3ExprS
f2d0: 69 6d 70 6c 69 66 69 65 64 41 6e 64 4f 72 28 70  implifiedAndOr(p
f2e0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
f2f0: 20 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73    if( ExprAlways
f300: 54 72 75 65 28 70 4c 65 66 74 29 20 7c 7c 20 45  True(pLeft) || E
f310: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
f320: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
f330: 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 6f  pExpr = pExpr->o
f340: 70 3d 3d 54 4b 5f 41 4e 44 20 3f 20 70 52 69 67  p==TK_AND ? pRig
f350: 68 74 20 3a 20 70 4c 65 66 74 3b 0a 20 20 20 20  ht : pLeft;.    
f360: 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 41 6c  }else if( ExprAl
f370: 77 61 79 73 54 72 75 65 28 70 52 69 67 68 74 29  waysTrue(pRight)
f380: 20 7c 7c 20 45 78 70 72 41 6c 77 61 79 73 46 61   || ExprAlwaysFa
f390: 6c 73 65 28 70 4c 65 66 74 29 20 29 7b 0a 20 20  lse(pLeft) ){.  
f3a0: 20 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70      pExpr = pExp
f3b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 3f 20  r->op==TK_AND ? 
f3c0: 70 4c 65 66 74 20 3a 20 70 52 69 67 68 74 3b 0a  pLeft : pRight;.
f3d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
f3e0: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 0a 2f 2a  rn pExpr;.}.../*
f3f0: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
f400: 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61  es are Walker ca
f410: 6c 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20  llbacks used to 
f420: 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e  check expression
f430: 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74  s to.** see if t
f440: 68 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e  hey are "constan
f450: 74 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69  t" for some defi
f460: 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61  nition of consta
f470: 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b  nt.  The.** Walk
f480: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64  er.eCode value d
f490: 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79  etermines the ty
f4a0: 70 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22  pe of "constant"
f4b0: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a   we are looking.
f4c0: 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ** for..**.** Th
f4d0: 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ese callback rou
f4e0: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
f4f0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
f500: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
f510: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f520: 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  IsConstant()    
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
f540: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a  alker->eCode==1.
f550: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
f560: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
f570: 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20  oin()           
f580: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
f590: 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  2.**     sqlite3
f5a0: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
f5b0: 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20  ant()           
f5c0: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
f5d0: 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ==3.**     sqlit
f5e0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
f5f0: 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20  OrFunction()    
f600: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
f610: 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a  de==4 or 5.**.**
f620: 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74   In all cases, t
f630: 68 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74  he callbacks set
f640: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20   Walker.eCode=0 
f650: 61 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65  and abort if the
f660: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
f670: 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62  s found to not b
f680: 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a  e a constant..**
f690: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45  .** The sqlite3E
f6a0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
f6b0: 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65  unction() is use
f6c0: 64 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67  d for evaluating
f6d0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
f6e0: 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
f6f0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
f700: 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76  e Walker.eCode v
f710: 61 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70  alue is 5 when p
f720: 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69  arsing.** an exi
f730: 73 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64  sting schema and
f740: 20 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69   4 when processi
f750: 6e 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65  ng a new stateme
f760: 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20  nt.  A bound.** 
f770: 70 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73  parameter raises
f780: 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65   an error for ne
f790: 77 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75  w statements, bu
f7a0: 74 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f  t is silently co
f7b0: 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55  nverted.** to NU
f7c0: 4c 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  LL for existing 
f7d0: 73 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61  schemas.  This a
f7e0: 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73  llows sqlite_mas
f7f0: 74 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20  ter tables that 
f800: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f  .** contain a bo
f810: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65  und parameter be
f820: 63 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20  cause they were 
f830: 67 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64  generated by old
f840: 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  er versions.** o
f850: 66 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70  f SQLite to be p
f860: 61 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76  arsed by newer v
f870: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
f880: 65 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e  e without raisin
f890: 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  g a.** malformed
f8a0: 20 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a   schema error..*
f8b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
f8c0: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  rNodeIsConstant(
f8d0: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
f8e0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a   Expr *pExpr){..
f8f0: 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d    /* If pWalker-
f900: 3e 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e  >eCode is 2 then
f910: 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65   any term of the
f920: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
f930: 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a   comes from.  **
f940: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
f950: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65   clauses of a le
f960: 66 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69  ft join disquali
f970: 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73  fies the express
f980: 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65  ion.  ** from be
f990: 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63  ing considered c
f9a0: 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  onstant. */.  if
f9b0: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
f9c0: 3d 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72  ==2 && ExprHasPr
f9d0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
f9e0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
f9f0: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
fa00: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
fa10: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
fa20: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
fa30: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ->op ){.    /* C
fa40: 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e  onsider function
fa50: 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74  s to be constant
fa60: 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72   if all their ar
fa70: 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73  guments are cons
fa80: 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20  tant.    ** and 
fa90: 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e  either pWalker->
faa0: 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72  eCode==4 or 5 or
fab0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61   the function ha
fac0: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c  s the.    ** SQL
fad0: 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66  ITE_FUNC_CONST f
fae0: 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65  lag. */.    case
faf0: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
fb00: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
fb10: 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70  >eCode>=4 || Exp
fb20: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
fb30: 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29  pr,EP_ConstFunc)
fb40: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
fb50: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
fb60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fb70: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
fb80: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
fb90: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
fba0: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
fbb0: 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20  case TK_ID:.    
fbc0: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22 74 72    /* Convert "tr
fbd0: 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22 20 69  ue" or "false" i
fbe0: 6e 20 61 20 44 45 46 41 55 4c 54 20 63 6c 61 75  n a DEFAULT clau
fbf0: 73 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  se into the.    
fc00: 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65    ** appropriate
fc10: 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 6f 70   TK_TRUEFALSE op
fc20: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
fc30: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
fc40: 64 54 6f 54 72 75 65 46 61 6c 73 65 28 70 45 78  dToTrueFalse(pEx
fc50: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pr) ){.        r
fc60: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
fc70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
fc80: 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
fc90: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
fca0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
fcb0: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
fcc0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
fcd0: 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63  UMN:.      testc
fce0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
fcf0: 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74  TK_ID );.      t
fd00: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
fd10: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
fd20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
fd30: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
fd40: 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
fd50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
fd60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
fd70: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
fd80: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
fd90: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
fda0: 69 78 65 64 43 6f 6c 29 20 26 26 20 70 57 61 6c  ixedCol) && pWal
fdb0: 6b 65 72 2d 3e 65 43 6f 64 65 21 3d 32 20 29 7b  ker->eCode!=2 ){
fdc0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fdd0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
fde0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
fdf0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
fe00: 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  3 && pExpr->iTab
fe10: 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  le==pWalker->u.i
fe20: 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Cur ){.        r
fe30: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
fe40: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
fe50: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
fe60: 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  h */.    case TK
fe70: 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 0a 20 20  _IF_NULL_ROW:.  
fe80: 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
fe90: 45 52 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  ER:.      testca
fea0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
feb0: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
fec0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
fed0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e  xpr->op==TK_IF_N
fee0: 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20 20 20 20  ULL_ROW );.     
fef0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
ff00: 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
ff10: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
ff20: 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
ff30: 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  E:.      if( pWa
ff40: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29  lker->eCode==5 )
ff50: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c  {.        /* Sil
ff60: 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f  ently convert bo
ff70: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 74  und parameters t
ff80: 68 61 74 20 61 70 70 65 61 72 20 69 6e 73 69 64  hat appear insid
ff90: 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20  e of CREATE.    
ffa0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
ffb0: 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68  s into a NULL wh
ffc0: 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20 43  en parsing the C
ffd0: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
ffe0: 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20  text out.       
fff0: 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74   ** of the sqlit
10000 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e_master table *
10010 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  /.        pExpr-
10020 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
10030 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
10040 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
10050 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
10060 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
10070 20 69 6e 20 61 20 43 52 45 41 54 45 20 73 74 61   in a CREATE sta
10080 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67  tement that orig
10090 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20  inates from.    
100a0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70      ** sqlite3_p
100b0 72 65 70 61 72 65 28 29 20 63 61 75 73 65 73 20  repare() causes 
100c0 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
100d0 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
100e0 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
100f0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
10100 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10110 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
10120 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  */.    default:.
10130 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10140 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
10150 4c 45 43 54 20 29 3b 20 2f 2a 20 73 71 6c 69 74  LECT ); /* sqlit
10160 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c  e3SelectWalkFail
10170 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f 0a  () disallows */.
10180 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10190 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
101a0 49 53 54 53 20 29 3b 20 2f 2a 20 73 71 6c 69 74  ISTS ); /* sqlit
101b0 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c  e3SelectWalkFail
101c0 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f 0a  () disallows */.
101d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
101e0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
101f0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
10200 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c  IsConst(Expr *p,
10210 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20 69   int initFlag, i
10220 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b  nt iCur){.  Walk
10230 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20  er w;.  w.eCode 
10240 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e  = initFlag;.  w.
10250 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
10260 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
10270 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  nt;.  w.xSelectC
10280 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
10290 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b  3SelectWalkFail;
102a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
102b0 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63 74  EBUG.  w.xSelect
102c0 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69  Callback2 = sqli
102d0 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73  te3SelectWalkAss
102e0 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20 77  ert2;.#endif.  w
102f0 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a  .u.iCur = iCur;.
10300 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
10310 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
10320 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f  rn w.eCode;.}../
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 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10370 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
10380 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
10390 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
103a0 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
103b0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
103c0 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
103d0 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
103e0 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
103f0 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
10400 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
10410 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
10420 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
10430 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
10440 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
10450 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
10460 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
10470 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
10480 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
10490 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 1, 0);.}../*.*
104a0 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
104b0 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
104c0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a  rn non-zero if.*
104d0 2a 0a 2a 2a 20 20 20 28 31 29 20 74 68 65 20 65  *.**   (1) the e
104e0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
104f0 73 74 61 6e 74 2c 20 61 6e 64 0a 2a 2a 20 20 20  stant, and.**   
10500 28 32 29 20 74 68 65 20 65 78 70 72 65 73 73 69  (2) the expressi
10510 6f 6e 20 64 6f 65 73 20 6f 72 69 67 69 6e 61 74  on does originat
10520 65 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  e in the ON or U
10530 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20  SING clause.**  
10540 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a       of a LEFT J
10550 4f 49 4e 2c 20 61 6e 64 0a 2a 2a 20 20 20 28 33  OIN, and.**   (3
10560 29 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  ) the expression
10570 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
10580 6e 20 61 6e 79 20 45 50 5f 46 69 78 65 64 43 6f  n any EP_FixedCo
10590 6c 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 20  l TK_COLUMN.**  
105a0 20 20 20 20 20 6f 70 65 72 61 6e 64 73 20 63 72       operands cr
105b0 65 61 74 65 64 20 62 79 20 74 68 65 20 63 6f 6e  eated by the con
105c0 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f  stant propagatio
105d0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  n optimization..
105e0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
105f0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
10600 74 72 75 65 2c 20 69 74 20 69 6e 64 69 63 61 74  true, it indicat
10610 65 73 20 74 68 61 74 20 74 68 65 20 65 78 70 72  es that the expr
10620 65 73 73 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  ession.** can be
10630 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 50   added to the pP
10640 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
10650 20 6c 69 73 74 20 61 6e 64 20 65 76 61 6c 75 61   list and evalua
10660 74 65 64 20 6f 6e 63 65 20 77 68 65 6e 0a 2a 2a  ted once when.**
10670 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
10680 61 74 65 6d 65 6e 74 20 73 74 61 72 74 73 20 75  atement starts u
10690 70 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  p.  See sqlite3E
106a0 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 29 2e  xprCodeAtInit().
106b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
106c0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
106d0 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  Join(Expr *p){. 
106e0 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
106f0 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a  nst(p, 2, 0);.}.
10700 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
10710 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
10720 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
10730 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
10740 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
10750 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c 65  * for any single
10760 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c   row of the tabl
10770 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43  e with cursor iC
10780 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ur.  In other wo
10790 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70 72  rds, the.** expr
107a0 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20  ession must not 
107b0 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f 6e  refer to any non
107c0 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66  -deterministic f
107d0 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79 0a  unction nor any.
107e0 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74  ** table other t
107f0 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e 74  han iCur..*/.int
10800 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
10810 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  bleConstant(Expr
10820 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a   *p, int iCur){.
10830 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
10840 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72 29  onst(p, 3, iCur)
10850 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  ;.}.../*.** sqli
10860 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61  te3WalkExpr() ca
10870 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 73  llback used by s
10880 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
10890 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 29 2e  tantOrGroupBy().
108a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
108b0 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
108c0 74 4f 72 47 72 6f 75 70 42 79 28 57 61 6c 6b 65  tOrGroupBy(Walke
108d0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
108e0 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72   *pExpr){.  Expr
108f0 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20 3d  List *pGroupBy =
10900 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 47 72 6f   pWalker->u.pGro
10910 75 70 42 79 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  upBy;.  int i;..
10920 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45    /* Check if pE
10930 78 70 72 20 69 73 20 69 64 65 6e 74 69 63 61 6c  xpr is identical
10940 20 74 6f 20 61 6e 79 20 47 52 4f 55 50 20 42 59   to any GROUP BY
10950 20 74 65 72 6d 2e 20 49 66 20 73 6f 2c 20 63 6f   term. If so, co
10960 6e 73 69 64 65 72 0a 20 20 2a 2a 20 69 74 20 63  nsider.  ** it c
10970 6f 6e 73 74 61 6e 74 2e 20 20 2a 2f 0a 20 20 66  onstant.  */.  f
10980 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
10990 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
109a0 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
109b0 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
109c0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  xpr;.    if( sql
109d0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
109e0 30 2c 20 70 45 78 70 72 2c 20 70 2c 20 2d 31 29  0, pExpr, p, -1)
109f0 3c 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  <2 ){.      Coll
10a00 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
10a10 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65  ite3ExprNNCollSe
10a20 71 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  q(pWalker->pPars
10a30 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28  e, p);.      if(
10a40 20 73 71 6c 69 74 65 33 49 73 42 69 6e 61 72 79   sqlite3IsBinary
10a50 28 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20  (pColl) ){.     
10a60 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
10a70 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  une;.      }.   
10a80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
10a90 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ck if pExpr is a
10aa0 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 66 20   sub-select. If 
10ab0 73 6f 2c 20 63 6f 6e 73 69 64 65 72 20 69 74 20  so, consider it 
10ac0 76 61 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20 69  variable. */.  i
10ad0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
10ae0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
10af0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70  Select) ){.    p
10b00 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
10b10 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  0;.    return WR
10b20 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
10b30 72 65 74 75 72 6e 20 65 78 70 72 4e 6f 64 65 49  return exprNodeI
10b40 73 43 6f 6e 73 74 61 6e 74 28 70 57 61 6c 6b 65  sConstant(pWalke
10b50 72 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  r, pExpr);.}../*
10b60 0a 2a 2a 20 57 61 6c 6b 20 74 68 65 20 65 78 70  .** Walk the exp
10b70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 70 61 73  ression tree pas
10b80 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
10b90 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72   argument. Retur
10ba0 6e 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 66  n non-zero.** if
10bb0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10bc0 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
10bd0 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 6f  y of constants o
10be0 72 20 63 6f 70 69 65 73 20 6f 66 20 74 65 72 6d  r copies of term
10bf0 73 20 0a 2a 2a 20 69 6e 20 70 47 72 6f 75 70 42  s .** in pGroupB
10c00 79 20 74 68 61 74 20 73 6f 72 74 20 77 69 74 68  y that sort with
10c10 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c   the BINARY coll
10c20 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
10c30 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
10c40 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
10c50 74 65 72 6d 69 6e 65 20 69 66 20 61 20 74 65 72  termine if a ter
10c60 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20  m of the HAVING 
10c70 63 6c 61 75 73 65 20 63 61 6e 0a 2a 2a 20 62 65  clause can.** be
10c80 20 70 72 6f 6d 6f 74 65 64 20 69 6e 74 6f 20 74   promoted into t
10c90 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
10ca0 20 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 73    In order for s
10cb0 75 63 68 20 61 20 70 72 6f 6d 6f 74 69 6f 6e 20  uch a promotion 
10cc0 74 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74 68 65 20  to work,.** the 
10cd0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 48 41 56  value of the HAV
10ce0 49 4e 47 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ING clause term 
10cf0 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
10d00 20 66 6f 72 20 61 6c 6c 20 6d 65 6d 62 65 72 73   for all members
10d10 20 6f 66 0a 2a 2a 20 61 20 22 67 72 6f 75 70 22   of.** a "group"
10d20 2e 20 20 54 68 65 20 72 65 71 75 69 72 65 6d 65  .  The requireme
10d30 6e 74 20 74 68 61 74 20 74 68 65 20 47 52 4f 55  nt that the GROU
10d40 50 20 42 59 20 74 65 72 6d 20 6d 75 73 74 20 62  P BY term must b
10d50 65 20 42 49 4e 41 52 59 0a 2a 2a 20 61 73 73 75  e BINARY.** assu
10d60 6d 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  mes that no othe
10d70 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  r collating sequ
10d80 65 6e 63 65 20 77 69 6c 6c 20 68 61 76 65 20 61  ence will have a
10d90 20 66 69 6e 65 72 2d 67 72 61 69 6e 65 64 0a 2a   finer-grained.*
10da0 2a 20 67 72 6f 75 70 69 6e 67 20 74 68 61 6e 20  * grouping than 
10db0 62 69 6e 61 72 79 2e 20 20 49 6e 20 6f 74 68 65  binary.  In othe
10dc0 72 20 77 6f 72 64 73 20 28 41 3d 42 20 43 4f 4c  r words (A=B COL
10dd0 4c 41 54 45 20 62 69 6e 61 72 79 29 20 69 6d 70  LATE binary) imp
10de0 6c 69 65 73 0a 2a 2a 20 41 3d 42 20 69 6e 20 65  lies.** A=B in e
10df0 76 65 72 79 20 6f 74 68 65 72 20 63 6f 6c 6c 61  very other colla
10e00 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20  ting sequence.  
10e10 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20  The requirement 
10e20 74 68 61 74 20 74 68 65 0a 2a 2a 20 47 52 4f 55  that the.** GROU
10e30 50 20 42 59 20 62 65 20 42 49 4e 41 52 59 20 69  P BY be BINARY i
10e40 73 20 73 74 72 69 63 74 65 72 20 74 68 61 6e 20  s stricter than 
10e50 6e 65 63 65 73 73 61 72 79 2e 20 20 49 74 20 77  necessary.  It w
10e60 6f 75 6c 64 20 61 6c 73 6f 20 77 6f 72 6b 0a 2a  ould also work.*
10e70 2a 20 74 6f 20 70 72 6f 6d 6f 74 65 20 48 41 56  * to promote HAV
10e80 49 4e 47 20 63 6c 61 75 73 65 73 20 74 68 61 74  ING clauses that
10e90 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 61 6c   use the same al
10ea0 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74  ternative collat
10eb0 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
10ec0 61 73 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  as the GROUP BY 
10ed0 74 65 72 6d 2c 20 62 75 74 20 74 68 61 74 20 69  term, but that i
10ee0 73 20 6d 75 63 68 20 68 61 72 64 65 72 20 74 6f  s much harder to
10ef0 20 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c 74 65 72   check,.** alter
10f00 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67  native collating
10f10 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 75   sequences are u
10f20 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68 69  ncommon, and thi
10f30 73 20 69 73 20 6f 6e 6c 79 20 61 6e 0a 2a 2a 20  s is only an.** 
10f40 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 73 6f  optimization, so
10f50 20 77 65 20 74 61 6b 65 20 74 68 65 20 65 61 73   we take the eas
10f60 79 20 77 61 79 20 6f 75 74 20 61 6e 64 20 73 69  y way out and si
10f70 6d 70 6c 79 20 72 65 71 75 69 72 65 20 74 68 65  mply require the
10f80 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 74 6f 20  .** GROUP BY to 
10f90 75 73 65 20 74 68 65 20 42 49 4e 41 52 59 20 63  use the BINARY c
10fa0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10fb0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
10fc0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
10fd0 72 47 72 6f 75 70 42 79 28 50 61 72 73 65 20 2a  rGroupBy(Parse *
10fe0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c  pParse, Expr *p,
10ff0 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
11000 70 42 79 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  pBy){.  Walker w
11010 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b  ;.  w.eCode = 1;
11020 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
11030 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43  ck = exprNodeIsC
11040 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79  onstantOrGroupBy
11050 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
11060 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75  lback = 0;.  w.u
11070 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
11080 75 70 42 79 3b 0a 20 20 77 2e 70 50 61 72 73 65  upBy;.  w.pParse
11090 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c   = pParse;.  sql
110a0 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
110b0 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
110c0 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eCode;.}../*.** 
110d0 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
110e0 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
110f0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
11100 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
11110 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
11120 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
11130 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
11140 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
11150 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
11160 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
11170 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
11180 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
11190 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
111a0 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
111b0 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
111c0 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
111d0 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
111e0 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
111f0 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
11200 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
11210 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
11220 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
11230 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
11240 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b   *p, u8 isInit){
11250 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69  .  assert( isIni
11260 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d  t==0 || isInit==
11270 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78  1 );.  return ex
11280 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69  prIsConst(p, 4+i
11290 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69  sInit, 0);.}..#i
112a0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
112b0 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
112c0 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
112d0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
112e0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
112f0 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
11300 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72  ins a.** subquer
11310 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20  y of some kind. 
11320 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
11330 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65  re are no subque
11340 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ries..*/.int sql
11350 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73  ite3ExprContains
11360 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a 70  Subquery(Expr *p
11370 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
11380 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20   w.eCode = 1;.  
11390 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
113a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  = sqlite3ExprWal
113b0 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65  kNoop;.  w.xSele
113c0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  ctCallback = sql
113d0 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61  ite3SelectWalkFa
113e0 69 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  il;.#ifdef SQLIT
113f0 45 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c  E_DEBUG.  w.xSel
11400 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
11410 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
11420 41 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a  Assert2;.#endif.
11430 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
11440 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
11450 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d  rn w.eCode==0;.}
11460 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
11470 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
11480 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74   p codes a const
11490 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74  ant integer that
114a0 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
114b0 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
114c0 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
114d0 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74  return 1 and put
114e0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
114f0 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20  e integer.** in 
11500 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65  *pValue.  If the
11510 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
11520 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72  ot an integer or
11530 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69   if it is too bi
11540 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  g.** to fit in a
11550 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69   signed 32-bit i
11560 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30  nteger, return 0
11570 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c   and leave *pVal
11580 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ue unchanged..*/
11590 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
115a0 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a  IsInteger(Expr *
115b0 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b  p, int *pValue){
115c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
115d0 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
115e0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
115f0 20 55 73 65 64 20 74 6f 20 6f 6e 6c 79 20 68 61   Used to only ha
11600 70 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f  ppen following o
11610 6e 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49  n OOM */..  /* I
11620 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
11630 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69  is an integer li
11640 74 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20  teral that fits 
11650 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
11660 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c  it.  ** integer,
11670 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74   then the EP_Int
11680 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20  Value flag will 
11690 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
116a0 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72  n set */.  asser
116b0 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54  t( p->op!=TK_INT
116c0 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67  EGER || (p->flag
116d0 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  s & EP_IntValue)
116e0 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  !=0.           |
116f0 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
11700 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26  2(p->u.zToken, &
11710 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  rc)==0 );..  if(
11720 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49   p->flags & EP_I
11730 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a  ntValue ){.    *
11740 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56  pValue = p->u.iV
11750 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  alue;.    return
11760 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68   1;.  }.  switch
11770 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
11780 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
11790 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
117a0 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
117b0 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65  p->pLeft, pValue
117c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
117d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
117e0 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
117f0 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69    int v;.      i
11800 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
11810 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
11820 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20  , &v) ){.       
11830 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31   assert( v!=(-21
11840 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20  47483647-1) );. 
11850 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d         *pValue =
11860 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20   -v;.        rc 
11870 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
11880 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11890 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65      default: bre
118a0 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
118b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
118c0 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
118d0 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
118e0 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
118f0 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c  sion can be NULL
11900 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
11910 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
11920 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68  be NULL or if th
11930 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
11940 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74  too complex.** t
11950 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52  o tell return TR
11960 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  UE.  .**.** This
11970 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
11980 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   as an optimizat
11990 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f  ion, to skip OP_
119a0 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  IsNull opcodes.*
119b0 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74  * when we know t
119c0 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e  hat a value cann
119d0 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e  ot be NULL.  Hen
119e0 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69  ce, a false posi
119f0 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69  tive.** (returni
11a00 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20  ng TRUE when in 
11a10 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73  fact the express
11a20 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65  ion can never be
11a30 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20   NULL) might.** 
11a40 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f  be a small perfo
11a50 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69  rmance hit but i
11a60 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d  s otherwise harm
11a70 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74  less.  On the ot
11a80 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66  her.** hand, a f
11a90 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72  alse negative (r
11aa0 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77  eturning FALSE w
11ab0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
11ac0 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a  ould be NULL).**
11ad0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73   will likely res
11ae0 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72  ult in an incorr
11af0 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20  ect answer.  So 
11b00 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72  when in doubt, r
11b10 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a  eturn.** TRUE..*
11b20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
11b30 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74  rCanBeNull(const
11b40 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20   Expr *p){.  u8 
11b50 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  op;.  while( p->
11b60 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
11b70 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
11b80 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   ){.    p = p->p
11b90 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d  Left;.  }.  op =
11ba0 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
11bb0 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
11bc0 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
11bd0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
11be0 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
11bf0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
11c00 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54  RING:.    case T
11c10 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
11c20 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  e TK_BLOB:.     
11c30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63   return 0;.    c
11c40 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
11c50 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72       return Expr
11c60 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
11c70 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a  P_CanBeNull) ||.
11c80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
11c90 79 2e 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a  y.pTab==0 ||  /*
11ca0 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f   Reference to co
11cb0 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f 6e  lumn of index on
11cc0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
11cd0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e              (p->
11ce0 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d  iColumn>=0 && p-
11cf0 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d  >y.pTab->aCol[p-
11d00 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c  >iColumn].notNul
11d10 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75  l==0);.    defau
11d20 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
11d30 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
11d40 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
11d50 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
11d60 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61  sion is a consta
11d70 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  nt which would b
11d80 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62  e.** unchanged b
11d90 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69  y OP_Affinity wi
11da0 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  th the affinity 
11db0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
11dc0 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ond.** argument.
11dd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11de0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
11df0 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
11e00 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72  OP_Affinity oper
11e10 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
11e20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69  omitted.  When i
11e30 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46  n doubt return F
11e40 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e  ALSE.  A false n
11e50 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61  egative.** is ha
11e60 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65  rmless.  A false
11e70 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76   positive, howev
11e80 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69  er, can result i
11e90 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61  n the wrong.** a
11ea0 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nswer..*/.int sq
11eb0 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
11ec0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63  AffinityChange(c
11ed0 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68  onst Expr *p, ch
11ee0 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70  ar aff){.  u8 op
11ef0 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c  ;.  if( aff==SQL
11f00 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72  ITE_AFF_BLOB ) r
11f10 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65  eturn 1;.  while
11f20 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
11f30 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
11f40 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
11f50 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
11f60 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
11f70 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
11f80 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
11f90 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
11fa0 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
11fb0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
11fc0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11fd0 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
11fe0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
11ff0 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
12000 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
12010 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
12020 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
12030 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
12040 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
12050 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
12060 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72  TRING: {.      r
12070 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
12080 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
12090 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  }.    case TK_BL
120a0 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  OB: {.      retu
120b0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
120c0 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
120d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
120e0 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20  p->iTable>=0 ); 
120f0 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20   /* p cannot be 
12100 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20  part of a CHECK 
12110 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
12120 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43      return p->iC
12130 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20  olumn<0.        
12140 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
12150 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
12160 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
12170 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d  _NUMERIC);.    }
12180 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
12190 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
121a0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
121b0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
121c0 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
121d0 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63  ng is a row-id c
121e0 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69  olumn name..*/.i
121f0 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  nt sqlite3IsRowi
12200 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  d(const char *z)
12210 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  {.  if( sqlite3S
12220 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49  trICmp(z, "_ROWI
12230 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  D_")==0 ) return
12240 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
12250 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57  3StrICmp(z, "ROW
12260 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
12270 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
12280 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44  3StrICmp(z, "OID
12290 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
122a0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
122b0 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65  ./*.** pX is the
122c0 20 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70   RHS of an IN op
122d0 65 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69  erator.  If pX i
122e0 73 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  s a SELECT state
122f0 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61  ment .** that ca
12300 6e 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20  n be simplified 
12310 74 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c  to a direct tabl
12320 65 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72  e access, then r
12330 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
12340 65 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54  er to the SELECT
12350 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20   statement.  If 
12360 70 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45  pX is not a SELE
12370 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a  CT statement,.**
12380 20 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43   or if the SELEC
12390 54 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64  T statement need
123a0 73 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74  s to be manifest
123b0 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69  ed into a transi
123c0 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68  ent.** table, th
123d0 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  en return NULL..
123e0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
123f0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
12400 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69  static Select *i
12410 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
12420 70 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20  pt(Expr *pX){.  
12430 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63  Select *p;.  Src
12440 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78  List *pSrc;.  Ex
12450 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
12460 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
12470 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45   int i;.  if( !E
12480 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
12490 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
124a0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
124b0 20 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20   Not a subquery 
124c0 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  */.  if( ExprHas
124d0 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
124e0 56 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65  VarSelect)  ) re
124f0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72  turn 0;  /* Corr
12500 65 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20  elated subq */. 
12510 20 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65   p = pX->x.pSele
12520 63 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  ct;.  if( p->pPr
12530 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ior ) return 0; 
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12550 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  Not a compound S
12560 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70  ELECT */.  if( p
12570 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
12580 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
12590 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74  regate) ){.    t
125a0 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
125b0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
125c0 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
125d0 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
125e0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
125f0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
12600 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
12610 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
12620 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
12630 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e    return 0; /* N
12640 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  o DISTINCT keywo
12650 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67  rd and no aggreg
12660 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
12670 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
12680 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
12690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
126a0 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   Has no GROUP BY
126b0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
126c0 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
126d0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
126e0 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49      /* Has no LI
126f0 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  MIT clause */.  
12700 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20  if( p->pWhere ) 
12710 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
12720 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
12730 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
12740 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
12750 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
12760 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53  c!=0 );.  if( pS
12770 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
12780 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
12790 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20   /* Single term 
127a0 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
127b0 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b  /.  if( pSrc->a[
127c0 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74  0].pSelect ) ret
127d0 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52  urn 0;     /* FR
127e0 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71  OM is not a subq
127f0 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a  uery or view */.
12800 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61    pTab = pSrc->a
12810 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65  [0].pTab;.  asse
12820 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
12830 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
12840 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20  Select==0 );    
12850 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
12860 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20  clause is not a 
12870 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73  view */.  if( Is
12880 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
12890 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
128a0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
128b0 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
128c0 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  ble */.  pEList 
128d0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61  = p->pEList;.  a
128e0 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
128f0 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c   );.  /* All SEL
12900 45 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74  ECT results must
12910 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a   be columns. */.
12920 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
12930 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
12940 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73  {.    Expr *pRes
12950 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
12960 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
12970 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  Res->op!=TK_COLU
12980 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
12990 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
129a0 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61  >iTable==pSrc->a
129b0 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20  [0].iCursor );  
129c0 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61  /* Not a correla
129d0 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ted subquery */.
129e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
129f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12a00 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12a10 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
12a20 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
12a30 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
12a40 20 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b   code that check
12a50 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
12a60 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
12a70 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65  table iCur to se
12a80 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61  e if.** it conta
12a90 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74  ins any NULL ent
12aa0 72 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65  ries.  Cause the
12ab0 20 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67   register at reg
12ac0 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65  HasNull to be se
12ad0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55  t.** to a non-NU
12ae0 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72  LL value if iCur
12af0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c   contains no NUL
12b00 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73  Ls.  Cause regis
12b10 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a  ter regHasNull.*
12b20 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e  * to be set to N
12b30 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74  ULL if iCur cont
12b40 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
12b50 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f   NULL values..*/
12b60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
12b70 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
12b80 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ag(Vdbe *v, int 
12b90 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73  iCur, int regHas
12ba0 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64  Null){.  int add
12bb0 72 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r1;.  sqlite3Vdb
12bc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
12bd0 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73  teger, 0, regHas
12be0 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d  Null);.  addr1 =
12bf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12c00 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
12c10 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65   iCur); VdbeCove
12c20 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
12c30 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12c40 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c  OP_Column, iCur,
12c50 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b   0, regHasNull);
12c60 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
12c70 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
12c80 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56  _TYPEOFARG);.  V
12c90 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
12ca0 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25  first_entry_in(%
12cb0 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73  d)", iCur));.  s
12cc0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
12cd0 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a  re(v, addr1);.}.
12ce0 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66  #endif...#ifndef
12cf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
12d00 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20  QUERY./*.** The 
12d10 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49  argument is an I
12d20 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
12d30 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
12d40 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a  bquery) on the .
12d50 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  ** right-hand si
12d60 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
12d70 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73   if that list is
12d80 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74   constant..*/.st
12d90 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
12da0 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28  InRhsIsConstant(
12db0 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78  Expr *pIn){.  Ex
12dc0 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20  pr *pLHS;.  int 
12dd0 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21  res;.  assert( !
12de0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
12df0 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  pIn, EP_xIsSelec
12e00 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70  t) );.  pLHS = p
12e10 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e  In->pLeft;.  pIn
12e20 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72  ->pLeft = 0;.  r
12e30 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  es = sqlite3Expr
12e40 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b  IsConstant(pIn);
12e50 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
12e60 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72  pLHS;.  return r
12e70 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  es;.}.#endif../*
12e80 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12e90 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
12ea0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12eb0 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20  of the IN (...) 
12ec0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65  operator..** The
12ed0 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73   pX parameter is
12ee0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
12ef0 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
12f00 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  e IN operator, w
12f10 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
12f20 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f   either a list o
12f30 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72  f expressions or
12f40 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a   a subquery..**.
12f50 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
12f60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
12f70 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
12f80 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  a b-tree object 
12f90 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75  that can.** be u
12fa0 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65  sed either to te
12fb0 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  st for membershi
12fc0 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74  p in the RHS set
12fd0 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74   or to iterate t
12fe0 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65  hrough.** all me
12ff0 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53  mbers of the RHS
13000 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64   set, skipping d
13010 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  uplicates..**.**
13020 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65   A cursor is ope
13030 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65  ned on the b-tre
13040 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  e object that is
13050 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
13060 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61  IN operator.** a
13070 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73  nd pX->iTable is
13080 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
13090 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72  x of that cursor
130a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
130b0 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68  rned value of th
130c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69  is function indi
130d0 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65  cates the b-tree
130e0 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77   type, as follow
130f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e  s:.**.**   IN_IN
13100 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d  DEX_ROWID      -
13110 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
13120 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61  opened on a data
13130 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20  base table..**  
13140 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
13150 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f  ASC  - The curso
13160 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
13170 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
13180 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
13190 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54  X_INDEX_DESC - T
131a0 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
131b0 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e  ened on a descen
131c0 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
131d0 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20   IN_INDEX_EPH   
131e0 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
131f0 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
13200 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61  a specially crea
13210 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ted and.**      
13220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13230 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68     populated eph
13240 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  eremal table..**
13250 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50     IN_INDEX_NOOP
13260 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73         - No curs
13270 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  or was allocated
13280 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  .  The IN operat
13290 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20  or must be.**   
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65        implemente
132c0 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20  d as a sequence 
132d0 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
132e0 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
132f0 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62  g b-tree might b
13300 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48  e used if the RH
13310 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20  S expression pX 
13320 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73  is a simple.** s
13330 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a  ubquery such as:
13340 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
13350 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f  T <column1>, <co
13360 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c  lumn2>... FROM <
13370 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20  table>.**.** If 
13380 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
13390 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
133a0 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63  list or a more c
133b0 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c  omplex subquery,
133c0 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65   then.** an ephe
133d0 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68  meral table migh
133e0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e  t need to be gen
133f0 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
13400 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20  RHS and then.** 
13410 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20  pX->iTable made 
13420 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
13430 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
13440 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a  instead of an.**
13450 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e   existing table.
13460 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61  .**.** The inFla
13470 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73  gs parameter mus
13480 74 20 63 6f 6e 74 61 69 6e 2c 20 61 74 20 61 20  t contain, at a 
13490 6d 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20  minimum, one of 
134a0 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49  the bits.** IN_I
134b0 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
134c0 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  or IN_INDEX_LOOP
134d0 20 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 20 20   but not both.  
134e0 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61  If inFlags conta
134f0 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  ins.** IN_INDEX_
13500 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e  MEMBERSHIP, then
13510 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74   the generated t
13520 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  able will be use
13530 64 20 66 6f 72 20 61 20 66 61 73 74 0a 2a 2a 20  d for a fast.** 
13540 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e  membership test.
13550 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e    When the IN_IN
13560 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20  DEX_LOOP bit is 
13570 73 65 74 2c 20 74 68 65 20 49 4e 20 69 6e 64 65  set, the IN inde
13580 78 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 75 73 65  x will.** be use
13590 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61  d to loop over a
135a0 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  ll values of the
135b0 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
135c0 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  perator..**.** W
135d0 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  hen IN_INDEX_LOO
135e0 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74  P is used (and t
135f0 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
13600 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
13610 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65  e.** through the
13620 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68   set members) th
13630 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  en the b-tree mu
13640 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64  st not contain d
13650 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e  uplicates..** An
13660 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
13670 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64   will be created
13680 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65   unless the sele
13690 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  cted columns are
136a0 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
136b0 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69  o be unique - ei
136c0 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20  ther because it 
136d0 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
136e0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65  IMARY KEY or due
136f0 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20   to.** a UNIQUE 
13700 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e  constraint or in
13710 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  dex..**.** When 
13720 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
13730 48 49 50 20 69 73 20 75 73 65 64 20 28 61 6e 64  HIP is used (and
13740 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c   the b-tree will
13750 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72   be used .** for
13760 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72   fast set member
13770 73 68 69 70 20 74 65 73 74 73 29 20 74 68 65 6e  ship tests) then
13780 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61   an epheremal ta
13790 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20  ble must .** be 
137a0 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c  used unless <col
137b0 75 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c  umns> is a singl
137c0 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
137d0 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20  Y KEY column or 
137e0 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e  an .** index can
137f0 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74   be found with t
13800 68 65 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f  he specified <co
13810 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65  lumns> as its le
13820 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ft-most..**.** I
13830 66 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e  f the IN_INDEX_N
13840 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e  OOP_OK and IN_IN
13850 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61  DEX_MEMBERSHIP a
13860 72 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a  re both set and.
13870 2a 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66  ** if the RHS of
13880 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
13890 20 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20   is a list (not 
138a0 61 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e  a subquery) then
138b0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
138c0 20 6d 69 67 68 74 20 64 65 63 69 64 65 20 74 68   might decide th
138d0 61 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65  at creating an e
138e0 70 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20  phemeral b-tree 
138f0 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a  for membership.*
13900 2a 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f  * testing is too
13910 20 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72   expensive and r
13920 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e  eturn IN_INDEX_N
13930 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61  OOP.  In that ca
13940 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69  se, the.** calli
13950 6e 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  ng routine shoul
13960 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  d implement the 
13970 49 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e  IN operator usin
13980 67 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  g a sequence.** 
13990 6f 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70  of Eq or Ne comp
139a0 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
139b0 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  s..**.** When th
139c0 65 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e  e b-tree is bein
139d0 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65  g used for membe
139e0 72 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65  rship tests, the
139f0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
13a00 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20  n.** might need 
13a10 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20  to know whether 
13a20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73  or not the RHS s
13a30 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  ide of the IN op
13a40 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69  erator.** contai
13a50 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70  ns a NULL.  If p
13a60 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e  rRhsHasNull is n
13a70 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  ot a NULL pointe
13a80 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65  r and .** if the
13a90 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65  re is any chance
13aa0 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
13ab0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20  might contain a 
13ac0 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a  NULL value at.**
13ad0 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61   runtime, then a
13ae0 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
13af0 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72  ocated and the r
13b00 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77  egister number w
13b10 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72  ritten.** to *pr
13b20 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74  RhsHasNull. If t
13b30 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
13b40 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29  e that the (...)
13b50 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e   contains a.** N
13b60 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ULL value, then 
13b70 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73  *prRhsHasNull is
13b80 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
13b90 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69  .**.** If a regi
13ba0 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
13bb0 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69  d and its locati
13bc0 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72  on stored in *pr
13bd0 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e  RhsHasNull, then
13be0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e  .** the value in
13bf0 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20 77   that register w
13c00 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
13c10 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69  he b-tree contai
13c20 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  ns one or more.*
13c30 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61  * NULL values, a
13c40 6e 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f  nd it will be so
13c50 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75  me non-NULL valu
13c60 65 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20  e if the b-tree 
13c70 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e  contains no.** N
13c80 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a  ULL values..**.*
13c90 2a 20 49 66 20 74 68 65 20 61 69 4d 61 70 20 70  * If the aiMap p
13ca0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
13cb0 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f  NULL, it must po
13cc0 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20  int to an array 
13cd0 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e  containing.** on
13ce0 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61  e element for ea
13cf0 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e  ch column return
13d00 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
13d10 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68   statement on th
13d20 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20  e RHS.** of the 
13d30 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  IN(...) operator
13d40 2e 20 54 68 65 20 69 27 74 68 20 65 6e 74 72 79  . The i'th entry
13d50 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73   of the array is
13d60 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
13d70 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66  the.** offset of
13d80 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
13d90 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74  n that matches t
13da0 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72  he i'th column r
13db0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a  eturned by the.*
13dc0 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78  * SELECT. For ex
13dd0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78  ample, if the ex
13de0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c  pression and sel
13df0 65 63 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a  ected index are:
13e00 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29  .**.**   (?,?,?)
13e10 20 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62   IN (SELECT a, b
13e20 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20  , c FROM t1).** 
13e30 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
13e40 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29  1 ON t1(b, c, a)
13e50 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d  ;.**.** then aiM
13e60 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65  ap[] is populate
13e70 64 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d  d with {2, 0, 1}
13e80 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
13e90 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
13ea0 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  Y.int sqlite3Fin
13eb0 64 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73  dInIndex(.  Pars
13ec0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
13ed0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
13ee0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
13ef0 78 70 72 20 2a 70 58 2c 20 20 20 20 20 20 20 20  xpr *pX,        
13f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13f10 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
13f20 20 28 52 48 53 29 20 6f 66 20 74 68 65 20 49 4e   (RHS) of the IN
13f30 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75   operator */.  u
13f40 33 32 20 69 6e 46 6c 61 67 73 2c 20 20 20 20 20  32 inFlags,     
13f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f            /* IN_
13f60 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d  INDEX_LOOP, _MEM
13f70 42 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20  BERSHIP, and/or 
13f80 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e  _NOOP_OK */.  in
13f90 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c  t *prRhsHasNull,
13fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
13fb0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c  ster holding NUL
13fc0 4c 20 73 74 61 74 75 73 2e 20 20 53 65 65 20 6e  L status.  See n
13fd0 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  otes */.  int *a
13fe0 69 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  iMap,           
13ff0 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20       /* Mapping 
14000 66 72 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c 64  from Index field
14010 73 20 74 6f 20 52 48 53 20 66 69 65 6c 64 73 20  s to RHS fields 
14020 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 20  */.  int *piTab 
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14040 2f 2a 20 4f 55 54 3a 20 69 6e 64 65 78 20 74 6f  /* OUT: index to
14050 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c   use */.){.  Sel
14060 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ect *p;         
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14080 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20     /* SELECT to 
14090 74 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20  the right of IN 
140a0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
140b0 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20  t eType = 0;    
140c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140d0 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52      /* Type of R
140e0 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44  HS table. IN_IND
140f0 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54  EX_* */.  int iT
14100 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
14110 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20  b++;            
14120 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65  /* Cursor of the
14130 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20   RHS table */.  
14140 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65  int mustBeUnique
14150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14160 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
14170 20 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69   RHS must be uni
14180 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  que */.  Vdbe *v
14190 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
141a0 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f  e(pParse);     /
141b0 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * Virtual machin
141c0 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
141d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e  ..  assert( pX->
141e0 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d  op==TK_IN );.  m
141f0 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69  ustBeUnique = (i
14200 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
14210 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f  X_LOOP)!=0;..  /
14220 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20  * If the RHS of 
14230 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65  this IN(...) ope
14240 72 61 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43  rator is a SELEC
14250 54 2c 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74  T, and if it mat
14260 74 65 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68  ters .  ** wheth
14270 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45  er or not the SE
14280 4c 45 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74  LECT result cont
14290 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73  ains NULL values
142a0 2c 20 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a  , check whether.
142b0 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c    ** or not NULL
142c0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73   is actually pos
142d0 73 69 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f  sible (it may no
142e0 74 20 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c  t be, for exampl
142f0 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20  e, due .  ** to 
14300 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
14310 69 6e 74 73 20 69 6e 20 74 68 65 20 73 63 68 65  ints in the sche
14320 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20  ma). If no NULL 
14330 76 61 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69  values are possi
14340 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72  ble,.  ** set pr
14350 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20  RhsHasNull to 0 
14360 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
14370 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52  g.  */.  if( prR
14380 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58  hsHasNull && (pX
14390 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
143a0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69  Select) ){.    i
143b0 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69  nt i;.    ExprLi
143c0 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d  st *pEList = pX-
143d0 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
143e0 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  st;.    for(i=0;
143f0 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
14400 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
14410 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
14420 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61  BeNull(pEList->a
14430 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65  [i].pExpr) ) bre
14440 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
14450 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78  ( i==pEList->nEx
14460 70 72 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68  pr ){.      prRh
14470 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  sHasNull = 0;.  
14480 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
14490 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
144a0 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
144b0 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  or index can be 
144c0 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74  used to.  ** sat
144d0 69 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20  isfy the query. 
144e0 20 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61   This is prefera
144f0 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e  ble to generatin
14500 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70  g a new .  ** ep
14510 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20  hemeral table.  
14520 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
14530 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d  >nErr==0 && (p =
14540 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
14550 6e 4f 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a  nOpt(pX))!=0 ){.
14560 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
14570 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
14580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
14590 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
145a0 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  n */.    Table *
145b0 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145d0 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e  /* Table <table>
145e0 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62  . */.    i16 iDb
145f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14610 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20  /* Database idx 
14620 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20  for pTab */.    
14630 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
14640 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
14650 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45    int nExpr = pE
14660 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  List->nExpr;..  
14670 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
14680 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ist!=0 );       
14690 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
146a0 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
146b0 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
146c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
146d0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21  ist->a[0].pExpr!
146e0 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  =0 ); /* Because
146f0 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
14700 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
14710 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72    assert( p->pSr
14720 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  c!=0 );         
14730 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
14740 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
14750 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
14760 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
14770 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
14780 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f    /* Code an OP_
14790 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  Transaction and 
147a0 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72  OP_TableLock for
147b0 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20   <table>. */.   
147c0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
147d0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
147e0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
147f0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
14800 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
14810 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
14820 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
14830 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
14840 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
14850 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73  >zName);..    as
14860 73 65 72 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c  sert(v);  /* sql
14870 69 74 65 33 47 65 74 56 64 62 65 28 29 20 68 61  ite3GetVdbe() ha
14880 73 20 61 6c 77 61 79 73 20 62 65 65 6e 20 70 72  s always been pr
14890 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20  eviously called 
148a0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 78 70 72  */.    if( nExpr
148b0 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61  ==1 && pEList->a
148c0 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75  [0].pExpr->iColu
148d0 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  mn<0 ){.      /*
148e0 20 54 68 65 20 22 78 20 49 4e 20 28 53 45 4c 45   The "x IN (SELE
148f0 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 61  CT rowid FROM ta
14900 62 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a 20 20  ble)" case */.  
14910 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20      int iAddr = 
14920 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14930 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20  0(v, OP_Once);. 
14940 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
14950 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  e(v);..      sql
14960 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
14970 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
14980 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
14990 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  ad);.      eType
149a0 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
149b0 44 3b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e  D;.      Explain
149c0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
149d0 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  e, 0,.          
149e0 20 20 22 55 53 49 4e 47 20 52 4f 57 49 44 20 53    "USING ROWID S
149f0 45 41 52 43 48 20 4f 4e 20 54 41 42 4c 45 20 25  EARCH ON TABLE %
14a00 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f  s FOR IN-OPERATO
14a10 52 22 2c 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  R",pTab->zName))
14a20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14a30 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
14a40 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Addr);.    }else
14a50 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
14a60 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14a80 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
14a90 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
14aa0 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a  ffinity_ok = 1;.
14ab0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20        int i;..  
14ac0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
14ad0 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
14ae0 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
14af0 20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68   to perform each
14b00 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61   .      ** compa
14b10 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  rison is the sam
14b20 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74  e as the affinit
14b30 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e  y of each column
14b40 20 69 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20   in table.      
14b50 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  ** on the RHS of
14b60 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
14b70 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74  .  If it not, it
14b80 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
14b90 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65   to.      ** use
14ba0 20 61 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68   any index of th
14bb0 65 20 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f  e RHS table.  */
14bc0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
14bd0 69 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e  i<nExpr && affin
14be0 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20  ity_ok; i++){.  
14bf0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73        Expr *pLhs
14c00 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
14c10 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d  FieldSubexpr(pX-
14c20 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
14c30 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
14c40 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
14c50 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
14c60 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20      char idxaff 
14c70 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f  = sqlite3TableCo
14c80 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61  lumnAffinity(pTa
14c90 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20  b,iCol); /* RHS 
14ca0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
14cb0 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73   char cmpaff = s
14cc0 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
14cd0 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61  inity(pLhs, idxa
14ce0 66 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  ff);.        tes
14cf0 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53  tcase( cmpaff==S
14d00 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
14d10 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
14d20 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49  se( cmpaff==SQLI
14d30 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
14d40 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63         switch( c
14d50 6d 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20  mpaff ){.       
14d60 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
14d70 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20  FF_BLOB:.       
14d80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14d90 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
14da0 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
14db0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
14dc0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
14dd0 79 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73  y() only returns
14de0 20 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64   TEXT if one sid
14df0 65 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20  e or the.       
14e00 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61       ** other ha
14e10 73 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e  s no affinity an
14e20 64 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65  d the other side
14e30 20 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65   is TEXT.  Hence
14e40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ,.            **
14e50 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f   the only way fo
14e60 72 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54  r cmpaff to be T
14e70 45 58 54 20 69 73 20 66 6f 72 20 69 64 78 61 66  EXT is for idxaf
14e80 66 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20  f to be TEXT.   
14e90 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
14ea0 66 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20  for the term on 
14eb0 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
14ec0 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66  N to have no aff
14ed0 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  inity. */.      
14ee0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64        assert( id
14ef0 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  xaff==SQLITE_AFF
14f00 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20  _TEXT );.       
14f10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14f20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
14f30 20 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e             affin
14f40 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33  ity_ok = sqlite3
14f50 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
14f60 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20  y(idxaff);.     
14f70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
14f80 20 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79      if( affinity
14f90 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _ok ){.        /
14fa0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
14fb0 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74  existing index t
14fc0 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f  hat will work fo
14fd0 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74  r this IN operat
14fe0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  or */.        fo
14ff0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
15000 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79  dex; pIdx && eTy
15010 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78  pe==0; pIdx=pIdx
15020 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
15030 20 20 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55      Bitmask colU
15040 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c  sed;      /* Col
15050 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
15060 78 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20  x used */.      
15070 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c      Bitmask mCol
15080 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ;         /* Mas
15090 6b 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  k for the curren
150a0 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20  t column */.    
150b0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
150c0 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20  nColumn<nExpr ) 
150d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
150e0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50      if( pIdx->pP
150f0 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 29  artIdxWhere!=0 )
15100 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
15110 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
15120 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32  nColumn is BMS-2
15130 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20  , not BMS-1, so 
15140 74 68 61 74 20 77 65 20 63 61 6e 20 63 6f 6d 70  that we can comp
15150 75 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ute.          **
15160 20 42 49 54 4d 41 53 4b 28 6e 45 78 70 72 29 20   BITMASK(nExpr) 
15170 77 69 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77  without overflow
15180 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ing */.         
15190 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d   testcase( pIdx-
151a0 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20  >nColumn==BMS-2 
151b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
151c0 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f  tcase( pIdx->nCo
151d0 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  lumn==BMS-1 );. 
151e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
151f0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d  x->nColumn>=BMS-
15200 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  1 ) continue;.  
15210 20 20 20 20 20 20 20 20 69 66 28 20 6d 75 73 74          if( must
15220 42 65 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20  BeUnique ){.    
15230 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
15240 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a  ->nKeyCol>nExpr.
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28               ||(
15260 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45  pIdx->nColumn>nE
15270 78 70 72 20 26 26 20 21 49 73 55 6e 69 71 75 65  xpr && !IsUnique
15280 49 6e 64 65 78 28 70 49 64 78 29 29 0a 20 20 20  Index(pIdx)).   
15290 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
152a0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
152b0 75 65 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e 64  ue;  /* This ind
152c0 65 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  ex is not unique
152d0 20 6f 76 65 72 20 74 68 65 20 49 4e 20 52 48 53   over the IN RHS
152e0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
152f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15300 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
15310 20 20 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20     colUsed = 0; 
15320 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20    /* Columns of 
15330 69 6e 64 65 78 20 75 73 65 64 20 73 6f 20 66 61  index used so fa
15340 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66  r */.          f
15350 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
15360 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
15370 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20     Expr *pLhs = 
15380 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
15390 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c  ldSubexpr(pX->pL
153a0 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  eft, i);.       
153b0 20 20 20 20 20 45 78 70 72 20 2a 70 52 68 73 20       Expr *pRhs 
153c0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
153d0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
153e0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20    CollSeq *pReq 
153f0 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
15400 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
15410 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73  arse, pLhs, pRhs
15420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
15430 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20  nt j;.  .       
15440 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
15450 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43  q!=0 || pRhs->iC
15460 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20  olumn==XN_ROWID 
15470 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
15480 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
15490 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b  or(j=0; j<nExpr;
154a0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
154b0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
154c0 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73  iColumn[j]!=pRhs
154d0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->iColumn ) cont
154e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
154f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
15500 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20  ->azColl[j] );. 
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
15520 20 70 52 65 71 21 3d 30 20 26 26 20 73 71 6c 69   pReq!=0 && sqli
15530 74 65 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d  te3StrICmp(pReq-
15540 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a  >zName, pIdx->az
15550 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20  Coll[j])!=0 ){. 
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
15570 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
15580 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15590 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
155a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
155b0 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e          if( j==n
155c0 45 78 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  Expr ) break;.  
155d0 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d            mCol =
155e0 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20   MASKBIT(j);.   
155f0 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 43 6f           if( mCo
15600 6c 20 26 20 63 6f 6c 55 73 65 64 20 29 20 62 72  l & colUsed ) br
15610 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c  eak; /* Each col
15620 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e  umn used only on
15630 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ce */.          
15640 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f    colUsed |= mCo
15650 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  l;.            i
15660 66 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61 70  f( aiMap ) aiMap
15670 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  [i] = j;.       
15680 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
15690 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 45 78    assert( i==nEx
156a0 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28  pr || colUsed!=(
156b0 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31  MASKBIT(nExpr)-1
156c0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
156d0 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53  f( colUsed==(MAS
156e0 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29  KBIT(nExpr)-1) )
156f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
15700 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
15710 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65  s point, that me
15720 61 6e 73 20 74 68 65 20 69 6e 64 65 78 20 70 49  ans the index pI
15730 64 78 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a  dx is usable */.
15740 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
15750 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  iAddr = sqlite3V
15760 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
15770 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
15780 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
15790 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
157a0 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c  Plan((pParse, 0,
157b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
157c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
157d0 55 53 49 4e 47 20 49 4e 44 45 58 20 25 73 20 46  USING INDEX %s F
157e0 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c  OR IN-OPERATOR",
157f0 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pIdx->zName));. 
15800 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15810 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15820 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61  OP_OpenRead, iTa
15830 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  b, pIdx->tnum, i
15840 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Db);.           
15850 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
15860 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
15870 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
15880 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
15890 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
158a0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
158b0 20 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f       assert( IN_
158c0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
158d0 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44   == IN_INDEX_IND
158e0 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20  EX_ASC+1 );.    
158f0 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
15900 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
15910 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74  SC + pIdx->aSort
15920 4f 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20 20 20  Order[0];.  .   
15930 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72 52           if( prR
15940 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23 69 66  hsHasNull ){.#if
15950 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15960 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41  E_COLUMN_USED_MA
15970 53 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  SK.             
15980 20 69 36 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c   i64 mask = (1<<
15990 6e 45 78 70 72 29 2d 31 3b 0a 20 20 20 20 20 20  nExpr)-1;.      
159a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
159b0 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
159c0 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c   OP_ColumnsUsed,
159d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
159e0 20 20 20 20 69 54 61 62 2c 20 30 2c 20 30 2c 20      iTab, 0, 0, 
159f0 28 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49  (u8*)&mask, P4_I
15a00 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NT64);.#endif.  
15a10 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52              *prR
15a20 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50  hsHasNull = ++pP
15a30 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
15a40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 45            if( nE
15a50 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr==1 ){.      
15a60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15a70 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
15a80 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48  v, iTab, *prRhsH
15a90 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  asNull);.       
15aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15ac0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
15ad0 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
15ae0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15af0 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c        } /* End l
15b00 6f 6f 70 20 6f 76 65 72 20 69 6e 64 65 78 65 73  oop over indexes
15b10 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45   */.      } /* E
15b20 6e 64 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f  nd if( affinity_
15b30 6f 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a  ok ) */.    } /*
15b40 20 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e 20 72   End if not an r
15b50 6f 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  owid index */.  
15b60 7d 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d 70 74  } /* End attempt
15b70 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75 73 69   to optimize usi
15b80 6e 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a  ng an index */..
15b90 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78    /* If no preex
15ba0 69 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20  isting index is 
15bb0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68  available for th
15bc0 65 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a  e IN clause.  **
15bd0 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   and IN_INDEX_NO
15be0 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64  OP is an allowed
15bf0 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20   reply.  ** and 
15c00 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
15c10 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
15c20 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71  list, not a subq
15c30 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  uery.  ** and th
15c40 65 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  e RHS is not con
15c50 73 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f  stant or has two
15c60 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c   or fewer terms,
15c70 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  .  ** then it is
15c80 20 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74   not worth creat
15c90 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
15ca0 20 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61   table to evalua
15cb0 74 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f  te.  ** the IN o
15cc0 70 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72  perator so retur
15cd0 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e  n IN_INDEX_NOOP.
15ce0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
15cf0 65 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c  e==0.   && (inFl
15d00 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e  ags & IN_INDEX_N
15d10 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45  OOP_OK).   && !E
15d20 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
15d30 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
15d40 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33  .   && (!sqlite3
15d50 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28  InRhsIsConstant(
15d60 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69  pX) || pX->x.pLi
15d70 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20  st->nExpr<=2).  
15d80 29 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  ){.    eType = I
15d90 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20  N_INDEX_NOOP;.  
15da0 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  }..  if( eType==
15db0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c  0 ){.    /* Coul
15dc0 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78  d not find an ex
15dd0 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20  isting table or 
15de0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20  index to use as 
15df0 74 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a  the RHS b-tree..
15e00 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68      ** We will h
15e10 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20  ave to generate 
15e20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
15e30 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62  le to do the job
15e40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32  ..    */.    u32
15e50 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
15e60 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
15e70 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72  yLoop;.    int r
15e80 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b  MayHaveNull = 0;
15e90 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
15ea0 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69  INDEX_EPH;.    i
15eb0 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f  f( inFlags & IN_
15ec0 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20  INDEX_LOOP ){.  
15ed0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
15ee0 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20  ryLoop = 0;.    
15ef0 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48  }else if( prRhsH
15f00 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  asNull ){.      
15f10 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  *prRhsHasNull = 
15f20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b  rMayHaveNull = +
15f30 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
15f40 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
15f50 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
15f60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
15f70 65 52 68 73 4f 66 49 4e 28 70 50 61 72 73 65 2c  eRhsOfIN(pParse,
15f80 20 70 58 2c 20 69 54 61 62 29 3b 0a 20 20 20 20   pX, iTab);.    
15f90 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  if( rMayHaveNull
15fa0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15fb0 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
15fc0 76 2c 20 69 54 61 62 2c 20 72 4d 61 79 48 61 76  v, iTab, rMayHav
15fd0 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  eNull);.    }.  
15fe0 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
15ff0 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65  Loop = savedNQue
16000 72 79 4c 6f 6f 70 3b 0a 20 20 7d 0a 0a 20 20 69  ryLoop;.  }..  i
16010 66 28 20 61 69 4d 61 70 20 26 26 20 65 54 79 70  f( aiMap && eTyp
16020 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e!=IN_INDEX_INDE
16030 58 5f 41 53 43 20 26 26 20 65 54 79 70 65 21 3d  X_ASC && eType!=
16040 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
16050 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ESC ){.    int i
16060 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c  , n;.    n = sql
16070 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
16080 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  ze(pX->pLeft);. 
16090 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
160a0 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d   i++) aiMap[i] =
160b0 20 69 3b 0a 20 20 7d 0a 20 20 2a 70 69 54 61 62   i;.  }.  *piTab
160c0 20 3d 20 69 54 61 62 3b 0a 20 20 72 65 74 75 72   = iTab;.  retur
160d0 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69  n eType;.}.#endi
160e0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
160f0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
16100 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
16110 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f  Expr is an (?, ?
16120 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70  ...) IN(...) exp
16130 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a  ression. This .*
16140 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  * function alloc
16150 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
16160 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
16170 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  d string contain
16180 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69  ing .** the affi
16190 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75 73 65  nities to be use
161a0 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  d for each colum
161b0 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  n of the compari
161c0 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  son..**.** It is
161d0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
161e0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
161f0 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  r to ensure that
16200 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   the returned.**
16210 20 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74   string is event
16220 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
16230 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  g sqlite3DbFree(
16240 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  )..*/.static cha
16250 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74  r *exprINAffinit
16260 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
16270 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
16280 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
16290 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
162a0 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65  nt nVal = sqlite
162b0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
162c0 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74  pLeft);.  Select
162d0 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78   *pSelect = (pEx
162e0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pr->flags & EP_x
162f0 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70  IsSelect) ? pExp
16300 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30  r->x.pSelect : 0
16310 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a  ;.  char *zRet;.
16320 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
16330 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
16340 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44   zRet = sqlite3D
16350 62 4d 61 6c 6c 6f 63 52 61 77 28 70 50 61 72 73  bMallocRaw(pPars
16360 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a  e->db, nVal+1);.
16370 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20    if( zRet ){.  
16380 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
16390 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b  (i=0; i<nVal; i+
163a0 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
163b0 70 41 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  pA = sqlite3Vect
163c0 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
163d0 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
163e0 63 68 61 72 20 61 20 3d 20 73 71 6c 69 74 65 33  char a = sqlite3
163f0 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 41 29  ExprAffinity(pA)
16400 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  ;.      if( pSel
16410 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ect ){.        z
16420 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  Ret[i] = sqlite3
16430 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
16440 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
16450 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b  >a[i].pExpr, a);
16460 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16470 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20        zRet[i] = 
16480 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  a;.      }.    }
16490 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20  .    zRet[nVal] 
164a0 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65  = '\0';.  }.  re
164b0 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e  turn zRet;.}.#en
164c0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
164d0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
164e0 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65  Y./*.** Load the
164f0 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70 61   Parse object pa
16500 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
16510 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  t argument with 
16520 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73  an error .** mes
16530 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  sage of the form
16540 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73  :.**.**   "sub-s
16550 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20  elect returns N 
16560 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74  columns - expect
16570 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64  ed M".*/   .void
16580 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
16590 74 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50  tError(Parse *pP
165a0 61 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75 61  arse, int nActua
165b0 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29 7b  l, int nExpect){
165c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
165d0 46 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65 63  Fmt = "sub-selec
165e0 74 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f 6c  t returns %d col
165f0 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20  umns - expected 
16600 25 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45 72  %d";.  sqlite3Er
16610 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a  rorMsg(pParse, z
16620 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45  Fmt, nActual, nE
16630 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  xpect);.}.#endif
16640 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
16650 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76 65  on pExpr is a ve
16660 63 74 6f 72 20 74 68 61 74 20 68 61 73 20 62 65  ctor that has be
16670 65 6e 20 75 73 65 64 20 69 6e 20 61 20 63 6f 6e  en used in a con
16680 74 65 78 74 20 77 68 65 72 65 0a 2a 2a 20 69 74  text where.** it
16690 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65   is not permitte
166a0 64 2e 20 49 66 20 70 45 78 70 72 20 69 73 20 61  d. If pExpr is a
166b0 20 73 75 62 2d 73 65 6c 65 63 74 20 76 65 63 74   sub-select vect
166c0 6f 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  or, this routine
166d0 20 0a 2a 2a 20 6c 6f 61 64 73 20 74 68 65 20 50   .** loads the P
166e0 61 72 73 65 20 6f 62 6a 65 63 74 20 77 69 74 68  arse object with
166f0 20 61 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68   a message of th
16700 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
16710 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75  "sub-select retu
16720 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20  rns N columns - 
16730 65 78 70 65 63 74 65 64 20 31 22 0a 2a 2a 0a 2a  expected 1".**.*
16740 2a 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20 61  * Or, if it is a
16750 20 72 65 67 75 6c 61 72 20 73 63 61 6c 61 72 20   regular scalar 
16760 76 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  vector:.**.**   
16770 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
16780 65 64 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73  ed".*/   .void s
16790 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f  qlite3VectorErro
167a0 72 4d 73 67 28 50 61 72 73 65 20 2a 70 50 61 72  rMsg(Parse *pPar
167b0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
167c0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
167d0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
167e0 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
167f0 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
16800 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
16810 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50  ubselectError(pP
16820 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70  arse, pExpr->x.p
16830 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
16840 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 7d 65 6c  nExpr, 1);.  }el
16850 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
16860 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16870 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
16880 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
16890 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
168a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
168b0 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
168c0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
168d0 6c 20 63 6f 6e 73 74 72 75 63 74 20 61 6e 20 65  l construct an e
168e0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 63  phemeral table c
168f0 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 74 65  ontaining all te
16900 72 6d 73 0a 2a 2a 20 69 6e 20 74 68 65 20 52 48  rms.** in the RH
16910 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61  S of an IN opera
16920 74 6f 72 2e 20 20 54 68 65 20 49 4e 20 6f 70 65  tor.  The IN ope
16930 72 61 74 6f 72 20 63 61 6e 20 62 65 20 69 6e 20  rator can be in 
16940 65 69 74 68 65 72 20 6f 66 20 74 77 6f 0a 2a 2a  either of two.**
16950 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   forms:.**.**   
16960 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20    x IN (4,5,11) 
16970 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
16980 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
16990 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68   list on right-h
169a0 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20  and side.**     
169b0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46  x IN (SELECT a F
169c0 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e  ROM b)     -- IN
169d0 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73   operator with s
169e0 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72  ubquery on the r
169f0 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ight.**.** The p
16a00 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 69  Expr parameter i
16a10 73 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  s the IN operato
16a20 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e  r.  The cursor n
16a30 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 2a 2a  umber for the.**
16a40 20 63 6f 6e 73 74 72 75 63 74 65 64 20 65 70 68   constructed eph
16a50 65 72 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73  ermeral table is
16a60 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 20   returned.  The 
16a70 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 65  first time the e
16a80 70 68 65 6d 65 72 61 6c 0a 2a 2a 20 74 61 62 6c  phemeral.** tabl
16a90 65 20 69 73 20 63 6f 6d 70 75 74 65 64 2c 20 74  e is computed, t
16aa0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
16ab0 20 69 73 20 61 6c 73 6f 20 73 74 6f 72 65 64 20   is also stored 
16ac0 69 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  in pExpr->iTable
16ad0 2c 0a 2a 2a 20 68 6f 77 65 76 65 72 20 74 68 65  ,.** however the
16ae0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 72   cursor number r
16af0 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20 6e 6f  eturned might no
16b00 74 20 62 65 20 74 68 65 20 73 61 6d 65 2c 20 61  t be the same, a
16b10 73 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 68 61  s it might.** ha
16b20 76 65 20 62 65 65 6e 20 64 75 70 6c 69 63 61 74  ve been duplicat
16b30 65 64 20 75 73 69 6e 67 20 4f 50 5f 4f 70 65 6e  ed using OP_Open
16b40 44 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  Dup..**.** If th
16b50 65 20 4c 48 53 20 65 78 70 72 65 73 73 69 6f 6e  e LHS expression
16b60 20 28 22 78 22 20 69 6e 20 74 68 65 20 65 78 61   ("x" in the exa
16b70 6d 70 6c 65 73 29 20 69 73 20 61 20 63 6f 6c 75  mples) is a colu
16b80 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 0a 2a 2a 20  mn value, or.** 
16b90 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
16ba0 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63  ment returns a c
16bb0 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65  olumn value, the
16bc0 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  n the affinity o
16bd0 66 20 74 68 61 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  f that.** column
16be0 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c   is used to buil
16bf0 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73  d the index keys
16c00 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e  . If both 'x' an
16c10 64 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e  d the.** SELECT.
16c20 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
16c30 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
16c40 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20  umeric affinity 
16c50 69 73 20 75 73 65 64 0a 2a 2a 20 69 66 20 65 69  is used.** if ei
16c60 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20  ther column has 
16c70 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47  NUMERIC or INTEG
16c80 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20  ER affinity. If 
16c90 6e 65 69 74 68 65 72 0a 2a 2a 20 27 78 27 20 6e  neither.** 'x' n
16ca0 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
16cb0 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
16cc0 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
16cd0 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 2a 2a  eric affinity.**
16ce0 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69   is used..*/.voi
16cf0 64 20 73 71 6c 69 74 65 33 43 6f 64 65 52 68 73  d sqlite3CodeRhs
16d00 4f 66 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70  OfIN(.  Parse *p
16d10 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
16d20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
16d30 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
16d40 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
16d50 2f 2a 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  /* The IN operat
16d60 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  or */.  int iTab
16d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d80 2f 2a 20 55 73 65 20 74 68 69 73 20 63 75 72 73  /* Use this curs
16d90 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  or number */.){.
16da0 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d    int addrOnce =
16db0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
16dc0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
16dd0 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74  OP_Once instruct
16de0 69 6f 6e 20 61 74 20 74 6f 70 20 2a 2f 0a 20 20  ion at top */.  
16df0 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
16e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16e10 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65  ddress of OP_Ope
16e20 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
16e30 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  uction */.  Expr
16e40 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20   *pLeft;        
16e50 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 4c          /* the L
16e60 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
16e70 72 61 74 6f 72 20 2a 2f 0a 20 20 4b 65 79 49 6e  rator */.  KeyIn
16e80 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30  fo *pKeyInfo = 0
16e90 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e  ;      /* Key in
16ea0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  formation */.  i
16eb0 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20  nt nVal;        
16ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
16ed0 7a 65 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65  ze of vector pLe
16ee0 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f00 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
16f10 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e  red statement un
16f20 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
16f30 20 2a 2f 0a 0a 20 20 76 20 3d 20 70 50 61 72 73   */..  v = pPars
16f40 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
16f50 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f  rt( v!=0 );..  /
16f60 2a 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  * The evaluation
16f70 20 6f 66 20 74 68 65 20 49 4e 20 6d 75 73 74 20   of the IN must 
16f80 62 65 20 72 65 70 65 61 74 65 64 20 65 76 65 72  be repeated ever
16f90 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69  y time it.  ** i
16fa0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66  s encountered if
16fb0 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
16fc0 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20  owing is true:. 
16fd0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54   **.  **    *  T
16fe0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
16ff0 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  de is a correlat
17000 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  ed subquery.  **
17010 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
17020 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e  -hand side is an
17030 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
17040 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69   containing vari
17050 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20  ables.  **    * 
17060 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61   We are inside a
17070 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20   trigger.  **.  
17080 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  ** If all of the
17090 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65   above are false
170a0 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 63 6f  , then we can co
170b0 6d 70 75 74 65 20 74 68 65 20 52 48 53 20 6a 75  mpute the RHS ju
170c0 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 61 6e 64  st once.  ** and
170d0 20 72 65 75 73 65 20 69 74 20 6d 61 6e 79 20 6e   reuse it many n
170e0 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ames..  */.  if(
170f0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
17100 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
17110 65 6c 65 63 74 29 20 26 26 20 70 50 61 72 73 65  elect) && pParse
17120 2d 3e 69 53 65 6c 66 54 61 62 3d 3d 30 20 29 7b  ->iSelfTab==0 ){
17130 0a 20 20 20 20 2f 2a 20 52 65 75 73 65 20 6f 66  .    /* Reuse of
17140 20 74 68 65 20 52 48 53 20 69 73 20 61 6c 6c 6f   the RHS is allo
17150 77 65 64 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  wed */.    /* If
17160 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   this routine ha
17170 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
17180 6f 64 65 64 2c 20 62 75 74 20 74 68 65 20 70 72  oded, but the pr
17190 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20  evious code.    
171a0 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76  ** might not hav
171b0 65 20 62 65 65 6e 20 69 6e 76 6f 6b 65 64 20 79  e been invoked y
171c0 65 74 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 69 74  et, so invoke it
171d0 20 6e 6f 77 20 61 73 20 61 20 73 75 62 72 6f 75   now as a subrou
171e0 74 69 6e 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  tine. .    */.  
171f0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
17200 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
17210 53 75 62 72 74 6e 29 20 29 7b 0a 20 20 20 20 20  Subrtn) ){.     
17220 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69   addrOnce = sqli
17230 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
17240 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
17250 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17260 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
17270 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
17280 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
17290 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
172a0 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
172b0 30 2c 20 22 52 45 55 53 45 20 4c 49 53 54 20 53  0, "REUSE LIST S
172c0 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20  UBQUERY %d",.   
172d0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
172e0 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 73 65 6c  ->x.pSelect->sel
172f0 49 64 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Id));.      }.  
17300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17310 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
17320 62 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e  b, pExpr->y.sub.
17330 72 65 67 52 65 74 75 72 6e 2c 0a 20 20 20 20 20  regReturn,.     
17340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17350 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e     pExpr->y.sub.
17360 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71  iAddr);.      sq
17370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17380 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 69  v, OP_OpenDup, i
17390 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Tab, pExpr->iTab
173a0 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  le);.      sqlit
173b0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
173c0 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20  , addrOnce);.   
173d0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
173e0 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 63  ..    /* Begin c
173f0 6f 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  oding the subrou
17400 74 69 6e 65 20 2a 2f 0a 20 20 20 20 45 78 70 72  tine */.    Expr
17410 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
17420 72 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b 0a 20  r, EP_Subrtn);. 
17430 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e     pExpr->y.sub.
17440 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
17450 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
17460 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64  pExpr->y.sub.iAd
17470 64 72 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  dr =.      sqlit
17480 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17490 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
174a0 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52  Expr->y.sub.regR
174b0 65 74 75 72 6e 29 20 2b 20 31 3b 0a 20 20 20 20  eturn) + 1;.    
174c0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
174d0 22 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 22  "return address"
174e0 29 29 3b 0a 0a 20 20 20 20 61 64 64 72 4f 6e 63  ));..    addrOnc
174f0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
17500 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
17510 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
17520 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  v);.  }..  /* Ch
17530 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
17540 69 73 20 69 73 20 61 20 76 65 63 74 6f 72 20 49  is is a vector I
17550 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
17560 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
17570 4c 65 66 74 3b 0a 20 20 6e 56 61 6c 20 3d 20 73  Left;.  nVal = s
17580 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
17590 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 0a 20 20  Size(pLeft);..  
175a0 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
175b0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
175c0 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 74 61   that will conta
175d0 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  in the content o
175e0 66 0a 20 20 2a 2a 20 52 48 53 20 6f 66 20 74 68  f.  ** RHS of th
175f0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20  e IN operator.. 
17600 20 2a 2f 0a 20 20 70 45 78 70 72 2d 3e 69 54 61   */.  pExpr->iTa
17610 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 61 64  ble = iTab;.  ad
17620 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
17630 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
17640 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70  nEphemeral, pExp
17650 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 56 61 6c 29  r->iTable, nVal)
17660 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
17670 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
17680 4f 4d 4d 45 4e 54 53 0a 20 20 69 66 28 20 45 78  OMMENTS.  if( Ex
17690 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
176a0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
176b0 74 29 20 29 7b 0a 20 20 20 20 56 64 62 65 43 6f  t) ){.    VdbeCo
176c0 6d 6d 65 6e 74 28 28 76 2c 20 22 52 65 73 75 6c  mment((v, "Resul
176d0 74 20 6f 66 20 53 45 4c 45 43 54 20 25 75 22 2c  t of SELECT %u",
176e0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
176f0 74 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 7d 65  t->selId));.  }e
17700 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 43 6f 6d  lse{.    VdbeCom
17710 6d 65 6e 74 28 28 76 2c 20 22 52 48 53 20 6f 66  ment((v, "RHS of
17720 20 49 4e 20 6f 70 65 72 61 74 6f 72 22 29 29 3b   IN operator"));
17730 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4b  .  }.#endif.  pK
17740 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
17750 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
17760 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31  rse->db, nVal, 1
17770 29 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61  );..  if( ExprHa
17780 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
17790 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
177a0 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a  {.    /* Case 1:
177b0 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
177c0 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 2a 2a  LECT ...).    **
177d0 0a 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65  .    ** Generate
177e0 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
177f0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
17800 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68  e select into th
17810 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
17820 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
17830 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
17840 6f 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ove..    */.    
17850 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
17860 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
17870 63 74 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ct;.    ExprList
17880 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65   *pEList = pSele
17890 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20  ct->pEList;..   
178a0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
178b0 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25  n((pParse, 1, "%
178c0 73 4c 49 53 54 20 53 55 42 51 55 45 52 59 20 25  sLIST SUBQUERY %
178d0 64 22 2c 0a 20 20 20 20 20 20 20 20 61 64 64 72  d",.        addr
178e0 4f 6e 63 65 3f 22 22 3a 22 43 4f 52 52 45 4c 41  Once?"":"CORRELA
178f0 54 45 44 20 22 2c 20 70 53 65 6c 65 63 74 2d 3e  TED ", pSelect->
17900 73 65 6c 49 64 0a 20 20 20 20 29 29 3b 0a 20 20  selId.    ));.  
17910 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20    /* If the LHS 
17920 61 6e 64 20 52 48 53 20 6f 66 20 74 68 65 20 49  and RHS of the I
17930 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f  N operator do no
17940 74 20 6d 61 74 63 68 2c 20 74 68 61 74 0a 20 20  t match, that.  
17950 20 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c 20    ** error will 
17960 68 61 76 65 20 62 65 65 6e 20 63 61 75 67 68 74  have been caught
17970 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77 65 20   long before we 
17980 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
17990 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 41 4c 57  . */.    if( ALW
179a0 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70  AYS(pEList->nExp
179b0 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20  r==nVal) ){.    
179c0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
179d0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  t;.      int i;.
179e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
179f0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
17a00 74 2c 20 53 52 54 5f 53 65 74 2c 20 69 54 61 62  t, SRT_Set, iTab
17a10 29 3b 0a 20 20 20 20 20 20 64 65 73 74 2e 7a 41  );.      dest.zA
17a20 66 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41  ffSdst = exprINA
17a30 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
17a40 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 53  pExpr);.      pS
17a50 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20  elect->iLimit = 
17a60 30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  0;.      testcas
17a70 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  e( pSelect->selF
17a80 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
17a90 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ct );.      test
17aa0 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d  case( pKeyInfo==
17ab0 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62  0 ); /* Caused b
17ac0 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33  y OOM in sqlite3
17ad0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a  KeyInfoAlloc() *
17ae0 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
17af0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
17b00 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74  , pSelect, &dest
17b10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
17b20 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
17b30 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66  e->db, dest.zAff
17b40 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Sdst);.        s
17b50 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
17b60 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  ef(pKeyInfo);.  
17b70 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
17b80 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
17b90 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
17ba0 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53  ->db, dest.zAffS
17bb0 64 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  dst);.      asse
17bc0 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20  rt( pKeyInfo!=0 
17bd0 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63  ); /* OOM will c
17be0 61 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20  ause exit after 
17bf0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
17c00 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
17c10 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
17c20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
17c30 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
17c40 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
17c50 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
17c60 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29  teable(pKeyInfo)
17c70 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
17c80 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b  0; i<nVal; i++){
17c90 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
17ca0 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
17cb0 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65  FieldSubexpr(pLe
17cc0 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
17cd0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
17ce0 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  i] = sqlite3Bina
17cf0 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
17d00 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
17d10 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2d  arse, p, pEList-
17d20 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20 20 20  >a[i].pExpr.    
17d30 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
17d40 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
17d50 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
17d60 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  .pList!=0) ){.  
17d70 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20    /* Case 2:    
17d80 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
17d90 73 74 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  st).    **.    *
17da0 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65  * For each expre
17db0 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20  ssion, build an 
17dc0 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74  index key from t
17dd0 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e  he evaluation an
17de0 64 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69  d.    ** store i
17df0 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  t in the tempora
17e00 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78  ry table. If <ex
17e10 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  pr> is a column,
17e20 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 2a 2a   then use.    **
17e30 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66   that columns af
17e40 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c  finity when buil
17e50 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e  ding index keys.
17e60 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f   If <expr> is no
17e70 74 0a 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d  t.    ** a colum
17e80 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61  n, use numeric a
17e90 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
17ea0 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
17eb0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  y;            /*
17ec0 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   Affinity of the
17ed0 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a   LHS of the IN *
17ee0 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
17ef0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
17f00 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
17f10 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  t;.    struct Ex
17f20 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
17f30 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 31 2c 20  em;.    int r1, 
17f40 72 32 2c 20 72 33 3b 0a 20 20 20 20 61 66 66 69  r2, r3;.    affi
17f50 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
17f60 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74  prAffinity(pLeft
17f70 29 3b 0a 20 20 20 20 69 66 28 20 21 61 66 66 69  );.    if( !affi
17f80 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 61 66  nity ){.      af
17f90 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
17fa0 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a  AFF_BLOB;.    }.
17fb0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
17fc0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
17fd0 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
17fe0 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
17ff0 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 70  Info) );.      p
18000 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
18010 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
18020 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
18030 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
18040 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70    }..    /* Loop
18050 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
18060 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70  pression in <exp
18070 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 72  rlist>. */.    r
18080 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
18090 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
180a0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47     r2 = sqlite3G
180b0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
180c0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 4c 69  );.    for(i=pLi
180d0 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
180e0 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20  =pList->a; i>0; 
180f0 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
18100 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d       Expr *pE2 =
18110 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a   pItem->pExpr;..
18120 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
18130 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
18140 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20  t constant then 
18150 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a  we will need to.
18160 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
18170 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
18180 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
18190 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
181a0 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  re.      ** this
181b0 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75   code only execu
181c0 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75  tes once.  Becau
181d0 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e  se for a non-con
181e0 73 74 61 6e 74 0a 20 20 20 20 20 20 2a 2a 20 65  stant.      ** e
181f0 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65  xpression we nee
18200 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20  d to rerun this 
18210 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a  code each time..
18220 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
18230 66 28 20 61 64 64 72 4f 6e 63 65 20 26 26 20 21  f( addrOnce && !
18240 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
18250 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
18260 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18270 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
18280 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20   addrOnce);.    
18290 20 20 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f      ExprClearPro
182a0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
182b0 53 75 62 72 74 6e 29 3b 0a 20 20 20 20 20 20 20  Subrtn);.       
182c0 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20   addrOnce = 0;. 
182d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
182e0 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78   Evaluate the ex
182f0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73  pression and ins
18300 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
18310 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
18320 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33      r3 = sqlite3
18330 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
18340 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b  Parse, pE2, r1);
18350 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18360 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
18370 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31  akeRecord, r3, 1
18380 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
18390 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
183a0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
183b0 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
183c0 20 69 54 61 62 2c 20 72 32 2c 20 72 33 2c 20 31   iTab, r2, r3, 1
183d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
183e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
183f0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
18400 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
18410 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
18420 2c 20 72 32 29 3b 0a 20 20 7d 0a 20 20 69 66 28  , r2);.  }.  if(
18430 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
18440 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
18450 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76  geP4(v, addr, (v
18460 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  oid *)pKeyInfo, 
18470 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 7d  P4_KEYINFO);.  }
18480 0a 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20  .  if( addrOnce 
18490 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
184a0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
184b0 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 2f 2a 20  drOnce);.    /* 
184c0 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  Subroutine retur
184d0 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  n */.    sqlite3
184e0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
184f0 5f 52 65 74 75 72 6e 2c 20 70 45 78 70 72 2d 3e  _Return, pExpr->
18500 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29  y.sub.regReturn)
18510 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
18520 65 43 68 61 6e 67 65 50 31 28 76 2c 20 70 45 78  eChangeP1(v, pEx
18530 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 2d  pr->y.sub.iAddr-
18540 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  1, sqlite3VdbeCu
18550 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b  rrentAddr(v)-1);
18560 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
18570 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
18580 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  QUERY */../*.** 
18590 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
185a0 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72  r scalar subquer
185b0 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73 75  ies used as a su
185c0 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f  bquery expressio
185d0 6e 0a 2a 2a 20 6f 72 20 45 58 49 53 54 53 20 6f  n.** or EXISTS o
185e0 70 65 72 61 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20  perator:.**.**  
185f0 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f     (SELECT a FRO
18600 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d  M b)          --
18610 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
18620 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20   EXISTS (SELECT 
18630 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45  a FROM b)   -- E
18640 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a  XISTS subquery.*
18650 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70  *.** The pExpr p
18660 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
18670 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53  SELECT or EXISTS
18680 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
18690 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  coded..**.** The
186a0 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68   register that h
186b0 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 2e  olds the result.
186c0 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f    For a multi-co
186d0 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 0a 2a 2a  lumn SELECT, .**
186e0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
186f0 74 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69  tored in a conti
18700 67 75 6f 75 73 20 61 72 72 61 79 20 6f 66 20 72  guous array of r
18710 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
18720 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
18730 20 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72   is the register
18740 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   of the left-mos
18750 74 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e  t result column.
18760 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
18770 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
18780 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
18790 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
187a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65  .int sqlite3Code
187b0 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20  Subselect(Parse 
187c0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
187d0 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 61 64 64  Expr){.  int add
187e0 72 4f 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20  rOnce = 0;      
187f0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18800 6f 66 20 4f 50 5f 4f 6e 63 65 20 61 74 20 74 6f  of OP_Once at to
18810 70 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20  p of subroutine 
18820 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20  */.  int rReg = 
18830 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
18840 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f   /* Register sto
18850 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a  ring resulting *
18860 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
18870 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18880 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
18890 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f  ent to encode */
188a0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
188b0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
188c0 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69  * How to deal wi
188d0 74 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  th SELECT result
188e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20   */.  int nReg; 
188f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18900 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74    /* Registers t
18910 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
18920 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20  Expr *pLimit;   
18930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18940 65 77 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73  ew limit express
18950 69 6f 6e 20 2a 2f 0a 0a 20 20 56 64 62 65 20 2a  ion */..  Vdbe *
18960 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
18970 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
18980 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
18990 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
189a0 58 49 53 54 53 20 29 3b 0a 20 20 74 65 73 74 63  XISTS );.  testc
189b0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
189c0 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 61  TK_SELECT );.  a
189d0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
189e0 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70  ==TK_EXISTS || p
189f0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
18a00 45 43 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ECT );.  assert(
18a10 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
18a20 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
18a30 6c 65 63 74 29 20 29 3b 0a 20 20 70 53 65 6c 20  lect) );.  pSel 
18a40 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
18a50 63 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76  ct;..  /* The ev
18a60 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  aluation of the 
18a70 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75  EXISTS/SELECT mu
18a80 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65  st be repeated e
18a90 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a  very time it.  *
18aa0 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
18ab0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
18ac0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
18ad0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
18ae0 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
18af0 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
18b00 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
18b10 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
18b20 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
18b30 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
18b40 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
18b50 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
18b60 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
18b70 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
18b80 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
18b90 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
18ba0 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
18bb0 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
18bc0 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
18bd0 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
18be0 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
18bf0 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
18c00 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
18c10 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
18c20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
18c30 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
18c40 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  lect) ){.    /* 
18c50 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
18c60 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
18c70 20 63 6f 64 65 64 2c 20 74 68 65 6e 20 69 6e 76   coded, then inv
18c80 6f 6b 65 20 69 74 20 61 73 20 61 0a 20 20 20 20  oke it as a.    
18c90 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 2a  ** subroutine. *
18ca0 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  /.    if( ExprHa
18cb0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
18cc0 20 45 50 5f 53 75 62 72 74 6e 29 20 29 7b 0a 20   EP_Subrtn) ){. 
18cd0 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
18ce0 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
18cf0 2c 20 22 52 45 55 53 45 20 53 55 42 51 55 45 52  , "REUSE SUBQUER
18d00 59 20 25 64 22 2c 20 70 53 65 6c 2d 3e 73 65 6c  Y %d", pSel->sel
18d10 49 64 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Id));.      sqli
18d20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18d30 20 4f 50 5f 47 6f 73 75 62 2c 20 70 45 78 70 72   OP_Gosub, pExpr
18d40 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72  ->y.sub.regRetur
18d50 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
18d60 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
18d70 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 29 3b 0a  ->y.sub.iAddr);.
18d80 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78        return pEx
18d90 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
18da0 7d 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  }..    /* Begin 
18db0 63 6f 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  coding the subro
18dc0 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 45 78 70  utine */.    Exp
18dd0 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
18de0 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b 0a  pr, EP_Subrtn);.
18df0 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62      pExpr->y.sub
18e00 2e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  .regReturn = ++p
18e10 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
18e20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41   pExpr->y.sub.iA
18e30 64 64 72 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  ddr =.      sqli
18e40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18e50 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
18e60 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67  pExpr->y.sub.reg
18e70 52 65 74 75 72 6e 29 20 2b 20 31 3b 0a 20 20 20  Return) + 1;.   
18e80 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18e90 20 22 72 65 74 75 72 6e 20 61 64 64 72 65 73 73   "return address
18ea0 22 29 29 3b 0a 0a 20 20 20 20 61 64 64 72 4f 6e  "));..    addrOn
18eb0 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
18ec0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
18ed0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
18ee0 28 76 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  (v);.  }.  .  /*
18ef0 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67   For a SELECT, g
18f00 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
18f10 70 75 74 20 74 68 65 20 76 61 6c 75 65 73 20 66  put the values f
18f20 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  or all columns o
18f30 66 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  f.  ** the first
18f40 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72   row into an arr
18f50 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
18f60 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 69  and return the i
18f70 6e 64 65 78 20 6f 66 0a 20 20 2a 2a 20 74 68 65  ndex of.  ** the
18f80 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 2e   first register.
18f90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
18fa0 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c  is is an EXISTS,
18fb0 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65   write an intege
18fc0 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29  r 0 (not exists)
18fd0 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a 20   or 1 (exists). 
18fe0 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73   ** into a regis
18ff0 74 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ter and return t
19000 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d  hat register num
19010 62 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ber..  **.  ** I
19020 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68  n both cases, th
19030 65 20 71 75 65 72 79 20 69 73 20 61 75 67 6d 65  e query is augme
19040 6e 74 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54  nted with "LIMIT
19050 20 31 22 2e 20 20 41 6e 79 20 0a 20 20 2a 2a 20   1".  Any .  ** 
19060 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69  preexisting limi
19070 74 20 69 73 20 64 69 73 63 61 72 64 65 64 20 69  t is discarded i
19080 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e  n place of the n
19090 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 2a 2f  ew LIMIT 1..  */
190a0 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
190b0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
190c0 22 25 73 53 43 41 4c 41 52 20 53 55 42 51 55 45  "%sSCALAR SUBQUE
190d0 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  RY %d",.        
190e0 61 64 64 72 4f 6e 63 65 3f 22 22 3a 22 43 4f 52  addrOnce?"":"COR
190f0 52 45 4c 41 54 45 44 20 22 2c 20 70 53 65 6c 2d  RELATED ", pSel-
19100 3e 73 65 6c 49 64 29 29 3b 0a 20 20 6e 52 65 67  >selId));.  nReg
19110 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b   = pExpr->op==TK
19120 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e  _SELECT ? pSel->
19130 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  pEList->nExpr : 
19140 31 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  1;.  sqlite3Sele
19150 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
19160 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  , 0, pParse->nMe
19170 6d 2b 31 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  m+1);.  pParse->
19180 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  nMem += nReg;.  
19190 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
191a0 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
191b0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
191c0 5f 4d 65 6d 3b 0a 20 20 20 20 64 65 73 74 2e 69  _Mem;.    dest.i
191d0 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50  Sdst = dest.iSDP
191e0 61 72 6d 3b 0a 20 20 20 20 64 65 73 74 2e 6e 53  arm;.    dest.nS
191f0 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20  dst = nReg;.    
19200 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19210 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
19220 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64   dest.iSDParm, d
19230 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67  est.iSDParm+nReg
19240 2d 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  -1);.    VdbeCom
19250 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
19260 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
19270 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19280 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
19290 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 73 71 6c  _Exists;.    sql
192a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
192b0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
192c0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
192d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
192e0 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53  (v, "Init EXISTS
192f0 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 7d 0a   result"));.  }.
19300 20 20 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74    pLimit = sqlit
19310 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72  e3ExprAlloc(pPar
19320 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47  se->db, TK_INTEG
19330 45 52 2c 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  ER,&sqlite3IntTo
19340 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 69  kens[1], 0);.  i
19350 66 28 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20  f( pSel->pLimit 
19360 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
19370 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
19380 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69  >db, pSel->pLimi
19390 74 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70  t->pLeft);.    p
193a0 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65  Sel->pLimit->pLe
193b0 66 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 7d  ft = pLimit;.  }
193c0 65 6c 73 65 7b 0a 20 20 20 20 70 53 65 6c 2d 3e  else{.    pSel->
193d0 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
193e0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
193f0 5f 4c 49 4d 49 54 2c 20 70 4c 69 6d 69 74 2c 20  _LIMIT, pLimit, 
19400 30 29 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 2d 3e  0);.  }.  pSel->
19410 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 66  iLimit = 0;.  if
19420 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
19430 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64  pParse, pSel, &d
19440 65 73 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  est) ){.    retu
19450 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70  rn 0;.  }.  pExp
19460 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 52 65 67  r->iTable = rReg
19470 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
19480 0a 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f  .  ExprSetVVAPro
19490 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
194a0 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 69 66 28  NoReduce);.  if(
194b0 20 61 64 64 72 4f 6e 63 65 20 29 7b 0a 20 20 20   addrOnce ){.   
194c0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
194d0 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65  Here(v, addrOnce
194e0 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 72 6f  );..    /* Subro
194f0 75 74 69 6e 65 20 72 65 74 75 72 6e 20 2a 2f 0a  utine return */.
19500 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19510 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
19520 72 6e 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62  rn, pExpr->y.sub
19530 2e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  .regReturn);.   
19540 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
19550 67 65 50 31 28 76 2c 20 70 45 78 70 72 2d 3e 79  geP1(v, pExpr->y
19560 2e 73 75 62 2e 69 41 64 64 72 2d 31 2c 20 73 71  .sub.iAddr-1, sq
19570 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
19580 41 64 64 72 28 76 29 2d 31 29 3b 0a 20 20 7d 0a  Addr(v)-1);.  }.
19590 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a  .  return rReg;.
195a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
195b0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
195c0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
195d0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
195e0 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e  Y./*.** Expr pIn
195f0 20 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65   is an IN(...) e
19600 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20  xpression. This 
19610 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
19620 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62  that the .** sub
19630 2d 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52  -select on the R
19640 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f  HS of the IN() o
19650 70 65 72 61 74 6f 72 20 68 61 73 20 74 68 65 20  perator has the 
19660 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a  same number of .
19670 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68  ** columns as th
19680 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20  e vector on the 
19690 4c 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  LHS. Or, if the 
196a0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20  RHS of the IN() 
196b0 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62  is not .** a sub
196c0 2d 71 75 65 72 79 2c 20 74 68 61 74 20 74 68 65  -query, that the
196d0 20 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f 72   LHS is a vector
196e0 20 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69   of size 1..*/.i
196f0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  nt sqlite3ExprCh
19700 65 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61  eckIN(Parse *pPa
19710 72 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b  rse, Expr *pIn){
19720 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d  .  int nVector =
19730 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
19740 6f 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66  orSize(pIn->pLef
19750 74 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e  t);.  if( (pIn->
19760 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
19770 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28  lect) ){.    if(
19780 20 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78   nVector!=pIn->x
19790 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
197a0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
197b0 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
197c0 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
197d0 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  In->x.pSelect->p
197e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56  EList->nExpr, nV
197f0 65 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 65  ector);.      re
19800 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
19810 7d 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f  }else if( nVecto
19820 72 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  r!=1 ){.    sqli
19830 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73  te3VectorErrorMs
19840 67 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 70  g(pParse, pIn->p
19850 4c 65 66 74 29 3b 0a 20 20 20 20 72 65 74 75 72  Left);.    retur
19860 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
19870 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n 0;.}.#endif..#
19880 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19890 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
198a0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
198b0 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73  for an IN expres
198c0 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sion..**.**     
198d0 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e   x IN (SELECT ..
198e0 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  .).**      x IN 
198f0 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e  (value, value, .
19900 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ..).**.** The le
19910 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48  ft-hand side (LH
19920 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20 6f  S) is a scalar o
19930 72 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73  r vector express
19940 69 6f 6e 2e 20 20 54 68 65 20 0a 2a 2a 20 72 69  ion.  The .** ri
19950 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52  ght-hand side (R
19960 48 53 29 20 69 73 20 61 6e 20 61 72 72 61 79 20  HS) is an array 
19970 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  of zero or more 
19980 73 63 61 6c 61 72 20 76 61 6c 75 65 73 2c 20 6f  scalar values, o
19990 72 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 2e  r a.** subquery.
199a0 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20    If the RHS is 
199b0 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 20  a subquery, the 
199c0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
199d0 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a   columns must.**
199e0 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
199f0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
19a00 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68  the vector on th
19a10 65 20 4c 48 53 2e 20 20 49 66 20 74 68 65 20 52  e LHS.  If the R
19a20 48 53 20 69 73 0a 2a 2a 20 61 20 6c 69 73 74 20  HS is.** a list 
19a30 6f 66 20 76 61 6c 75 65 73 2c 20 74 68 65 20 4c  of values, the L
19a40 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 63 61  HS must be a sca
19a50 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lar. .**.** The 
19a60 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 74  IN operator is t
19a70 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 76  rue if the LHS v
19a80 61 6c 75 65 20 69 73 20 63 6f 6e 74 61 69 6e 65  alue is containe
19a90 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
19aa0 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20  ..** The result 
19ab0 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
19ac0 4c 48 53 20 69 73 20 64 65 66 69 6e 69 74 65 6c  LHS is definitel
19ad0 79 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 48 53  y not in the RHS
19ae0 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65 73 75 6c  .  The .** resul
19af0 74 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  t is NULL if the
19b00 20 70 72 65 73 65 6e 63 65 20 6f 66 20 74 68 65   presence of the
19b10 20 4c 48 53 20 69 6e 20 74 68 65 20 52 48 53 20   LHS in the RHS 
19b20 63 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20 64 65  cannot be .** de
19b30 74 65 72 6d 69 6e 65 64 20 64 75 65 20 74 6f 20  termined due to 
19b40 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  NULLs..**.** Thi
19b50 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
19b60 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75  tes code that ju
19b70 6d 70 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c  mps to destIfFal
19b80 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  se if the LHS is
19b90 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e   not .** contain
19ba0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
19bb0 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55  S.  If due to NU
19bc0 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  LLs we cannot de
19bd0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c  termine if the L
19be0 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e  HS.** is contain
19bf0 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74 68  ed in the RHS th
19c00 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49  en jump to destI
19c10 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c  fNull.  If the L
19c20 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a  HS is contained.
19c30 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ** within the RH
19c40 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  S then fall thro
19c50 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74  ugh..**.** See t
19c60 68 65 20 73 65 70 61 72 61 74 65 20 69 6e 2d 6f  he separate in-o
19c70 70 65 72 61 74 6f 72 2e 6d 64 20 64 6f 63 75 6d  perator.md docum
19c80 65 6e 74 61 74 69 6f 6e 20 66 69 6c 65 20 69 6e  entation file in
19c90 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a   the canonical.*
19ca0 2a 20 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20  * SQLite source 
19cb0 74 72 65 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tree for additio
19cc0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
19cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19ce0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
19cf0 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  N(.  Parse *pPar
19d00 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
19d10 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
19d20 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
19d30 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
19d40 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pr,          /* 
19d50 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f  The IN expressio
19d60 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  n */.  int destI
19d70 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20  fFalse,      /* 
19d80 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53  Jump here if LHS
19d90 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
19da0 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a  d in the RHS */.
19db0 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
19dc0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
19dd0 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73 75  here if the resu
19de0 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20  lts are unknown 
19df0 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a  due to NULLs */.
19e00 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73  ){.  int rRhsHas
19e10 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65  Null = 0;  /* Re
19e20 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74  gister that is t
19e30 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61  rue if RHS conta
19e40 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  ins NULL values 
19e50 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20  */.  int eType; 
19e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
19e70 70 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f  pe of the RHS */
19e80 0a 20 20 69 6e 74 20 72 4c 68 73 3b 20 20 20 20  .  int rLhs;    
19e90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
19ea0 73 74 65 72 28 73 29 20 68 6f 6c 64 69 6e 67 20  ster(s) holding 
19eb0 74 68 65 20 4c 48 53 20 76 61 6c 75 65 73 20 2a  the LHS values *
19ec0 2f 0a 20 20 69 6e 74 20 72 4c 68 73 4f 72 69 67  /.  int rLhsOrig
19ed0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 48 53  ;         /* LHS
19ee0 20 76 61 6c 75 65 73 20 70 72 69 6f 72 20 74 6f   values prior to
19ef0 20 72 65 6f 72 64 65 72 69 6e 67 20 62 79 20 61   reordering by a
19f00 69 4d 61 70 5b 5d 20 2a 2f 0a 20 20 56 64 62 65  iMap[] */.  Vdbe
19f10 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
19f20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75    /* Statement u
19f30 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
19f40 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61  n */.  int *aiMa
19f50 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  p = 0;       /* 
19f60 4d 61 70 20 66 72 6f 6d 20 76 65 63 74 6f 72 20  Map from vector 
19f70 66 69 65 6c 64 20 74 6f 20 69 6e 64 65 78 20 63  field to index c
19f80 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
19f90 2a 7a 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20  *zAff = 0;      
19fa0 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72   /* Affinity str
19fb0 69 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  ing for comparis
19fc0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65  ons */.  int nVe
19fd0 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f  ctor;          /
19fe0 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72  * Size of vector
19ff0 73 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70  s for this IN op
1a000 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
1a010 69 44 75 6d 6d 79 3b 20 20 20 20 20 20 20 20 20  iDummy;         
1a020 20 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61 6d    /* Dummy param
1a030 65 74 65 72 20 74 6f 20 65 78 70 72 43 6f 64 65  eter to exprCode
1a040 56 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45 78  Vector() */.  Ex
1a050 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
1a060 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f      /* The LHS o
1a070 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
1a080 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  r */.  int i;   
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a0a0 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
1a0b0 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 32 3b    int destStep2;
1a0c0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
1a0d0 20 74 6f 20 6a 75 6d 70 20 77 68 65 6e 20 4e 55   to jump when NU
1a0e0 4c 4c 73 20 73 65 65 6e 20 69 6e 20 73 74 65 70  LLs seen in step
1a0f0 20 32 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74   2 */.  int dest
1a100 53 74 65 70 36 20 3d 20 30 3b 20 20 20 20 2f 2a  Step6 = 0;    /*
1a110 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20 66   Start of code f
1a120 6f 72 20 53 74 65 70 20 36 20 2a 2f 0a 20 20 69  or Step 6 */.  i
1a130 6e 74 20 61 64 64 72 54 72 75 74 68 4f 70 3b 20  nt addrTruthOp; 
1a140 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1a150 6f 66 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64  of opcode that d
1a160 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 49 4e  etermines the IN
1a170 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   is true */.  in
1a180 74 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20  t destNotNull;  
1a190 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1a1a0 20 69 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   if a comparison
1a1b0 20 69 73 20 6e 6f 74 20 74 72 75 65 20 69 6e 20   is not true in 
1a1c0 73 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20  step 6 */.  int 
1a1d0 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
1a1e0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
1a1f0 73 74 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a  step-6 loop */ .
1a200 20 20 69 6e 74 20 69 54 61 62 20 3d 20 30 3b 20    int iTab = 0; 
1a210 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1a220 20 74 6f 20 75 73 65 20 2a 2f 0a 0a 20 20 70 4c   to use */..  pL
1a230 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
1a240 66 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ft;.  if( sqlite
1a250 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61  3ExprCheckIN(pPa
1a260 72 73 65 2c 20 70 45 78 70 72 29 20 29 20 72 65  rse, pExpr) ) re
1a270 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65  turn;.  zAff = e
1a280 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50  xprINAffinity(pP
1a290 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
1a2a0 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
1a2b0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
1a2c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1a2d0 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73   aiMap = (int*)s
1a2e0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1a2f0 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73 65  ro(.      pParse
1a300 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73  ->db, nVector*(s
1a310 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a  izeof(int) + siz
1a320 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20  eof(char)) + 1. 
1a330 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
1a340 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1a350 65 64 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65  ed ) goto sqlite
1a360 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f  3ExprCodeIN_oom_
1a370 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74  error;..  /* Att
1a380 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20  empt to compute 
1a390 74 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74  the RHS. After t
1a3a0 68 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79  his step, if any
1a3b0 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
1a3c0 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e  .  ** IN_INDEX_N
1a3d0 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c  OOP is returned,
1a3e0 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65   the table opene
1a3f0 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 54  d with cursor iT
1a400 61 62 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  ab.  ** contains
1a410 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74   the values that
1a420 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53   make up the RHS
1a430 2e 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  . If IN_INDEX_NO
1a440 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a  OP is returned,.
1a450 20 20 2a 2a 20 74 68 65 20 52 48 53 20 68 61 73    ** the RHS has
1a460 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f   not yet been co
1a470 64 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70  ded.  */.  v = p
1a480 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1a490 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
1a4a0 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74        /* OOM det
1a4b0 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74  ected prior to t
1a4c0 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  his routine */. 
1a4d0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1a4e0 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65  ((v, "begin IN e
1a4f0 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20  xpr"));.  eType 
1a500 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  = sqlite3FindInI
1a510 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78  ndex(pParse, pEx
1a520 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
1a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a540 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
1a550 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f  SHIP | IN_INDEX_
1a560 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20  NOOP_OK,.       
1a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a580 20 20 20 20 20 20 64 65 73 74 49 66 46 61 6c 73        destIfFals
1a590 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20  e==destIfNull ? 
1a5a0 30 20 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c  0 : &rRhsHasNull
1a5b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1a5d0 69 4d 61 70 2c 20 26 69 54 61 62 29 3b 0a 0a 20  iMap, &iTab);.. 
1a5e0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1a5f0 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72  >nErr || nVector
1a600 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e  ==1 || eType==IN
1a610 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20  _INDEX_EPH.     
1a620 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49    || eType==IN_I
1a630 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c  NDEX_INDEX_ASC |
1a640 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  | eType==IN_INDE
1a650 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20  X_INDEX_DESC .  
1a660 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1a670 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66  _DEBUG.  /* Conf
1a680 69 72 6d 20 74 68 61 74 20 61 69 4d 61 70 5b 5d  irm that aiMap[]
1a690 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f   contains nVecto
1a6a0 72 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  r integer values
1a6b0 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 0a 20   between 0 and. 
1a6c0 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a   ** nVector-1. *
1a6d0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
1a6e0 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
1a6f0 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20    int j, cnt;.  
1a700 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a    for(cnt=j=0; j
1a710 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69  <nVector; j++) i
1a720 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29  f( aiMap[j]==i )
1a730 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65   cnt++;.    asse
1a740 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20  rt( cnt==1 );.  
1a750 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
1a760 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65  ode the LHS, the
1a770 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65   <expr> from "<e
1a780 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20  xpr> IN (...)". 
1a790 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 61 20  If the LHS is a 
1a7a0 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68  .  ** vector, th
1a7b0 65 6e 20 69 74 20 69 73 20 73 74 6f 72 65 64 20  en it is stored 
1a7c0 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e  in an array of n
1a7d0 56 65 63 74 6f 72 20 72 65 67 69 73 74 65 72 73  Vector registers
1a7e0 20 73 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20   starting .  ** 
1a7f0 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  at r1..  **.  **
1a800 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
1a810 64 65 78 28 29 20 6d 69 67 68 74 20 68 61 76 65  dex() might have
1a820 20 72 65 6f 72 64 65 72 65 64 20 74 68 65 20 66   reordered the f
1a830 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4c 48 53  ields of the LHS
1a840 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20   vector.  ** so 
1a850 74 68 61 74 20 74 68 65 20 66 69 65 6c 64 73 20  that the fields 
1a860 61 72 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  are in the same 
1a870 6f 72 64 65 72 20 61 73 20 61 6e 20 65 78 69 73  order as an exis
1a880 74 69 6e 67 20 69 6e 64 65 78 2e 20 20 20 54 68  ting index.   Th
1a890 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61  e.  ** aiMap[] a
1a8a0 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  rray contains a 
1a8b0 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65  mapping from the
1a8c0 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20 66 69   original LHS fi
1a8d0 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a  eld order to.  *
1a8e0 2a 20 74 68 65 20 66 69 65 6c 64 20 6f 72 64 65  * the field orde
1a8f0 72 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74  r that matches t
1a900 68 65 20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20  he RHS index..  
1a910 2a 2f 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d 20  */.  rLhsOrig = 
1a920 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70  exprCodeVector(p
1a930 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 69  Parse, pLeft, &i
1a940 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d  Dummy);.  for(i=
1a950 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26 26 20  0; i<nVector && 
1a960 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b  aiMap[i]==i; i++
1a970 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20 66  ){} /* Are LHS f
1a980 69 65 6c 64 73 20 72 65 6f 72 64 65 72 65 64 3f  ields reordered?
1a990 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65   */.  if( i==nVe
1a9a0 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c  ctor ){.    /* L
1a9b0 48 53 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f  HS fields are no
1a9c0 74 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20  t reordered */. 
1a9d0 20 20 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72     rLhs = rLhsOr
1a9e0 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ig;.  }else{.   
1a9f0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f 72   /* Need to reor
1aa00 64 65 72 20 74 68 65 20 4c 48 53 20 66 69 65 6c  der the LHS fiel
1aa10 64 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ds according to 
1aa20 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68  aiMap */.    rLh
1aa30 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  s = sqlite3GetTe
1aa40 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1aa50 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f  nVector);.    fo
1aa60 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
1aa70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
1aa80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1aa90 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73  v, OP_Copy, rLhs
1aaa0 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d  Orig+i, rLhs+aiM
1aab0 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  ap[i], 0);.    }
1aac0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71  .  }..  /* If sq
1aad0 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
1aae0 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  () did not find 
1aaf0 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  or create an ind
1ab00 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ex that is.  ** 
1ab10 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61  suitable for eva
1ab20 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f  luating the IN o
1ab30 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76  perator, then ev
1ab40 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20  aluate using a. 
1ab50 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20   ** sequence of 
1ab60 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a  comparisons..  *
1ab70 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73  *.  ** This is s
1ab80 74 65 70 20 28 31 29 20 69 6e 20 74 68 65 20 69  tep (1) in the i
1ab90 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70  n-operator.md op
1aba0 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74 68  timized algorith
1abb0 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  m..  */.  if( eT
1abc0 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f  ype==IN_INDEX_NO
1abd0 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  OP ){.    ExprLi
1abe0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
1abf0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
1ac00 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
1ac10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1ac20 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
1ac30 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  r->pLeft);.    i
1ac40 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c  nt labelOk = sql
1ac50 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1ac60 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  l(pParse);.    i
1ac70 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65  nt r2, regToFree
1ac80 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e  ;.    int regCkN
1ac90 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ull = 0;.    int
1aca0 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28   ii;.    assert(
1acb0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1acc0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1acd0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
1ace0 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  ( destIfNull!=de
1acf0 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
1ad00 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73     regCkNull = s
1ad10 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1ad20 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1ad30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ad40 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
1ad50 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43  rLhs, rLhs, regC
1ad60 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  kNull);.    }.  
1ad70 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
1ad80 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  List->nExpr; ii+
1ad90 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  +){.      r2 = s
1ada0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1adb0 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  mp(pParse, pList
1adc0 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26  ->a[ii].pExpr, &
1add0 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  regToFree);.    
1ade0 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
1adf0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
1ae00 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61  nBeNull(pList->a
1ae10 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  [ii].pExpr) ){. 
1ae20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ae30 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
1ae40 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c  itAnd, regCkNull
1ae50 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  , r2, regCkNull)
1ae60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ae70 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  if( ii<pList->nE
1ae80 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e  xpr-1 || destIfN
1ae90 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
1aea0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1aeb0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1aec0 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61   OP_Eq, rLhs, la
1aed0 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20  belOk, r2,.     
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aef0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
1af00 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
1af10 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1af20 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69  rageIf(v, ii<pLi
1af30 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
1af40 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1af50 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73  geIf(v, ii==pLis
1af60 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
1af70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1af80 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
1af90 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
1afa0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
1afb0 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64  t( destIfNull==d
1afc0 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20  estIfFalse );.  
1afd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1afe0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
1aff0 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61  , rLhs, destIfFa
1b000 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lse, r2,.       
1b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b020 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
1b030 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64   P4_COLLSEQ); Vd
1b040 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b050 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1b060 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
1b070 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a  ff[0] | SQLITE_J
1b080 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1b090 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1b0a0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1b0b0 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65  pParse, regToFre
1b0c0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
1b0d0 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20  ( regCkNull ){. 
1b0e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b0f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
1b100 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  ull, regCkNull, 
1b110 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62  destIfNull); Vdb
1b120 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1b140 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c  oto(v, destIfFal
1b150 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  se);.    }.    s
1b160 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1b170 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f  eLabel(v, labelO
1b180 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  k);.    sqlite3R
1b190 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1b1a0 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  arse, regCkNull)
1b1b0 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74  ;.    goto sqlit
1b1c0 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
1b1d0 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ished;.  }..  /*
1b1e0 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74   Step 2: Check t
1b1f0 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53  o see if the LHS
1b200 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
1b210 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20  LL columns.  If 
1b220 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65  the.  ** LHS doe
1b230 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20  s contain NULLs 
1b240 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
1b250 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 46  must be either F
1b260 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20  ALSE or NULL..  
1b270 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20  ** We will then 
1b280 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79 20  skip the binary 
1b290 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 52 48  search of the RH
1b2a0 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  S..  */.  if( de
1b2b0 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
1b2c0 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73  False ){.    des
1b2d0 74 53 74 65 70 32 20 3d 20 64 65 73 74 49 66 46  tStep2 = destIfF
1b2e0 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  alse;.  }else{. 
1b2f0 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64     destStep2 = d
1b300 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74  estStep6 = sqlit
1b310 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1b320 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 66  pParse);.  }.  f
1b330 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
1b340 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
1b350 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65  r *p = sqlite3Ve
1b360 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
1b370 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69  (pExpr->pLeft, i
1b380 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
1b390 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
1b3a0 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  p) ){.      sqli
1b3b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b3c0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73   OP_IsNull, rLhs
1b3d0 2b 69 2c 20 64 65 73 74 53 74 65 70 32 29 3b 0a  +i, destStep2);.
1b3e0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b3f0 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ge(v);.    }.  }
1b400 0a 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e 20 20  ..  /* Step 3.  
1b410 54 68 65 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b  The LHS is now k
1b420 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e  nown to be non-N
1b430 55 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62 69 6e  ULL.  Do the bin
1b440 61 72 79 20 73 65 61 72 63 68 0a 20 20 2a 2a 20  ary search.  ** 
1b450 6f 66 20 74 68 65 20 52 48 53 20 75 73 69 6e 67  of the RHS using
1b460 20 74 68 65 20 4c 48 53 20 61 73 20 61 20 70 72   the LHS as a pr
1b470 6f 62 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20  obe.  If found, 
1b480 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 20 20  the result is.  
1b490 2a 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20  ** true..  */.  
1b4a0 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
1b4b0 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
1b4c0 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
1b4d0 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65  , the RHS is the
1b4e0 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20   ROWID of table 
1b4f0 62 2d 74 72 65 65 20 61 6e 64 20 73 6f 20 77 65  b-tree and so we
1b500 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f   also.    ** kno
1b510 77 20 74 68 61 74 20 74 68 65 20 52 48 53 20 69  w that the RHS i
1b520 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e  s non-NULL.  Hen
1b530 63 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20 73  ce, we combine s
1b540 74 65 70 73 20 33 20 61 6e 64 20 34 0a 20 20 20  teps 3 and 4.   
1b550 20 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c   ** into a singl
1b560 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  e opcode. */.   
1b570 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b580 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
1b590 69 64 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66  id, iTab, destIf
1b5a0 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20  False, rLhs);.  
1b5b0 20 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 61 64 64 72 54 72 75 74 68  );.    addrTruth
1b5d0 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
1b5e0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
1b5f0 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54  o);  /* Return T
1b600 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  rue */.  }else{.
1b610 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b620 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
1b630 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63  nity, rLhs, nVec
1b640 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56  tor, 0, zAff, nV
1b650 65 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ector);.    if( 
1b660 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
1b670 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  tIfNull ){.     
1b680 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70   /* Combine Step
1b690 20 33 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e   3 and Step 5 in
1b6a0 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  to a single opco
1b6b0 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  de */.      sqli
1b6c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1b6d0 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
1b6e0 20 69 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c   iTab, destIfFal
1b6f0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1b710 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56  Lhs, nVector); V
1b720 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b730 20 20 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74        goto sqlit
1b740 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
1b750 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ished;.    }.   
1b760 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65   /* Ordinary Ste
1b770 70 20 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73  p 3, for the cas
1b780 65 20 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e  e where FALSE an
1b790 64 20 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69  d NULL are disti
1b7a0 6e 63 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54  nct */.    addrT
1b7b0 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33  ruthOp = sqlite3
1b7c0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1b7d0 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c   OP_Found, iTab,
1b7e0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b800 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20            rLhs, 
1b810 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f  nVector); VdbeCo
1b820 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
1b830 20 20 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66    /* Step 4.  If
1b840 20 74 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77   the RHS is know
1b850 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c  n to be non-NULL
1b860 20 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20   and we did not 
1b870 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74  find.  ** an mat
1b880 63 68 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68  ch on the search
1b890 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
1b8a0 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20   result must be 
1b8b0 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66  FALSE..  */.  if
1b8c0 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26  ( rRhsHasNull &&
1b8d0 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20   nVector==1 ){. 
1b8e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b8f0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
1b900 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c  ll, rRhsHasNull,
1b910 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1b920 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1b930 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  v);.  }..  /* St
1b940 65 70 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20  ep 5.  If we do 
1b950 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
1b960 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
1b970 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20  tween NULL and. 
1b980 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20   ** FALSE, then 
1b990 6a 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73  just return fals
1b9a0 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  e. .  */.  if( d
1b9b0 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
1b9c0 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33  IfNull ) sqlite3
1b9d0 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
1b9e0 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20  IfFalse);..  /* 
1b9f0 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72  Step 6: Loop thr
1ba00 6f 75 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65  ough rows of the
1ba10 20 52 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65   RHS.  Compare e
1ba20 61 63 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c  ach row to the L
1ba30 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20  HS..  ** If any 
1ba40 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55  comparison is NU
1ba50 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  LL, then the res
1ba60 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66  ult is NULL.  If
1ba70 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72   all.  ** compar
1ba80 69 73 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20  isons are FALSE 
1ba90 74 68 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72  then the final r
1baa0 65 73 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a  esult is FALSE..
1bab0 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20    **.  ** For a 
1bac0 73 63 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69  scalar LHS, it i
1bad0 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  s sufficient to 
1bae0 63 68 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66  check just the f
1baf0 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66  irst row.  ** of
1bb00 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
1bb10 20 69 66 28 20 64 65 73 74 53 74 65 70 36 20 29   if( destStep6 )
1bb20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1bb30 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
1bb40 53 74 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f  Step6);.  addrTo
1bb50 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
1bb60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
1bb70 6e 64 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66  nd, iTab, destIf
1bb80 46 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f  False);.  VdbeCo
1bb90 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28  verage(v);.  if(
1bba0 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20   nVector>1 ){.  
1bbb0 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20    destNotNull = 
1bbc0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1bbd0 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
1bbe0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f  }else{.    /* Fo
1bbf0 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f  r nVector==1, co
1bc00 6d 62 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e  mbine steps 6 an
1bc10 64 20 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65  d 7 by immediate
1bc20 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20  ly returning.   
1bc30 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65   ** FALSE if the
1bc40 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f   first compariso
1bc50 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  n is not NULL */
1bc60 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  .    destNotNull
1bc70 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   = destIfFalse;.
1bc80 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1bc90 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
1bca0 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
1bcb0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1bcc0 0a 20 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71  .    int r3 = sq
1bcd0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1bce0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d  pParse);.    p =
1bcf0 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
1bd00 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74  eldSubexpr(pLeft
1bd10 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  , i);.    pColl 
1bd20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1bd30 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
1bd40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1bd50 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1bd60 75 6d 6e 2c 20 69 54 61 62 2c 20 69 2c 20 72 33  umn, iTab, i, r3
1bd70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1bd80 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e  beAddOp4(v, OP_N
1bd90 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e  e, rLhs+i, destN
1bda0 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20  otNull, r3,.    
1bdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdc0 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
1bdd0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
1bde0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1bdf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1be00 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1be10 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73  se, r3);.  }.  s
1be20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1be30 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1be40 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69  destIfNull);.  i
1be50 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a  f( nVector>1 ){.
1be60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1be70 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1be80 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20  estNotNull);.   
1be90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bea0 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
1beb0 54 61 62 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Tab, addrTop+1);
1bec0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1bed0 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74  e(v);..    /* St
1bee0 65 70 20 37 3a 20 20 49 66 20 77 65 20 72 65 61  ep 7:  If we rea
1bef0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77  ch this point, w
1bf00 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
1bf10 72 65 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20  result must.    
1bf20 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a  ** be false. */.
1bf30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bf40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1bf50 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65  , 0, destIfFalse
1bf60 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
1bf70 70 73 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72  ps here in order
1bf80 20 74 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e   to return true.
1bf90 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1bfa0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1bfb0 72 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69  rTruthOp);..sqli
1bfc0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69  te3ExprCodeIN_fi
1bfd0 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c  nished:.  if( rL
1bfe0 68 73 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73  hs!=rLhsOrig ) s
1bff0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1c000 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68  pReg(pParse, rLh
1c010 73 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  s);.  VdbeCommen
1c020 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78  t((v, "end IN ex
1c030 70 72 22 29 29 3b 0a 73 71 6c 69 74 65 33 45 78  pr"));.sqlite3Ex
1c040 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72  prCodeIN_oom_err
1c050 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  or:.  sqlite3DbF
1c060 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1c070 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65  aiMap);.  sqlite
1c080 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
1c090 64 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e  db, zAff);.}.#en
1c0a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1c0b0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
1c0c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c0d0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1c0e0 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  NT./*.** Generat
1c0f0 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
1c100 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
1c110 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  he floating poin
1c120 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72  t.** value descr
1c130 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31  ibed by z[0..n-1
1c140 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
1c150 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iMem..**.** The 
1c160 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20  z[] string will 
1c170 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20  probably not be 
1c180 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
1c190 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b    But the .** z[
1c1a0 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20  n] character is 
1c1b0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1c1c0 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
1c1d0 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a  does not look.**
1c1e0 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e   like the contin
1c1f0 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75  uation of the nu
1c200 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
1c210 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64  void codeReal(Vd
1c220 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
1c230 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65  r *z, int negate
1c240 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
1c250 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21  .  if( ALWAYS(z!
1c260 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  =0) ){.    doubl
1c270 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c  e value;.    sql
1c280 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c  ite3AtoF(z, &val
1c290 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ue, sqlite3Strle
1c2a0 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55  n30(z), SQLITE_U
1c2b0 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TF8);.    assert
1c2c0 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28  ( !sqlite3IsNaN(
1c2d0 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65  value) ); /* The
1c2e0 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20   new AtoF never 
1c2f0 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20  returns NaN */. 
1c300 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61     if( negateFla
1c310 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c  g ) value = -val
1c320 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ue;.    sqlite3V
1c330 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
1c340 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65   OP_Real, 0, iMe
1c350 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75  m, 0, (u8*)&valu
1c360 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d  e, P4_REAL);.  }
1c370 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
1c380 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
1c390 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
1c3a0 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65  ill put the inte
1c3b0 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a  ger describe by.
1c3c0 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31  ** text z[0..n-1
1c3d0 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
1c3e0 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72  iMem..**.** Expr
1c3f0 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77  .u.zToken is alw
1c400 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72  ays UTF8 and zer
1c410 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f  o-terminated..*/
1c420 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
1c430 65 49 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a  eInteger(Parse *
1c440 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1c450 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67  xpr, int negFlag
1c460 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56  , int iMem){.  V
1c470 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1c480 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45  >pVdbe;.  if( pE
1c490 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
1c4a0 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
1c4b0 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75  int i = pExpr->u
1c4c0 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73  .iValue;.    ass
1c4d0 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20  ert( i>=0 );.   
1c4e0 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69   if( negFlag ) i
1c4f0 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74   = -i;.    sqlit
1c500 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c510 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69  OP_Integer, i, i
1c520 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Mem);.  }else{. 
1c530 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36     int c;.    i6
1c540 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e  4 value;.    con
1c550 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78  st char *z = pEx
1c560 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
1c570 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
1c580 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65  ;.    c = sqlite
1c590 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a  3DecOrHexToI64(z
1c5a0 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69  , &value);.    i
1c5b0 66 28 20 28 63 3d 3d 33 20 26 26 20 21 6e 65 67  f( (c==3 && !neg
1c5c0 46 6c 61 67 29 20 7c 7c 20 28 63 3d 3d 32 29 20  Flag) || (c==2) 
1c5d0 7c 7c 20 28 6e 65 67 46 6c 61 67 20 26 26 20 76  || (negFlag && v
1c5e0 61 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49  alue==SMALLEST_I
1c5f0 4e 54 36 34 29 29 7b 0a 23 69 66 64 65 66 20 53  NT64)){.#ifdef S
1c600 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1c610 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
1c620 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1c630 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a  pParse, "oversiz
1c640 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73  ed integer: %s%s
1c650 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22  ", negFlag ? "-"
1c660 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65   : "", z);.#else
1c670 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c680 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52  OMIT_HEX_INTEGER
1c690 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1c6a0 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30  e3_strnicmp(z,"0
1c6b0 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  x",2)==0 ){.    
1c6c0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1c6d0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 68 65 78  Msg(pParse, "hex
1c6e0 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67   literal too big
1c6f0 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67  : %s%s", negFlag
1c700 3f 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20 20  ?"-":"",z);.    
1c710 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1c720 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63       {.        c
1c730 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65  odeReal(v, z, ne
1c740 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20  gFlag, iMem);.  
1c750 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1c760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
1c770 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c  ( negFlag ){ val
1c780 75 65 20 3d 20 63 3d 3d 33 20 3f 20 53 4d 41 4c  ue = c==3 ? SMAL
1c790 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61  LEST_INT64 : -va
1c7a0 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c  lue; }.      sql
1c7b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
1c7c0 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20  p8(v, OP_Int64, 
1c7d0 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a  0, iMem, 0, (u8*
1c7e0 29 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36  )&value, P4_INT6
1c7f0 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  4);.    }.  }.}.
1c800 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
1c810 64 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61  de that will loa
1c820 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  d into register 
1c830 72 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74  regOut a value t
1c840 68 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70  hat is.** approp
1c850 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49  riate for the iI
1c860 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20  dxCol-th column 
1c870 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
1c880 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1c890 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43  prCodeLoadIndexC
1c8a0 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
1c8b0 70 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20  pParse,  /* The 
1c8c0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1c8d0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
1c8e0 2c 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  ,    /* The inde
1c8f0 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69  x whose column i
1c900 73 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a  s to be loaded *
1c910 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
1c920 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
1c930 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  inting to a tabl
1c940 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  e row */.  int i
1c950 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68  IdxCol,    /* Th
1c960 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
1c970 69 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64  index to be load
1c980 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ed */.  int regO
1c990 75 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  ut      /* Store
1c9a0 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
1c9b0 6e 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  n value in this 
1c9c0 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1c9d0 20 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70   i16 iTabCol = p
1c9e0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49  Idx->aiColumn[iI
1c9f0 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54  dxCol];.  if( iT
1ca00 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29  abCol==XN_EXPR )
1ca10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
1ca20 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a  dx->aColExpr );.
1ca30 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1ca40 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70  ->aColExpr->nExp
1ca50 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20  r>iIdxCol );.   
1ca60 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
1ca70 62 20 3d 20 69 54 61 62 43 75 72 20 2b 20 31 3b  b = iTabCur + 1;
1ca80 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1ca90 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c  CodeCopy(pParse,
1caa0 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
1cab0 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70  >a[iIdxCol].pExp
1cac0 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20  r, regOut);.    
1cad0 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1cae0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1caf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1cb00 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
1cb10 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  le(pParse->pVdbe
1cb20 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20  , pIdx->pTable, 
1cb30 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20  iTabCur,.       
1cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61               iTa
1cb60 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  bCol, regOut);. 
1cb70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
1cb80 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74  rate code to ext
1cb90 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ract the value o
1cba0 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
1cbb0 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e  lumn of a table.
1cbc0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1cbd0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1cbe0 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65  nOfTable(.  Vdbe
1cbf0 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *v,        /* T
1cc00 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
1cc10 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1cc20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
1cc30 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e  /* The table con
1cc40 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
1cc50 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  e */.  int iTabC
1cc60 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ur,    /* The ta
1cc70 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20  ble cursor.  Or 
1cc80 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f  the PK cursor fo
1cc90 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
1cca0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
1ccb0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1ccc0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65   the column to e
1ccd0 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20  xtract */.  int 
1cce0 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45  regOut      /* E
1ccf0 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1cd00 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73   into this regis
1cd10 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ter */.){.  if( 
1cd20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
1cd30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1cd40 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
1cd50 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65  TabCur, iCol, re
1cd60 67 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72  gOut);.    retur
1cd70 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  n;.  }.  if( iCo
1cd80 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61  l<0 || iCol==pTa
1cd90 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
1cda0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cdb0 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
1cdc0 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b  TabCur, regOut);
1cdd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1cde0 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c  t op = IsVirtual
1cdf0 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c  (pTab) ? OP_VCol
1ce00 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b  umn : OP_Column;
1ce10 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f  .    int x = iCo
1ce20 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73 52  l;.    if( !HasR
1ce30 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 21 49  owid(pTab) && !I
1ce40 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
1ce50 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69  {.      x = sqli
1ce60 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1ce70 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b  (sqlite3PrimaryK
1ce80 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69  eyIndex(pTab), i
1ce90 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
1cea0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ceb0 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72  3(v, op, iTabCur
1cec0 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  , x, regOut);.  
1ced0 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
1cee0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
1cef0 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
1cf00 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75  Tab, iCol, regOu
1cf10 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
1cf20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1cf30 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
1cf40 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
1cf50 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74  column from.** t
1cf60 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74  able pTab and st
1cf70 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
1cf80 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
1cf90 20 69 52 65 67 2e 20 0a 2a 2a 0a 2a 2a 20 54 68   iReg. .**.** Th
1cfa0 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f  ere must be an o
1cfb0 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54  pen cursor to pT
1cfc0 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65  ab in iTable whe
1cfd0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
1cfe0 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66  * is called.  If
1cff0 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20   iColumn<0 then 
1d000 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
1d010 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20  d that extracts 
1d020 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e  the rowid..*/.in
1d030 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
1d040 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  eGetColumn(.  Pa
1d050 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
1d060 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
1d070 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
1d080 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
1d090 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44   *pTab,     /* D
1d0a0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1d0b0 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72  e table we are r
1d0c0 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20  eading from */. 
1d0d0 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
1d0e0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1d0f0 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a  e table column *
1d100 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1d110 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1d120 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
1d130 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
1d140 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f  t iReg,        /
1d150 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20  * Store results 
1d160 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20  here */.  u8 p5 
1d170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35             /* P5
1d180 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f   value for OP_Co
1d190 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a  lumn + FLAGS */.
1d1a0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1d1b0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1d1c0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
1d1d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1d1e0 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1d1f0 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c  e(v, pTab, iTabl
1d200 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
1d210 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20  );.  if( p5 ){. 
1d220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1d230 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20  angeP5(v, p5);. 
1d240 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67   }.  return iReg
1d250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1d260 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65  ate code to move
1d270 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65   content from re
1d280 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e  gisters iFrom...
1d290 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20  iFrom+nReg-1.** 
1d2a0 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f  over to iTo..iTo
1d2b0 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64  +nReg-1..*/.void
1d2c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d2d0 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  Move(Parse *pPar
1d2e0 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
1d2f0 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67  nt iTo, int nReg
1d300 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 46 72  ){.  assert( iFr
1d310 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20  om>=iTo+nReg || 
1d320 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20  iFrom+nReg<=iTo 
1d330 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1d340 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70  AddOp3(pParse->p
1d350 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69  Vdbe, OP_Move, i
1d360 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29  From, iTo, nReg)
1d370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
1d380 72 74 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  rt a scalar expr
1d390 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61  ession node to a
1d3a0 20 54 4b 5f 52 45 47 49 53 54 45 52 20 72 65 66   TK_REGISTER ref
1d3b0 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69  erencing.** regi
1d3c0 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 65 20  ster iReg.  The 
1d3d0 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
1d3e0 72 65 20 74 68 61 74 20 69 52 65 67 20 61 6c 72  re that iReg alr
1d3f0 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  eady contains.**
1d400 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1d410 75 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ue for the expre
1d420 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssion..*/.static
1d430 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69   void exprToRegi
1d440 73 74 65 72 28 45 78 70 72 20 2a 70 45 78 70 72  ster(Expr *pExpr
1d450 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 45  , int iReg){.  E
1d460 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
1d470 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
1d480 70 45 78 70 72 29 3b 0a 20 20 70 2d 3e 6f 70 32  pExpr);.  p->op2
1d490 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f   = p->op;.  p->o
1d4a0 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
1d4b0 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69  .  p->iTable = i
1d4c0 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72  Reg;.  ExprClear
1d4d0 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
1d4e0 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  kip);.}../*.** E
1d4f0 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65  valuate an expre
1d500 73 73 69 6f 6e 20 28 65 69 74 68 65 72 20 61 20  ssion (either a 
1d510 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61 6c  vector or a scal
1d520 61 72 20 65 78 70 72 65 73 73 69 6f 6e 29 20 61  ar expression) a
1d530 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20  nd store.** the 
1d540 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74 69 6e  result in contin
1d550 67 75 6f 75 73 20 74 65 6d 70 6f 72 61 72 79 20  guous temporary 
1d560 72 65 67 69 73 74 65 72 73 2e 20 20 52 65 74 75  registers.  Retu
1d570 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
1d580 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67  ** the first reg
1d590 69 73 74 65 72 20 75 73 65 64 20 74 6f 20 73 74  ister used to st
1d5a0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  ore the result..
1d5b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74  **.** If the ret
1d5c0 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67  urned result reg
1d5d0 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f  ister is a tempo
1d5e0 72 61 72 79 20 73 63 61 6c 61 72 2c 20 74 68 65  rary scalar, the
1d5f0 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20  n also write.** 
1d600 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75  that register nu
1d610 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69 46 72 65  mber into *piFre
1d620 65 61 62 6c 65 2e 20 20 49 66 20 74 68 65 20 72  eable.  If the r
1d630 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72  eturned result r
1d640 65 67 69 73 74 65 72 0a 2a 2a 20 69 73 20 6e 6f  egister.** is no
1d650 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  t a temporary or
1d660 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
1d670 6f 6e 20 69 73 20 61 20 76 65 63 74 6f 72 20 73  on is a vector s
1d680 65 74 20 2a 70 69 46 72 65 65 61 62 6c 65 0a 2a  et *piFreeable.*
1d690 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  * to 0..*/.stati
1d6a0 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 56 65  c int exprCodeVe
1d6b0 63 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ctor(Parse *pPar
1d6c0 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  se, Expr *p, int
1d6d0 20 2a 70 69 46 72 65 65 61 62 6c 65 29 7b 0a 20   *piFreeable){. 
1d6e0 20 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a 20 20   int iResult;.  
1d6f0 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20 73 71  int nResult = sq
1d700 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
1d710 69 7a 65 28 70 29 3b 0a 20 20 69 66 28 20 6e 52  ize(p);.  if( nR
1d720 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20 20 20  esult==1 ){.    
1d730 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  iResult = sqlite
1d740 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1d750 61 72 73 65 2c 20 70 2c 20 70 69 46 72 65 65 61  arse, p, piFreea
1d760 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ble);.  }else{. 
1d770 20 20 20 2a 70 69 46 72 65 65 61 62 6c 65 20 3d     *piFreeable =
1d780 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f   0;.    if( p->o
1d790 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
1d7a0 23 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  #if SQLITE_OMIT_
1d7b0 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 69  SUBQUERY.      i
1d7c0 52 65 73 75 6c 74 20 3d 20 30 3b 0a 23 65 6c 73  Result = 0;.#els
1d7d0 65 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  e.      iResult 
1d7e0 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  = sqlite3CodeSub
1d7f0 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
1d800 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  );.#endif.    }e
1d810 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
1d820 3b 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  ;.      iResult 
1d830 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
1d840 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1d850 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b  nMem += nResult;
1d860 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1d870 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b  i<nResult; i++){
1d880 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d890 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62  ExprCodeFactorab
1d8a0 6c 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e  le(pParse, p->x.
1d8b0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1d8c0 72 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20  r, i+iResult);. 
1d8d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d8e0 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73 75 6c  .  return iResul
1d8f0 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  t;.}.../*.** Gen
1d900 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
1d910 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
1d920 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
1d930 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
1d940 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74  sion.  Attempt t
1d950 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
1d960 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
1d970 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74  "target"..** Ret
1d980 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
1d990 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61   where results a
1d9a0 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
1d9b0 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69   With this routi
1d9c0 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ne, there is no 
1d9d0 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72  guarantee that r
1d9e0 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62  esults will.** b
1d9f0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67  e stored in targ
1da00 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  et.  The result 
1da10 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20  might be stored 
1da20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  in some other.**
1da30 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20   register if it 
1da40 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  is convenient to
1da50 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c   do so.  The cal
1da60 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
1da70 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
1da80 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
1da90 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  move the results
1daa0 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a   to the desired.
1dab0 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ** register..*/.
1dac0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1dad0 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20  odeTarget(Parse 
1dae0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1daf0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
1db00 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1db10 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f  Parse->pVdbe;  /
1db20 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63  * The VM under c
1db30 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1db40 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
1db50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1db60 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63  e opcode being c
1db70 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  oded */.  int in
1db80 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20  Reg = target;   
1db90 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73      /* Results s
1dba0 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
1dbb0 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74  r inReg */.  int
1dbc0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20   regFree1 = 0;  
1dbd0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
1dbe0 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
1dbf0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1dc00 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  er */.  int regF
1dc10 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ree2 = 0;       
1dc20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
1dc30 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
1dc40 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
1dc50 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 20 20  .  int r1, r2;  
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc70 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72  Various register
1dc80 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78   numbers */.  Ex
1dc90 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20  pr tempX;       
1dca0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
1dcb0 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  rary expression 
1dcc0 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35  node */.  int p5
1dcd0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1dce0 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
1dcf0 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
1dd00 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  m );.  if( v==0 
1dd10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1dd20 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1dd30 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
1dd40 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 65 78  eturn 0;.  }..ex
1dd50 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3a 0a  pr_code_doover:.
1dd60 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1dd70 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
1dd80 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
1dd90 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
1dda0 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
1ddb0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1ddc0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
1ddd0 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
1dde0 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
1ddf0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1de00 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
1de10 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
1de20 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
1de30 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
1de40 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
1de50 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
1de60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
1de70 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20  ->iMem>0 );.    
1de80 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d      return pCol-
1de90 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  >iMem;.      }el
1dea0 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  se if( pAggInfo-
1deb0 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29  >useSortingIdx )
1dec0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ded0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1dee0 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e  P_Column, pAggIn
1def0 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54  fo->sortingIdxPT
1df00 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1df30 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
1df40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
1df50 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
1df60 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73       /* Otherwis
1df70 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74  e, fall thru int
1df80 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20  o the TK_COLUMN 
1df90 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
1dfa0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
1dfb0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  : {.      int iT
1dfc0 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  ab = pExpr->iTab
1dfd0 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78  le;.      if( Ex
1dfe0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1dff0 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  xpr, EP_FixedCol
1e000 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1e010 54 68 69 73 20 43 4f 4c 55 4d 4e 20 65 78 70 72  This COLUMN expr
1e020 65 73 73 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79  ession is really
1e030 20 61 20 63 6f 6e 73 74 61 6e 74 20 64 75 65 20   a constant due 
1e040 74 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  to WHERE clause.
1e050 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
1e060 72 61 69 6e 74 73 2c 20 61 6e 64 20 74 68 61 74  raints, and that
1e070 20 63 6f 6e 73 74 61 6e 74 20 69 73 20 63 6f 64   constant is cod
1e080 65 64 20 62 79 20 74 68 65 20 70 45 78 70 72 2d  ed by the pExpr-
1e090 3e 70 4c 65 66 74 0a 20 20 20 20 20 20 20 20 2a  >pLeft.        *
1e0a0 2a 20 65 78 70 72 65 73 73 73 69 6f 6e 2e 20 20  * expresssion.  
1e0b0 48 6f 77 65 76 65 72 2c 20 6d 61 6b 65 20 73 75  However, make su
1e0c0 72 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  re the constant 
1e0d0 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 0a  has the correct.
1e0e0 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 74          ** datat
1e0f0 79 70 65 20 62 79 20 61 70 70 6c 79 69 6e 67 20  ype by applying 
1e100 74 68 65 20 41 66 66 69 6e 69 74 79 20 6f 66 20  the Affinity of 
1e110 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
1e120 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   to the.        
1e130 2a 2a 20 63 6f 6e 73 74 61 6e 74 2e 0a 20 20 20  ** constant..   
1e140 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1e150 69 6e 74 20 69 52 65 67 20 3d 20 73 71 6c 69 74  int iReg = sqlit
1e160 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1e170 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e180 70 4c 65 66 74 2c 74 61 72 67 65 74 29 3b 0a 20  pLeft,target);. 
1e190 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 20 3d         int aff =
1e1a0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
1e1b0 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  umnAffinity(pExp
1e1c0 72 2d 3e 79 2e 70 54 61 62 2c 20 70 45 78 70 72  r->y.pTab, pExpr
1e1d0 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1e1e0 20 20 20 20 69 66 28 20 61 66 66 21 3d 53 51 4c      if( aff!=SQL
1e1f0 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a  ITE_AFF_BLOB ){.
1e200 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
1e210 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 41 66 66   const char zAff
1e220 5b 5d 20 3d 20 22 42 5c 30 30 30 43 5c 30 30 30  [] = "B\000C\000
1e230 44 5c 30 30 30 45 22 3b 0a 20 20 20 20 20 20 20  D\000E";.       
1e240 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
1e250 45 5f 41 46 46 5f 42 4c 4f 42 3d 3d 27 41 27 20  E_AFF_BLOB=='A' 
1e260 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
1e270 65 72 74 28 20 53 51 4c 49 54 45 5f 41 46 46 5f  ert( SQLITE_AFF_
1e280 54 45 58 54 3d 3d 27 42 27 20 29 3b 0a 20 20 20  TEXT=='B' );.   
1e290 20 20 20 20 20 20 20 69 66 28 20 69 52 65 67 21         if( iReg!
1e2a0 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  =target ){.     
1e2b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1e2c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1e2d0 43 6f 70 79 2c 20 69 52 65 67 2c 20 74 61 72 67  Copy, iReg, targ
1e2e0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  et);.           
1e2f0 20 69 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a   iReg = target;.
1e300 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e310 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e320 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66  eAddOp4(v, OP_Af
1e330 66 69 6e 69 74 79 2c 20 69 52 65 67 2c 20 31 2c  finity, iReg, 1,
1e340 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1e350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e360 26 7a 41 66 66 5b 28 61 66 66 2d 27 42 27 29 2a  &zAff[(aff-'B')*
1e370 32 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  2], P4_STATIC);.
1e380 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e390 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 20    return iReg;. 
1e3a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e3b0 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20   iTab<0 ){.     
1e3c0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69     if( pParse->i
1e3d0 53 65 6c 66 54 61 62 3c 30 20 29 7b 0a 20 20 20  SelfTab<0 ){.   
1e3e0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
1e3f0 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74  ting CHECK const
1e400 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74  raints or insert
1e410 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c  ing into partial
1e420 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
1e430 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
1e440 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 50 61 72  ->iColumn - pPar
1e450 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20  se->iSelfTab;.  
1e460 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e470 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67         /* Coding
1e480 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
1e490 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
1e4a0 6e 20 69 6e 64 65 78 20 77 68 65 72 65 20 63 6f  n index where co
1e4b0 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20  lumn names.     
1e4c0 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
1e4d0 6e 64 65 78 20 72 65 66 65 72 20 74 6f 20 74 68  ndex refer to th
1e4e0 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68  e table to which
1e4f0 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
1e500 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  gs */.          
1e510 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69  iTab = pParse->i
1e520 53 65 6c 66 54 61 62 20 2d 20 31 3b 0a 20 20 20  SelfTab - 1;.   
1e530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1e540 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1e550 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1e560 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78  lumn(pParse, pEx
1e570 70 72 2d 3e 79 2e 70 54 61 62 2c 0a 20 20 20 20  pr->y.pTab,.    
1e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e590 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1e5a0 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  ->iColumn, iTab,
1e5b0 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5d0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1e5e0 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  p2);.    }.    c
1e5f0 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
1e600 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65  {.      codeInte
1e610 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ger(pParse, pExp
1e620 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
1e630 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1e640 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  et;.    }.    ca
1e650 73 65 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3a  se TK_TRUEFALSE:
1e660 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1e670 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e680 5f 49 6e 74 65 67 65 72 2c 20 73 71 6c 69 74 65  _Integer, sqlite
1e690 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28  3ExprTruthValue(
1e6a0 70 45 78 70 72 29 2c 20 74 61 72 67 65 74 29 3b  pExpr), target);
1e6b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1e6c0 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rget;.    }.#ifn
1e6d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e6e0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1e6f0 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
1e700 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1e710 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e720 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1e730 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1e740 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70  codeReal(v, pExp
1e750 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20  r->u.zToken, 0, 
1e760 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
1e770 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1e780 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1e790 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
1e7a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1e7b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e7c0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1e7d0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ue) );.      sql
1e7e0 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
1e7f0 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45  ng(v, target, pE
1e800 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1e810 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1e820 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
1e830 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
1e840 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e850 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1e860 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
1e870 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1e880 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  et;.    }.#ifnde
1e890 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
1e8a0 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
1e8b0 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
1e8c0 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
1e8d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
1e8e0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c  .      char *zBl
1e8f0 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ob;.      assert
1e900 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e910 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1e920 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1e930 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1e940 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20  .zToken[0]=='x' 
1e950 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  || pExpr->u.zTok
1e960 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20  en[0]=='X' );.  
1e970 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1e980 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d  r->u.zToken[1]==
1e990 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20  '\'' );.      z 
1e9a0 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = &pExpr->u.zTok
1e9b0 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d  en[2];.      n =
1e9c0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1e9d0 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61  (z) - 1;.      a
1e9e0 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27  ssert( z[n]=='\'
1e9f0 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62  ' );.      zBlob
1ea00 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42   = sqlite3HexToB
1ea10 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44  lob(sqlite3VdbeD
1ea20 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  b(v), z, n);.   
1ea30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ea40 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
1ea50 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c   n/2, target, 0,
1ea60 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d   zBlob, P4_DYNAM
1ea70 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  IC);.      retur
1ea80 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1ea90 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1eaa0 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
1eab0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1eac0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ead0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1eae0 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1eaf0 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1eb00 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  en!=0 );.      a
1eb10 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1eb20 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
1eb30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1eb40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61  eAddOp2(v, OP_Va
1eb50 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
1eb60 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
1eb70 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
1eb80 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30  ->u.zToken[1]!=0
1eb90 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
1eba0 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
1ebb0 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d  te3VListNumToNam
1ebc0 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  e(pParse->pVList
1ebd0 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1ebe0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1ebf0 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1ec00 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74  en[0]=='?' || st
1ec10 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  rcmp(pExpr->u.zT
1ec20 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20  oken, z)==0 );. 
1ec30 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
1ec40 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a  VList[0] = 0; /*
1ec50 20 49 6e 64 69 63 61 74 65 20 56 4c 69 73 74 20   Indicate VList 
1ec60 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  may no longer be
1ec70 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 20   enlarged */.   
1ec80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ec90 41 70 70 65 6e 64 50 34 28 76 2c 20 28 63 68 61  AppendP4(v, (cha
1eca0 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54 49 43 29  r*)z, P4_STATIC)
1ecb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ecc0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1ecd0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1ece0 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20  _REGISTER: {.   
1ecf0 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
1ed00 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 23  >iTable;.    }.#
1ed10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ed20 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
1ed30 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
1ed40 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
1ed50 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
1ed60 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
1ed70 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ken) */.      in
1ed80 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
1ed90 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
1eda0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1edb0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1edc0 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
1edd0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
1ede0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1edf0 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  v, OP_SCopy, inR
1ee00 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
1ee10 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
1ee20 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  get;.      }.   
1ee30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ee40 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c  dOp2(v, OP_Cast,
1ee50 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee70 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
1ee80 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54  Type(pExpr->u.zT
1ee90 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20  oken, 0));.     
1eea0 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 20   return inReg;. 
1eeb0 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1eec0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20  QLITE_OMIT_CAST 
1eed0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
1eee0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
1eef0 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70 20 3d  SNOT:.      op =
1ef00 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54   (op==TK_IS) ? T
1ef10 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20  K_EQ : TK_NE;.  
1ef20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54 45 5f      p5 = SQLITE_
1ef30 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a  NULLEQ;.      /*
1ef40 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a 2f   fall-through */
1ef50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
1ef60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
1ef70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
1ef80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
1ef90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
1efa0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
1efb0 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
1efc0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
1efd0 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  eft;.      if( s
1efe0 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
1eff0 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20 20 20  or(pLeft) ){.   
1f000 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f 72 43       codeVectorC
1f010 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1f020 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 6f 70  Expr, target, op
1f030 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , p5);.      }el
1f040 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
1f050 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f060 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65  Temp(pParse, pLe
1f070 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1f080 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
1f090 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f0a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f0b0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1f0c0 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  2);.        code
1f0d0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1f0e0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
1f0f0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
1f100 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e        r1, r2, in
1f110 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52  Reg, SQLITE_STOR
1f120 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20 20 20  EP2 | p5);.     
1f130 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
1f140 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
1f150 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
1f160 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1f170 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
1f180 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
1f190 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
1f1a0 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
1f1b0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1f1c0 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
1f1d0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
1f1e0 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
1f1f0 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
1f200 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1f210 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
1f220 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
1f230 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
1f240 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
1f250 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1f260 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
1f270 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
1f280 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
1f290 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64  e(op==OP_Eq); Vd
1f2a0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1f2b0 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
1f2c0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
1f2d0 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
1f2e0 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64  e(op==OP_Ne); Vd
1f2f0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1f300 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
1f310 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f320 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f330 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f340 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1f350 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1f360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f370 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
1f380 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
1f390 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
1f3a0 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
1f3b0 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
1f3c0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
1f3d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1f3e0 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
1f3f0 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
1f400 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
1f410 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
1f420 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
1f430 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
1f440 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
1f450 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
1f460 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20 20  OP_And );       
1f470 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f480 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
1f490 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52     assert( TK_OR
1f4a0 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20 20  ==OP_Or );      
1f4b0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f4c0 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ( op==TK_OR );. 
1f4d0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f4e0 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20  PLUS==OP_Add ); 
1f4f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1f500 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20  se( op==TK_PLUS 
1f510 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f520 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75   TK_MINUS==OP_Su
1f530 62 74 72 61 63 74 20 29 3b 20 20 20 20 20 74 65  btract );     te
1f540 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d  stcase( op==TK_M
1f550 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73  INUS );.      as
1f560 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50  sert( TK_REM==OP
1f570 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20 20  _Remainder );   
1f580 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f590 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20  =TK_REM );.     
1f5a0 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
1f5b0 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
1f5c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f5d0 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b  op==TK_BITAND );
1f5e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f5f0 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
1f600 72 20 29 3b 20 20 20 20 20 20 20 20 74 65 73 74  r );        test
1f610 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
1f620 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OR );.      asse
1f630 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50  rt( TK_SLASH==OP
1f640 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20 20 20  _Divide );      
1f650 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f660 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20  K_SLASH );.     
1f670 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49   assert( TK_LSHI
1f680 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  FT==OP_ShiftLeft
1f690 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1f6a0 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b  op==TK_LSHIFT );
1f6b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f6c0 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_RSHIFT==OP_Shi
1f6d0 66 74 52 69 67 68 74 20 29 3b 20 20 74 65 73 74  ftRight );  test
1f6e0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48  case( op==TK_RSH
1f6f0 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
1f700 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d  ert( TK_CONCAT==
1f710 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20 20  OP_Concat );    
1f720 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f730 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20  TK_CONCAT );.   
1f740 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1f750 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f760 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f770 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1f780 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1f790 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f7a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1f7b0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1f7c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f7d0 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
1f7e0 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
1f7f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f800 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1f810 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f820 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1f830 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f840 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
1f850 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  NUS: {.      Exp
1f860 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
1f870 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61  ->pLeft;.      a
1f880 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
1f890 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
1f8a0 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
1f8b0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49  ){.        codeI
1f8c0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
1f8d0 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29  Left, 1, target)
1f8e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f8f0 20 74 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66   target;.#ifndef
1f900 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1f910 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
1f920 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66    }else if( pLef
1f930 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
1f940 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1f950 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1f960 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1f970 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1f980 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
1f990 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Left->u.zToken, 
1f9a0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1f9b0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1f9c0 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t;.#endif.      
1f9d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
1f9e0 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54  empX.op = TK_INT
1f9f0 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65  EGER;.        te
1fa00 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49  mpX.flags = EP_I
1fa10 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e  ntValue|EP_Token
1fa20 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65  Only;.        te
1fa30 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30  mpX.u.iValue = 0
1fa40 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  ;.        r1 = s
1fa50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1fa60 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70  mp(pParse, &temp
1fa70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  X, &regFree1);. 
1fa80 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
1fa90 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1faa0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1fab0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29  Left, &regFree2)
1fac0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1fad0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1fae0 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20  P_Subtract, r2, 
1faf0 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
1fb00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1fb10 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1fb20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1fb30 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1fb40 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20  e TK_BITNOT:.   
1fb50 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
1fb60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1fb70 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e  _BITNOT==OP_BitN
1fb80 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ot );   testcase
1fb90 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20  ( op==TK_BITNOT 
1fba0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1fbb0 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20   TK_NOT==OP_Not 
1fbc0 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74 63  );         testc
1fbd0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20  ase( op==TK_NOT 
1fbe0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1fbf0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1fc00 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1fc10 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1fc20 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
1fc30 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1fc40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1fc50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1fc60 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20  , r1, inReg);.  
1fc70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1fc80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55  .    case TK_TRU
1fc90 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  TH: {.      int 
1fca0 69 73 54 72 75 65 3b 20 20 20 20 2f 2a 20 49 53  isTrue;    /* IS
1fcb0 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20   TRUE or IS NOT 
1fcc0 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e  TRUE */.      in
1fcd0 74 20 62 4e 6f 72 6d 61 6c 3b 20 20 20 2f 2a 20  t bNormal;   /* 
1fce0 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 46 41  IS TRUE or IS FA
1fcf0 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 72 31 20  LSE */.      r1 
1fd00 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1fd10 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1fd20 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1fd30 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
1fd40 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1fd50 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73 54  ==0 );.      isT
1fd60 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rue = sqlite3Exp
1fd70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70  rTruthValue(pExp
1fd80 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
1fd90 20 20 62 4e 6f 72 6d 61 6c 20 3d 20 70 45 78 70    bNormal = pExp
1fda0 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 3b 0a 20  r->op2==TK_IS;. 
1fdb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1fdc0 73 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c  sTrue && bNormal
1fdd0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1fde0 65 28 20 21 69 73 54 72 75 65 20 26 26 20 62 4e  e( !isTrue && bN
1fdf0 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 73 71  ormal);.      sq
1fe00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
1fe10 6e 74 28 76 2c 20 4f 50 5f 49 73 54 72 75 65 2c  nt(v, OP_IsTrue,
1fe20 20 72 31 2c 20 69 6e 52 65 67 2c 20 21 69 73 54   r1, inReg, !isT
1fe30 72 75 65 2c 20 69 73 54 72 75 65 20 5e 20 62 4e  rue, isTrue ^ bN
1fe40 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  ormal);.      br
1fe50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1fe60 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
1fe70 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1fe80 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
1fe90 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  addr;.      asse
1fea0 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
1feb0 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65  P_IsNull );   te
1fec0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1fed0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61  SNULL );.      a
1fee0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
1fef0 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
1ff00 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1ff10 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
1ff20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ff30 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1ff40 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
1ff50 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1ff60 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1ff70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1ff80 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1ff90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ffa0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1ffb0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
1ffc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1ffd0 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  , op, r1);.     
1ffe0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1fff0 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
20000 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
20010 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
20020 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
20030 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20040 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
20050 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
20060 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20070 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
20080 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20090 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
200a0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
200b0 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
200c0 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  *pInfo = pExpr->
200d0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
200e0 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a  if( pInfo==0 ){.
200f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20100 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
20110 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
20120 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
20130 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20140 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
20150 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73  of aggregate: %s
20160 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ()", pExpr->u.zT
20170 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
20180 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
20190 72 6e 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  rn pInfo->aFunc[
201a0 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
201b0 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
201c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
201d0 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
201e0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
201f0 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20  List *pFarg;    
20200 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75     /* List of fu
20210 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
20220 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   */.      int nF
20230 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  arg;            
20240 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
20250 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
20260 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65   */.      FuncDe
20270 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20  f *pDef;        
20280 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
20290 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65   definition obje
202a0 63 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  ct */.      cons
202b0 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
202c0 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
202d0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  on name */.     
202e0 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d   u32 constMask =
202f0 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20   0;     /* Mask 
20300 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
20310 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63  ments that are c
20320 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20  onstant */.     
20330 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
20340 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
20350 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
20360 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20370 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54  Parse->db;  /* T
20380 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
20390 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ection */.      
203a0 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
203b0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65  ;      /* The te
203c0 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64  xt encoding used
203d0 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
203e0 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53  e */.      CollS
203f0 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20  eq *pColl = 0;  
20400 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67    /* A collating
20410 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 23 69   sequence */..#i
20420 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20430 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
20440 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
20450 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
20460 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20  _WinFunc) ){.   
20470 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70       return pExp
20480 72 2d 3e 79 2e 70 57 69 6e 2d 3e 72 65 67 52 65  r->y.pWin->regRe
20490 73 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65  sult;.      }.#e
204a0 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20  ndif..      if( 
204b0 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
204c0 61 72 73 65 29 20 26 26 20 73 71 6c 69 74 65 33  arse) && sqlite3
204d0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
204e0 74 4a 6f 69 6e 28 70 45 78 70 72 29 20 29 7b 0a  tJoin(pExpr) ){.
204f0 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 66          /* SQL f
20500 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20  unctions can be 
20510 65 78 70 65 6e 73 69 76 65 2e 20 53 6f 20 74 72  expensive. So tr
20520 79 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 73 74 61  y to move consta
20530 6e 74 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20  nt functions.   
20540 20 20 20 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74       ** out of t
20550 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65  he inner loop, e
20560 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
20570 73 20 61 6e 20 65 78 74 72 61 20 4f 50 5f 43 6f  s an extra OP_Co
20580 70 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  py. */.        r
20590 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
205a0 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
205b0 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a  se, pExpr, -1);.
205c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
205d0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
205e0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
205f0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
20600 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
20610 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
20620 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
20630 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
20640 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
20650 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
20660 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
20670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
20680 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70  Farg = pFarg ? p
20690 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  Farg->nExpr : 0;
206a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
206b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
206c0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
206d0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64  ue) );.      zId
206e0 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
206f0 65 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  en;.      pDef =
20700 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
20710 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46  tion(db, zId, nF
20720 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69  arg, enc, 0);.#i
20730 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
20740 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46  LE_UNKNOWN_SQL_F
20750 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66  UNCTION.      if
20760 28 20 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61  ( pDef==0 && pPa
20770 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
20780 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
20790 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
207a0 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22  on(db, "unknown"
207b0 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
207c0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
207d0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
207e0 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e  =0 || pDef->xFin
207f0 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20  alize!=0 ){.    
20800 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
20810 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
20820 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25  nown function: %
20830 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20  s()", zId);.    
20840 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
20850 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74   }..      /* Att
20860 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d  empt a direct im
20870 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
20880 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41  the built-in COA
20890 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20  LESCE() and.    
208a0 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75    ** IFNULL() fu
208b0 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61  nctions.  This a
208c0 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72  voids unnecessar
208d0 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a  y evaluation of.
208e0 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e        ** argumen
208f0 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73  ts past the firs
20900 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d  t non-NULL argum
20910 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
20920 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
20930 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
20940 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29  _FUNC_COALESCE )
20950 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e  {.        int en
20960 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69  dCoalesce = sqli
20970 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
20980 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
20990 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
209a0 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =2 );.        sq
209b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
209c0 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
209d0 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
209e0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
209f0 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  1; i<nFarg; i++)
20a00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
20a10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20a20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72   OP_NotNull, tar
20a30 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  get, endCoalesce
20a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
20a50 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
20a60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20a70 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
20a80 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
20a90 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
20aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
20ab0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
20ac0 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c  Label(v, endCoal
20ad0 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62  esce);.        b
20ae0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
20af0 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49       /* The UNLI
20b00 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20  KELY() function 
20b10 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65  is a no-op.  The
20b20 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76   result is the v
20b30 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  alue.      ** of
20b40 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
20b50 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
20b60 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
20b70 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
20b80 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29  _FUNC_UNLIKELY )
20b90 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
20ba0 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20  ( nFarg>=1 );.  
20bb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
20bc0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
20bd0 65 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  et(pParse, pFarg
20be0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[0].pExpr, ta
20bf0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  rget);.      }..
20c00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
20c10 42 55 47 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  BUG.      /* The
20c20 20 41 46 46 49 4e 49 54 59 28 29 20 66 75 6e 63   AFFINITY() func
20c30 74 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  tion evaluates t
20c40 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  o a string that 
20c50 64 65 73 63 72 69 62 65 73 0a 20 20 20 20 20 20  describes.      
20c60 2a 2a 20 74 68 65 20 74 79 70 65 20 61 66 66 69  ** the type affi
20c70 6e 69 74 79 20 6f 66 20 74 68 65 20 61 72 67 75  nity of the argu
20c80 6d 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20 75  ment.  This is u
20c90 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
20ca0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
20cb0 53 51 4c 69 74 65 20 74 79 70 65 20 6c 6f 67 69  SQLite type logi
20cc0 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
20cd0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
20ce0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
20cf0 55 4e 43 5f 41 46 46 49 4e 49 54 59 20 29 7b 0a  UNC_AFFINITY ){.
20d00 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
20d10 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b 20  ar *azAff[] = { 
20d20 22 62 6c 6f 62 22 2c 20 22 74 65 78 74 22 2c 20  "blob", "text", 
20d30 22 6e 75 6d 65 72 69 63 22 2c 20 22 69 6e 74 65  "numeric", "inte
20d40 67 65 72 22 2c 20 22 72 65 61 6c 22 20 7d 3b 0a  ger", "real" };.
20d50 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66          char aff
20d60 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
20d70 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20  ( nFarg==1 );.  
20d80 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69        aff = sqli
20d90 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
20da0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
20db0 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
20dc0 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
20dd0 67 28 76 2c 20 74 61 72 67 65 74 2c 20 0a 20 20  g(v, target, .  
20de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20df0 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66 20              aff 
20e00 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c 49  ? azAff[aff-SQLI
20e10 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a 20 22  TE_AFF_BLOB] : "
20e20 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20 20 20 20  none");.        
20e30 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
20e40 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
20e50 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
20e60 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
20e70 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26       if( i<32 &&
20e80 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
20e90 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b  nstant(pFarg->a[
20ea0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
20eb0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20ec0 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20   i==31 );.      
20ed0 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d      constMask |=
20ee0 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20   MASKBIT32(i);. 
20ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20f00 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
20f10 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
20f20 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30  UNC_NEEDCOLL)!=0
20f30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
20f40 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
20f50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
20f60 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  eq(pParse, pFarg
20f70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
20f80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20f90 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67  .      if( pFarg
20fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
20fb0 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20  constMask ){.   
20fc0 20 20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72         r1 = pPar
20fd0 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
20fe0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
20ff0 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20  em += nFarg;.   
21000 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21010 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
21020 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
21030 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20  Parse, nFarg);. 
21040 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
21050 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28    /* For length(
21060 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66  ) and typeof() f
21070 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20  unctions with a 
21080 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c  column argument,
21090 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
210a0 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72  the P5 parameter
210b0 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d   to the OP_Colum
210c0 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c  n opcode to OPFL
210d0 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20  AG_LENGTHARG.   
210e0 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41       ** or OPFLA
210f0 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70  G_TYPEOFARG resp
21100 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f  ectively, to avo
21110 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64  id unnecessary d
21120 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ata.        ** l
21130 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20  oading..        
21140 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
21150 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
21160 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  & (SQLITE_FUNC_L
21170 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e  ENGTH|SQLITE_FUN
21180 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b  C_TYPEOF))!=0 ){
21190 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78  .          u8 ex
211a0 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  prOp;.          
211b0 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31  assert( nFarg==1
211c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
211d0 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30  sert( pFarg->a[0
211e0 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
211f0 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d          exprOp =
21200 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
21210 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20  pr->op;.        
21220 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b    if( exprOp==TK
21230 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f  _COLUMN || exprO
21240 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
21250 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21260 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
21270 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c  UNC_LENGTH==OPFL
21280 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a  AG_LENGTHARG );.
21290 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
212a0 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
212b0 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54  TYPEOF==OPFLAG_T
212c0 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20  YPEOFARG );.    
212d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
212e0 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
212f0 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  s & OPFLAG_LENGT
21300 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  HARG );.        
21310 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e      pFarg->a[0].
21320 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20  pExpr->op2 = .  
21330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21340 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
21350 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  & (OPFLAG_LENGTH
21360 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f  ARG|OPFLAG_TYPEO
21370 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20  FARG);.         
21380 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
21390 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
213a0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
213b0 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c  arse, pFarg, r1,
213c0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
213d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213e0 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f      SQLITE_ECEL_
213f0 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f  DUP|SQLITE_ECEL_
21400 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 7d  FACTOR);.      }
21410 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
21420 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
21430 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21440 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
21450 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
21460 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75   overload the fu
21470 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69  nction if the fi
21480 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a  rst argument is.
21490 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75        ** a virtu
214a0 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e  al table column.
214b0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
214c0 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e  ** For infix fun
214d0 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c  ctions (LIKE, GL
214e0 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20  OB, REGEXP, and 
214f0 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20  MATCH) use the. 
21500 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61       ** second a
21510 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65  rgument, not the
21520 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61   first, as the a
21530 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20  rgument to test 
21540 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20  to.      ** see 
21550 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d  if it is a colum
21560 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74  n in a virtual t
21570 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64  able.  This is d
21580 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20  one because.    
21590 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70    ** the left op
215a0 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66  erand of infix f
215b0 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70  unctions (the op
215c0 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f  erand we want to
215d0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f  .      ** contro
215e0 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65  l overloading) e
215f0 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65  nds up as the se
21600 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
21610 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75   the.      ** fu
21620 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70  nction.  The exp
21630 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20  ression "A glob 
21640 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  B" is equivalent
21650 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67   to .      ** "g
21660 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61  lob(B,A).  We wa
21670 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20  nt to use the A 
21680 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f  in "A glob B" to
21690 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66   test.      ** f
216a0 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72  or function over
216b0 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65  loading.  But we
216c0 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20   use the B term 
216d0 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a  in "glob(B,A)"..
216e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
216f0 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 45  f( nFarg>=2 && E
21700 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
21710 45 78 70 72 2c 20 45 50 5f 49 6e 66 69 78 46 75  Expr, EP_InfixFu
21720 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  nc) ){.        p
21730 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
21740 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
21750 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
21760 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70  g, pFarg->a[1].p
21770 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
21780 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29  se if( nFarg>0 )
21790 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
217a0 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
217b0 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
217c0 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
217d0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  arg->a[0].pExpr)
217e0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
217f0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
21800 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
21810 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
21820 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  L ){.        if(
21830 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
21840 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
21850 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
21860 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
21870 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
21880 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
21890 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
218a0 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
218b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46  QLITE_ENABLE_OFF
218c0 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20  SET_SQL_FUNC.   
218d0 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
218e0 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
218f0 46 55 4e 43 5f 4f 46 46 53 45 54 20 29 7b 0a 20  FUNC_OFFSET ){. 
21900 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 72         Expr *pAr
21910 67 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  g = pFarg->a[0].
21920 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
21930 66 28 20 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f  f( pArg->op==TK_
21940 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
21950 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21960 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73  ddOp3(v, OP_Offs
21970 65 74 2c 20 70 41 72 67 2d 3e 69 54 61 62 6c 65  et, pArg->iTable
21980 2c 20 70 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c  , pArg->iColumn,
21990 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
219a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
219b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
219c0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
219d0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
219e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
219f0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
21a00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21a10 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 70  3VdbeAddOp4(v, p
21a20 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
21a30 3f 20 4f 50 5f 50 75 72 65 46 75 6e 63 30 20 3a  ? OP_PureFunc0 :
21a40 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a 20   OP_Function0,. 
21a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a60 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61           constMa
21a70 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 20  sk, r1, target, 
21a80 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f  (char*)pDef, P4_
21a90 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
21aa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
21ab0 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61  ngeP5(v, (u8)nFa
21ac0 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
21ad0 20 20 20 69 66 28 20 6e 46 61 72 67 20 26 26 20     if( nFarg && 
21ae0 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a  constMask==0 ){.
21af0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
21b00 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
21b10 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72  pParse, r1, nFar
21b20 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
21b30 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
21b40 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
21b50 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
21b60 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
21b70 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
21b80 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
21b90 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
21ba0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
21bb0 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
21bc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
21bd0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
21be0 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b        if( op==TK
21bf0 5f 53 45 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c  _SELECT && (nCol
21c00 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
21c10 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
21c20 70 72 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  pr)!=1 ){.      
21c30 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65    sqlite3Subsele
21c40 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
21c50 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20  nCol, 1);.      
21c60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
21c70 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6f 64  eturn sqlite3Cod
21c80 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
21c90 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  e, pExpr);.     
21ca0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
21cb0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
21cc0 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a  K_SELECT_COLUMN:
21cd0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
21ce0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
21cf0 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d  >pLeft->iTable==
21d00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  0 ){.        pEx
21d10 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c  pr->pLeft->iTabl
21d20 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  e = sqlite3CodeS
21d30 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
21d40 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
21d50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
21d60 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
21d70 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
21d80 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53  >pLeft->op==TK_S
21d90 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69  ELECT );.      i
21da0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
21db0 0a 20 20 20 20 20 20 20 26 26 20 70 45 78 70 72  .       && pExpr
21dc0 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73  ->iTable!=(n = s
21dd0 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
21de0 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  Size(pExpr->pLef
21df0 74 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  t)) .      ){.  
21e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
21e10 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
21e20 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e  d columns assign
21e30 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20  ed %d values",. 
21e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21e60 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29  Expr->iTable, n)
21e70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21e80 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c  return pExpr->pL
21e90 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45  eft->iTable + pE
21ea0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
21eb0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
21ec0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
21ed0 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
21ee0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
21ef0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
21f00 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
21f10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
21f20 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
21f30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21f40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
21f50 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
21f60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
21f70 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
21f80 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
21f90 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
21fa0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21fb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21fc0 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
21fd0 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
21fe0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
21ff0 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
22000 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
22010 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22020 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74  P_AddImm, target
22030 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
22040 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
22050 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
22060 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
22070 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
22080 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
22090 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
220a0 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
220b0 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
220c0 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20  AND z.    **.   
220d0 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69   ** This is equi
220e0 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a  valent to.    **
220f0 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20  .    **    x>=y 
22100 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a  AND x<=z.    **.
22110 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72      ** X is stor
22120 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  ed in pExpr->pLe
22130 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
22140 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
22150 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
22160 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20  pr..    ** Z is 
22170 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
22180 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
22190 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  pr..    */.    c
221a0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
221b0 7b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  {.      exprCode
221c0 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
221d0 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30  pExpr, target, 0
221e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
221f0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
22200 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41  .    case TK_SPA
22210 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
22220 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73  OLLATE: .    cas
22230 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
22240 20 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70      pExpr = pExp
22250 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
22260 67 6f 74 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64  goto expr_code_d
22270 6f 6f 76 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30  oover; /* 2018-0
22280 34 2d 32 38 3a 20 50 72 65 76 65 6e 74 20 64 65  4-28: Prevent de
22290 65 70 20 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53  ep recursion. OS
222a0 53 46 75 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a  SFuzz. */.    }.
222b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49  .    case TK_TRI
222c0 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  GGER: {.      /*
222d0 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69   If the opcode i
222e0 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68  s TK_TRIGGER, th
222f0 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
22300 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  n is a reference
22310 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63  .      ** to a c
22320 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
22330 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75  .* or old.* pseu
22340 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61  do-tables availa
22350 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
22360 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
22370 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45  . In this case E
22380 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65  xpr.iTable is se
22390 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20  t to 1 for the. 
223a0 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73       ** new.* ps
223b0 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30  eudo-table, or 0
223c0 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70   for the old.* p
223d0 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70  seudo-table. Exp
223e0 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  r.iColumn.      
223f0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
22400 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70   column of the p
22410 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72  seudo-table to r
22420 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f  ead, or to -1 to
22430 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74  .      ** read t
22440 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a  he rowid field..
22450 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
22460 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
22470 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
22480 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61  using an OP_Para
22490 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31  m opcode. The p1
224a0 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65  .      ** parame
224b0 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
224c0 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64  for an old.rowid
224d0 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74   reference, or t
224e0 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a  o (i+1).      **
224f0 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e   to reference an
22500 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20  other column of 
22510 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
22520 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20  -table, where . 
22530 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65       ** i is the
22540 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   index of the co
22550 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e  lumn. For a new.
22560 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c  rowid reference,
22570 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   p1 is.      ** 
22580 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68  set to (n+1), wh
22590 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d  ere n is the num
225a0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
225b0 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61  n each pseudo-ta
225c0 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f  ble..      ** Fo
225d0 72 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  r a reference to
225e0 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d   any other colum
225f0 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70  n in the new.* p
22600 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a  seudo-table, p1.
22610 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
22620 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72  to (n+2+i), wher
22630 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73  e n and i are as
22640 20 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75   defined previou
22650 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a  sly. For.      *
22660 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
22670 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68  e table on which
22680 20 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65   triggers are be
22690 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20  ing fired is.   
226a0 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61     ** declared a
226b0 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
226c0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
226d0 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
226e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
226f0 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72  Then p1 is inter
22700 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  preted as follow
22710 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
22720 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d    **   p1==0   -
22730 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20  >    old.rowid  
22740 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20     p1==3   ->   
22750 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20   new.rowid.     
22760 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e   **   p1==1   ->
22770 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20      old.a       
22780 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20    p1==4   ->    
22790 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20  new.a.      **  
227a0 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f   p1==2   ->    o
227b0 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d  ld.b         p1=
227c0 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62  =5   ->    new.b
227d0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f         .      */
227e0 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
227f0 61 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54  ab = pExpr->y.pT
22800 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31  ab;.      int p1
22810 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
22820 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31   * (pTab->nCol+1
22830 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69  ) + 1 + pExpr->i
22840 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61  Column;..      a
22850 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
22860 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72  able==0 || pExpr
22870 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  ->iTable==1 );. 
22880 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
22890 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20  pr->iColumn>=-1 
228a0 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
228b0 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  n<pTab->nCol );.
228c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
228d0 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70  ab->iPKey<0 || p
228e0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  Expr->iColumn!=p
228f0 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20  Tab->iPKey );.  
22900 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d      assert( p1>=
22910 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e  0 && p1<(pTab->n
22920 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20  Col*2+2) );..   
22930 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22940 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d  dOp2(v, OP_Param
22950 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , p1, target);. 
22960 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
22970 28 28 76 2c 20 22 72 5b 25 64 5d 3d 25 73 2e 25  ((v, "r[%d]=%s.%
22980 73 22 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  s", target,.    
22990 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62      (pExpr->iTab
229a0 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c  le ? "new" : "ol
229b0 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45  d"),.        (pE
229c0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f  xpr->iColumn<0 ?
229d0 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72   "rowid" : pExpr
229e0 2d 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  ->y.pTab->aCol[p
229f0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a  Expr->iColumn].z
22a00 4e 61 6d 65 29 0a 20 20 20 20 20 20 29 29 3b 0a  Name).      ));.
22a10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22a20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
22a30 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  INT.      /* If 
22a40 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52  the column has R
22a50 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74  EAL affinity, it
22a60 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62   may currently b
22a70 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20  e stored as an. 
22a80 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e       ** integer.
22a90 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69   Use OP_RealAffi
22aa0 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72  nity to make sur
22ab0 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72  e it is really r
22ac0 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eal..      **.  
22ad0 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
22ae0 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36  OF: R-60985-5766
22af0 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f  2 SQLite will co
22b00 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20  nvert the value 
22b10 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a  back to.      **
22b20 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
22b30 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20  when extracting 
22b40 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f  it from the reco
22b50 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  rd.  */.      if
22b60 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
22b70 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  >=0 .       && p
22b80 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
22b90 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  >iColumn].affini
22ba0 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
22bb0 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  EAL.      ){.   
22bc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22bd0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61  AddOp1(v, OP_Rea
22be0 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65  lAffinity, targe
22bf0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
22c00 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  if.      break;.
22c10 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
22c20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20  TK_VECTOR: {.   
22c30 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
22c40 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20  sg(pParse, "row 
22c50 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b  value misused");
22c60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22c70 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
22c80 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a  _IF_NULL_ROW: {.
22c90 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 4e        int addrIN
22ca0 52 3b 0a 20 20 20 20 20 20 61 64 64 72 49 4e 52  R;.      addrINR
22cb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
22cc0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 75 6c  dOp1(v, OP_IfNul
22cd0 6c 52 6f 77 2c 20 70 45 78 70 72 2d 3e 69 54 61  lRow, pExpr->iTa
22ce0 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  ble);.      inRe
22cf0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
22d00 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
22d10 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
22d20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
22d30 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
22d40 72 65 28 76 2c 20 61 64 64 72 49 4e 52 29 3b 0a  re(v, addrINR);.
22d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22d60 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
22d70 72 49 4e 52 2c 20 69 6e 52 65 67 29 3b 0a 20 20  rINR, inReg);.  
22d80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
22d90 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
22da0 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20  Form A:.    **  
22db0 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20   CASE x WHEN e1 
22dc0 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
22dd0 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
22de0 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
22df0 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
22e00 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20    ** Form B:.   
22e10 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
22e20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
22e30 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
22e40 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
22e50 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
22e60 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69  .    ** Form A i
22e70 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f  s can be transfo
22e80 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71  rmed into the eq
22e90 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20  uivalent form B 
22ea0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
22eb0 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78  **   CASE WHEN x
22ec0 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e  =e1 THEN r1 WHEN
22ed0 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e   x=e2 THEN r2 ..
22ee0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
22ef0 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72  WHEN x=eN THEN r
22f00 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
22f10 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66   **.    ** X (if
22f20 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69   it exists) is i
22f30 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
22f40 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74      ** Y is in t
22f50 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20  he last element 
22f60 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  of pExpr->x.pLis
22f70 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t if pExpr->x.pL
22f80 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20  ist->nExpr is.  
22f90 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59    ** odd.  The Y
22fa0 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61   is also optiona
22fb0 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65  l.  If the numbe
22fc0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
22fd0 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20   x.pList.    ** 
22fe0 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20  is even, then Y 
22ff0 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74  is omitted and t
23000 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72  he "otherwise" r
23010 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20  esult is NULL.. 
23020 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70     ** Ei is in p
23030 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
23040 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45  *2] and Ri is pE
23050 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
23060 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  2+1]..    **.   
23070 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f   ** The result o
23080 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
23090 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74   is the Ri for t
230a0 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
230b0 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20  g Ei,.    ** or 
230c0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  if there is no m
230d0 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20  atching Ei, the 
230e0 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20  ELSE term Y, or 
230f0 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  if there is.    
23100 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c  ** no ELSE term,
23110 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
23120 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
23130 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29  t( op==TK_CASE )
23140 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e  ; {.      int en
23150 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  dLabel;         
23160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
23170 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e  OTO label for en
23180 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a  d of CASE stmt *
23190 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74  /.      int next
231a0 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Case;           
231b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54            /* GOT
231c0 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74  O label for next
231d0 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a   WHEN clause */.
231e0 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
231f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23200 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75          /* 2x nu
23210 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72  mber of WHEN ter
23220 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ms */.      int 
23230 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23250 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
23260 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
23270 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20  *pEList;        
23280 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
23290 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
232a0 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
232b0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c  xprList_item *aL
232c0 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72  istelem;  /* Arr
232d0 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  ay of WHEN terms
232e0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f   */.      Expr o
232f0 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20  pCompare;       
23300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23310 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73  he X==Ei express
23320 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
23330 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23350 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69  * The X expressi
23360 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
23370 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20   *pTest = 0;    
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23390 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20   X==Ei (form A) 
233a0 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d  or just Ei (form
233b0 20 42 29 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73   B) */..      as
233c0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
233d0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
233e0 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70  _xIsSelect) && p
233f0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b  Expr->x.pList );
23400 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
23410 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
23420 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
23430 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
23440 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
23450 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73  Listelem = pELis
23460 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70  t->a;.      nExp
23470 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
23480 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65  r;.      endLabe
23490 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
234a0 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
234b0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20  ;.      if( (pX 
234c0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  = pExpr->pLeft)!
234d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78  =0 ){.        ex
234e0 70 72 4e 6f 64 65 43 6f 70 79 28 26 74 65 6d 70  prNodeCopy(&temp
234f0 58 2c 20 70 58 29 3b 0a 20 20 20 20 20 20 20 20  X, pX);.        
23500 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70  testcase( pX->op
23510 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
23520 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67         exprToReg
23530 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65 78  ister(&tempX, ex
23540 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
23550 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65  rse, &tempX, &re
23560 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20  gFree1));.      
23570 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
23580 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
23590 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d     memset(&opCom
235a0 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pare, 0, sizeof(
235b0 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20  opCompare));.   
235c0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f       opCompare.o
235d0 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  p = TK_EQ;.     
235e0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65     opCompare.pLe
235f0 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20  ft = &tempX;.   
23600 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
23610 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20  Compare;.       
23620 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64   /* Ticket b351d
23630 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64  95f9cd5ef17e9d9d
23640 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30  bae18f5ca8611190
23650 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  001:.        ** 
23660 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
23670 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20  Free1 might get 
23680 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68  SCopy-ed into th
23690 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20  e file result.. 
236a0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b         ** So mak
236b0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
236c0 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65  regFree1 registe
236d0 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20  r is not reused 
236e0 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20  for other.      
236f0 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e    ** purposes an
23700 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77  d possibly overw
23710 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
23720 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30      regFree1 = 0
23730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23740 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
23750 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  -1; i=i+2){.    
23760 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20      if( pX ){.  
23770 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23780 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pTest!=0 );.    
23790 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
237a0 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c  pRight = aListel
237b0 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
237c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
237d0 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c        pTest = aL
237e0 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
237f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23800 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73      nextCase = s
23810 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
23820 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
23830 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
23840 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Test->op==TK_COL
23850 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
23860 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
23870 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c  e(pParse, pTest,
23880 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54   nextCase, SQLIT
23890 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
238a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
238b0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
238c0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
238d0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
238e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
238f0 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
23900 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61  m[i+1].pExpr, ta
23910 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
23920 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
23930 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
23940 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23950 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
23960 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20  nextCase);.     
23970 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45   }.      if( (nE
23980 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20  xpr&1)!=0 ){.   
23990 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
239a0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
239b0 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e  ist->a[nExpr-1].
239c0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
239d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
239e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
239f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
23a00 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
23a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
23a20 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
23a30 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c  abel(v, endLabel
23a40 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
23a50 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
23a60 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
23a70 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
23a80 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ISE: {.      ass
23a90 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69  ert( pExpr->affi
23aa0 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  nity==OE_Rollbac
23ab0 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  k .           ||
23ac0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
23ad0 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20  ==OE_Abort.     
23ae0 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
23af0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69  affinity==OE_Fai
23b00 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  l.           || 
23b10 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
23b20 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20  =OE_Ignore.     
23b30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
23b40 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54  Parse->pTriggerT
23b50 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ab ){.        sq
23b60 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
23b70 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
23b80 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
23b90 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
23ba0 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
23bb0 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
23bc0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
23bd0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
23be0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
23bf0 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
23c00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23c10 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
23c20 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
23c30 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
23c40 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
23c50 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
23c60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
23c70 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
23c80 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
23c90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23ca0 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20  dOp4(.          
23cb0 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51    v, OP_Halt, SQ
23cc0 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f  LITE_OK, OE_Igno
23cd0 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  re, 0, pExpr->u.
23ce0 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20  zToken,0);.     
23cf0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
23d00 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
23d10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23d20 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
23d30 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f  Parse, SQLITE_CO
23d40 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
23d50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d70 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c  pExpr->affinity,
23d80 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
23d90 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
23da0 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
23db0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
23dc0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
23dd0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
23de0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
23df0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
23e00 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
23e10 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ee2);.  return i
23e20 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  nReg;.}../*.** F
23e30 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f  actor out the co
23e40 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  de of the given 
23e50 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e  expression to in
23e60 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d  itialization tim
23e70 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44  e..**.** If regD
23e80 65 73 74 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  est>=0 then the 
23e90 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73  result is always
23ea0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 61 74 20   stored in that 
23eb0 72 65 67 69 73 74 65 72 20 61 6e 64 20 74 68 65  register and the
23ec0 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  .** result is no
23ed0 74 20 72 65 75 73 61 62 6c 65 2e 20 20 49 66 20  t reusable.  If 
23ee0 72 65 67 44 65 73 74 3c 30 20 74 68 65 6e 20 74  regDest<0 then t
23ef0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66  his routine is f
23f00 72 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65  ree to .** store
23f10 20 74 68 65 20 76 61 6c 75 65 20 77 68 65 72 65   the value where
23f20 65 76 65 72 20 69 74 20 77 61 6e 74 73 2e 20 20  ever it wants.  
23f30 54 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  The register whe
23f40 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
23f50 6e 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  n .** is stored 
23f60 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 57 68  is returned.  Wh
23f70 65 6e 20 72 65 67 44 65 73 74 3c 30 2c 20 74 77  en regDest<0, tw
23f80 6f 20 69 64 65 6e 74 69 63 61 6c 20 65 78 70 72  o identical expr
23f90 65 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20  essions will.** 
23fa0 63 6f 64 65 20 74 6f 20 74 68 65 20 73 61 6d 65  code to the same
23fb0 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e   register..*/.in
23fc0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
23fd0 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65  eAtInit(.  Parse
23fe0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
23ff0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
24000 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
24010 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ,      /* The ex
24020 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65  pression to code
24030 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69   when the VDBE i
24040 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20  nitializes */.  
24050 69 6e 74 20 72 65 67 44 65 73 74 20 20 20 20 20  int regDest     
24060 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76    /* Store the v
24070 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
24080 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78  ister */.){.  Ex
24090 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73  prList *p;.  ass
240a0 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72  ert( ConstFactor
240b0 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20  Ok(pParse) );.  
240c0 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  p = pParse->pCon
240d0 73 74 45 78 70 72 3b 0a 20 20 69 66 28 20 72 65  stExpr;.  if( re
240e0 67 44 65 73 74 3c 30 20 26 26 20 70 20 29 7b 0a  gDest<0 && p ){.
240f0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
24100 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
24110 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
24120 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20  for(pItem=p->a, 
24130 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b  i=p->nExpr; i>0;
24140 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a   pItem++, i--){.
24150 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
24160 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c  >reusable && sql
24170 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
24180 30 2c 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70  0,pItem->pExpr,p
24190 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20  Expr,-1)==0 ){. 
241a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49         return pI
241b0 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
241c0 72 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rReg;.      }.  
241d0 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 20    }.  }.  pExpr 
241e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
241f0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
24200 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71  pr, 0);.  p = sq
24210 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
24220 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70  end(pParse, p, p
24230 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29  Expr);.  if( p )
24240 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20 45 78  {.     struct Ex
24250 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
24260 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45  em = &p->a[p->nE
24270 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74  xpr-1];.     pIt
24280 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72  em->reusable = r
24290 65 67 44 65 73 74 3c 30 3b 0a 20 20 20 20 20 69  egDest<0;.     i
242a0 66 28 20 72 65 67 44 65 73 74 3c 30 20 29 20 72  f( regDest<0 ) r
242b0 65 67 44 65 73 74 20 3d 20 2b 2b 70 50 61 72 73  egDest = ++pPars
242c0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49  e->nMem;.     pI
242d0 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
242e0 72 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a  rReg = regDest;.
242f0 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43    }.  pParse->pC
24300 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 20 20  onstExpr = p;.  
24310 72 65 74 75 72 6e 20 72 65 67 44 65 73 74 3b 0a  return regDest;.
24320 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
24330 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
24340 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
24350 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
24360 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61  esults.** into a
24370 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75   register.  Retu
24380 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
24390 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65  number where the
243a0 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20   results.** are 
243b0 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  stored..**.** If
243c0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
243d0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67   a temporary reg
243e0 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62  ister that can b
243f0 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a  e deallocated,.*
24400 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73  * then write its
24410 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52   number into *pR
24420 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  eg.  If the resu
24430 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  lt register is n
24440 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  ot.** a temporar
24450 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  y, then set *pRe
24460 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  g to zero..**.**
24470 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63   If pExpr is a c
24480 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
24490 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
244a0 20 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a   generate this.*
244b0 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74  * code to fill t
244c0 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  he register in t
244d0 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
244e0 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  n section of the
244f0 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
24500 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61  , in order to fa
24510 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74  ctor it out of t
24520 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f  he evaluation lo
24530 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
24540 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50  e3ExprCodeTemp(P
24550 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
24560 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a  pr *pExpr, int *
24570 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b  pReg){.  int r2;
24580 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
24590 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
245a0 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  e(pExpr);.  if( 
245b0 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
245c0 61 72 73 65 29 0a 20 20 20 26 26 20 70 45 78 70  arse).   && pExp
245d0 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
245e0 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  ER.   && sqlite3
245f0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
24600 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29  tJoin(pExpr).  )
24610 7b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30  {.    *pReg  = 0
24620 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
24630 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
24640 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
24650 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
24660 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
24670 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
24680 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73  rse);.    r2 = s
24690 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
246a0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
246b0 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28  pr, r1);.    if(
246c0 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20   r2==r1 ){.     
246d0 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20   *pReg = r1;.   
246e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
246f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
24700 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
24710 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30  .      *pReg = 0
24720 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
24730 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn r2;.}../*.*
24740 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
24750 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
24760 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
24770 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
24780 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
24790 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
247a0 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
247b0 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
247c0 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
247d0 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f  ister target..*/
247e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
247f0 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
24800 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
24810 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
24820 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61   int inReg;..  a
24830 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
24840 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
24850 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
24860 20 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d   pExpr && pExpr-
24870 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
24880 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
24890 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
248a0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79  ->pVdbe, OP_Copy
248b0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
248c0 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73   target);.  }els
248d0 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73  e{.    inReg = s
248e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
248f0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
24900 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
24910 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
24920 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61  >pVdbe!=0 || pPa
24930 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
24940 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
24950 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26   inReg!=target &
24960 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  & pParse->pVdbe 
24970 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24980 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
24990 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
249a0 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
249b0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
249c0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72  ./*.** Make a tr
249d0 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20  ansient copy of 
249e0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
249f0 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69   and then code i
24a00 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  t using.** sqlit
24a10 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54  e3ExprCode().  T
24a20 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
24a30 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69  s just like sqli
24a40 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a  te3ExprCode().**
24a50 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
24a60 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f   input expressio
24a70 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  n is guaranteed 
24a80 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e  to be unchanged.
24a90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24aa0 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72  ExprCodeCopy(Par
24ab0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
24ac0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
24ad0 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  get){.  sqlite3 
24ae0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
24af0 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
24b00 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
24b10 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
24b20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
24b30 64 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43  d ) sqlite3ExprC
24b40 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
24b50 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71  r, target);.  sq
24b60 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
24b70 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  db, pExpr);.}../
24b80 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
24b90 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
24ba0 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
24bb0 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
24bc0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
24bd0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
24be0 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
24bf0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
24c00 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
24c10 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
24c20 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
24c30 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
24c40 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
24c50 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f  ne.** might choo
24c60 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65  se to code the e
24c70 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69  xpression at ini
24c80 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
24c90 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24ca0 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61  3ExprCodeFactora
24cb0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
24cc0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
24cd0 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
24ce0 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e  f( pParse->okCon
24cf0 73 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69  stFactor && sqli
24d00 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
24d10 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20  tNotJoin(pExpr) 
24d20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
24d30 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
24d40 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
24d50 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  et);.  }else{.  
24d60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
24d70 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
24d80 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a   target);.  }.}.
24d90 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
24da0 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
24db0 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
24dc0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74  pression and put
24dd0 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
24de0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
24df0 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d  et..**.** Also m
24e00 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
24e10 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73  e expression res
24e20 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65  ults into anothe
24e30 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74  r "cache" regist
24e40 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79  er.** and modify
24e50 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24e60 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
24e70 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c   time it is eval
24e80 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65  uated,.** the re
24e90 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f  sult is a copy o
24ea0 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69  f the cache regi
24eb0 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ster..**.** This
24ec0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
24ed0 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73   for expressions
24ee0 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d   that are used m
24ef0 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
24f00 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61  s.  They are eva
24f10 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20  luated once and 
24f20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
24f30 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
24f40 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a   are reused..*/.
24f50 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
24f60 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
24f70 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
24f80 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
24f90 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
24fa0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
24fb0 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20  .  int iMem;..  
24fc0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
24fd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
24fe0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
24ff0 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65  STER );.  sqlite
25000 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
25010 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
25020 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ;.  iMem = ++pPa
25030 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
25040 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25050 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65  , OP_Copy, targe
25060 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72  t, iMem);.  expr
25070 54 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72  ToRegister(pExpr
25080 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iMem);.}../*.*
25090 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
250a0 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
250b0 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
250c0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
250d0 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
250e0 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65  n list into a se
250f0 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
25100 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ers beginning at
25110 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52   target..**.** R
25120 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
25130 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61   of elements eva
25140 6c 75 61 74 65 64 2e 20 20 54 68 65 20 6e 75 6d  luated.  The num
25150 62 65 72 20 72 65 74 75 72 6e 65 64 20 77 69 6c  ber returned wil
25160 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20 62 65 20  l.** usually be 
25170 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 62 75 74  pList->nExpr but
25180 20 6d 69 67 68 74 20 62 65 20 72 65 64 75 63 65   might be reduce
25190 64 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c  d if SQLITE_ECEL
251a0 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69 73 20 64  _OMITREF.** is d
251b0 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  efined..**.** Th
251c0 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  e SQLITE_ECEL_DU
251d0 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20  P flag prevents 
251e0 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72  the arguments fr
251f0 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c  om being.** fill
25200 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70  ed using OP_SCop
25210 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74  y.  OP_Copy must
25220 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
25230 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
25240 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61  TE_ECEL_FACTOR a
25250 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63  rgument allows c
25260 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
25270 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f  s to be.** facto
25280 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69  red out into ini
25290 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65  tialization code
252a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
252b0 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67  TE_ECEL_REF flag
252c0 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70 72   means that expr
252d0 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c  essions in the l
252e0 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72  ist with.** Expr
252f0 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72  List.a[].u.x.iOr
25300 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20  derByCol>0 have 
25310 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76 61  already been eva
25320 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65  luated and store
25330 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  d.** in register
25340 73 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64  s at srcReg, and
25350 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61   so the value ca
25360 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d  n be copied from
25370 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66 20 53 51   there..** If SQ
25380 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
25390 46 20 69 73 20 61 6c 73 6f 20 73 65 74 2c 20 74  F is also set, t
253a0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 77  hen the values w
253b0 69 74 68 20 75 2e 78 2e 69 4f 72 64 65 72 42 79  ith u.x.iOrderBy
253c0 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20 73 69 6d  Col>0.** are sim
253d0 70 6c 79 20 6f 6d 69 74 74 65 64 20 72 61 74 68  ply omitted rath
253e0 65 72 20 74 68 61 6e 20 62 65 69 6e 67 20 63 6f  er than being co
253f0 70 69 65 64 20 66 72 6f 6d 20 73 72 63 52 65 67  pied from srcReg
25400 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25410 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
25420 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
25430 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
25440 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
25450 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
25460 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
25470 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
25480 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
25490 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
254a0 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
254b0 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
254c0 73 72 63 52 65 67 2c 20 20 20 20 20 20 20 20 2f  srcReg,        /
254d0 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73 74 65  * Source registe
254e0 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45  rs if SQLITE_ECE
254f0 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c  L_REF */.  u8 fl
25500 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
25510 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66   SQLITE_ECEL_* f
25520 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lags */.){.  str
25530 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
25540 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
25550 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f  i, j, n;.  u8 co
25560 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20  pyOp = (flags & 
25570 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
25580 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f   ? OP_Copy : OP_
25590 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a 76  SCopy;.  Vdbe *v
255a0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
255b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
255c0 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
255d0 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
255e0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
255f0 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20  pVdbe!=0 );  /* 
25600 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20  Never gets this 
25610 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f  far otherwise */
25620 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
25630 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73  xpr;.  if( !Cons
25640 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
25650 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51  ) ) flags &= ~SQ
25660 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
25670 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
25680 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
25690 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
256a0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
256b0 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
256c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
256d0 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
256e0 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
256f0 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65  pItem->bSorterRe
25700 66 20 29 7b 0a 20 20 20 20 20 20 69 2d 2d 3b 0a  f ){.      i--;.
25710 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d        n--;.    }
25720 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
25730 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
25740 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30  ITE_ECEL_REF)!=0
25750 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e   && (j = pItem->
25760 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29  u.x.iOrderByCol)
25770 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
25780 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
25790 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20  CEL_OMITREF ){. 
257a0 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20         i--;.    
257b0 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d      n--;.      }
257c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
257d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
257e0 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63  v, copyOp, j+src
257f0 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29  Reg-1, target+i)
25800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
25810 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
25820 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
25830 54 4f 52 29 21 3d 30 0a 20 20 20 20 20 20 20 20  TOR)!=0.        
25840 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
25850 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
25860 69 6e 28 70 45 78 70 72 29 0a 20 20 20 20 29 7b  in(pExpr).    ){
25870 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25880 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
25890 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
258a0 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  et+i);.    }else
258b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65  {.      int inRe
258c0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
258d0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
258e0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
258f0 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  i);.      if( in
25900 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b  Reg!=target+i ){
25910 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
25920 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  *pOp;.        if
25930 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70  ( copyOp==OP_Cop
25940 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  y.         && (p
25950 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65  Op=sqlite3VdbeGe
25960 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63  tOp(v, -1))->opc
25970 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  ode==OP_Copy.   
25980 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31        && pOp->p1
25990 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65  +pOp->p3+1==inRe
259a0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  g.         && pO
259b0 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p2+pOp->p3+1=
259c0 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20  =target+i.      
259d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
259e0 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20  Op->p3++;.      
259f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25a00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25a10 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20  dOp2(v, copyOp, 
25a20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29  inReg, target+i)
25a30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25a40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
25a50 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
25a60 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
25a70 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f   for a BETWEEN o
25a80 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  perator..**.**  
25a90 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
25aa0 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  D z.**.** The ab
25ab0 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ove is equivalen
25ac0 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78  t to .**.**    x
25ad0 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a  >=y AND x<=z.**.
25ae0 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
25af0 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
25b00 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
25b10 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
25b20 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66  * elimination of
25b30 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a   x..**.** The xJ
25b40 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72 20  umpIf parameter 
25b50 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61 69  determines detai
25b60 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c  ls:.**.**    NUL
25b70 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L:              
25b80 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 62       Store the b
25b90 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69 6e  oolean result in
25ba0 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20   reg[dest].**   
25bb0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
25bc0 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74 6f  ue:      Jump to
25bd0 20 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a 2a   dest if true.**
25be0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25bf0 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70  fFalse:     Jump
25c00 20 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c 73   to dest if fals
25c10 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70  e.**.** The jump
25c20 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65 72  IfNull parameter
25c30 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 78   is ignored if x
25c40 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a  JumpIf is NULL..
25c50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
25c60 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a  xprCodeBetween(.
25c70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25c80 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
25c90 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
25ca0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
25cb0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
25cc0 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e    /* The BETWEEN
25cd0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
25ce0 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
25cf0 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69     /* Jump desti
25d00 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67  nation or storag
25d10 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  e location */.  
25d20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50 61  void (*xJump)(Pa
25d30 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69  rse*,Expr*,int,i
25d40 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74  nt), /* Action t
25d50 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20  o take */.  int 
25d60 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
25d70 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
25d80 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
25d90 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70   NULL */.){. Exp
25da0 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f  r exprAnd;     /
25db0 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74  * The AND operat
25dc0 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20  or in  x>=y AND 
25dd0 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20  x<=z  */.  Expr 
25de0 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20  compLeft;    /* 
25df0 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20  The  x>=y  term 
25e00 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69  */.  Expr compRi
25e10 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78  ght;   /* The  x
25e20 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  <=z  term */.  E
25e30 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20  xpr exprX;      
25e40 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65   /* The  x  sube
25e50 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
25e60 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
25e70 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73   /* Temporary us
25e80 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20  e register */.. 
25e90 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66   memset(&compLef
25ea0 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  t, 0, sizeof(Exp
25eb0 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63  r));.  memset(&c
25ec0 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73 69 7a  ompRight, 0, siz
25ed0 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65  eof(Expr));.  me
25ee0 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c 20 30  mset(&exprAnd, 0
25ef0 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
25f00 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ..  assert( !Exp
25f10 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
25f20 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
25f30 29 20 29 3b 0a 20 20 65 78 70 72 4e 6f 64 65 43  ) );.  exprNodeC
25f40 6f 70 79 28 26 65 78 70 72 58 2c 20 70 45 78 70  opy(&exprX, pExp
25f50 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 65 78 70  r->pLeft);.  exp
25f60 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  rAnd.op = TK_AND
25f70 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66  ;.  exprAnd.pLef
25f80 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
25f90 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20   exprAnd.pRight 
25fa0 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20  = &compRight;.  
25fb0 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
25fc0 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  _GE;.  compLeft.
25fd0 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
25fe0 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
25ff0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
26000 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
26010 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
26020 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69   TK_LE;.  compRi
26030 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
26040 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  rX;.  compRight.
26050 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
26060 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
26070 78 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67  xpr;.  exprToReg
26080 69 73 74 65 72 28 26 65 78 70 72 58 2c 20 65 78  ister(&exprX, ex
26090 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
260a0 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65  rse, &exprX, &re
260b0 67 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20  gFree1));.  if( 
260c0 78 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75  xJump ){.    xJu
260d0 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  mp(pParse, &expr
260e0 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  And, dest, jumpI
260f0 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  fNull);.  }else{
26100 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  .    /* Mark the
26110 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 62   expression is b
26120 65 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e  eing from the ON
26130 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
26140 20 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a   of a join.    *
26150 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 71  * so that the sq
26160 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
26170 67 65 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69  get() routine wi
26180 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
26190 6f 20 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74  o move.    ** it
261a0 20 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e   into the Parse.
261b0 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 2e  pConstExpr list.
261c0 20 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65 20    We should use 
261d0 61 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74 68  a new bit for th
261e0 69 73 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63  is,.    ** for c
261f0 6c 61 72 69 74 79 2c 20 62 75 74 20 77 65 20 61  larity, but we a
26200 72 65 20 6f 75 74 20 6f 66 20 62 69 74 73 20 69  re out of bits i
26210 6e 20 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73  n the Expr.flags
26220 20 66 69 65 6c 64 20 73 6f 20 77 65 0a 20 20 20   field so we.   
26230 20 2a 2a 20 68 61 76 65 20 74 6f 20 72 65 75 73   ** have to reus
26240 65 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  e the EP_FromJoi
26250 6e 20 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20  n bit.  Bummer. 
26260 2a 2f 0a 20 20 20 20 65 78 70 72 58 2e 66 6c 61  */.    exprX.fla
26270 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69  gs |= EP_FromJoi
26280 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  n;.    sqlite3Ex
26290 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
262a0 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
262b0 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  est);.  }.  sqli
262c0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
262d0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
262e0 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  e1);..  /* Ensur
262f0 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20  e adequate test 
26300 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65  coverage */.  te
26310 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26320 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
26330 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d    && jumpIfNull=
26340 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
26350 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26360 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26370 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
26380 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
26390 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
263a0 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
263b0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72  =sqlite3ExprIfTr
263c0 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ue  && jumpIfNul
263d0 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
263e0 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
263f0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
26400 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
26410 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
26420 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
26430 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26440 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26450 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
26460 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
26470 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
26480 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
26490 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
264a0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
264b0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
264c0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
264d0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
264e0 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49  IfFalse && jumpI
264f0 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
26500 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
26510 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
26520 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26530 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
26540 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
26550 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
26560 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  xJump==0 );.}../
26570 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
26580 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
26590 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
265a0 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
265b0 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
265c0 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
265d0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
265e0 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
265f0 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
26600 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
26610 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
26620 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
26630 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
26640 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
26650 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
26660 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
26670 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
26680 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
26690 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53  IfNull flag is S
266a0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
266b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64  ..**.** This cod
266c0 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
266d0 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61   fact that certa
266e0 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  in token values 
266f0 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61  (ex: TK_EQ).** a
26700 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f  re the same as o
26710 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78  pcode values (ex
26720 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d  : OP_Eq) that im
26730 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72  plement the corr
26740 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65  esponding.** ope
26750 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c  ration.  Special
26760 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62   comments in vdb
26770 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70  e.c and the mkop
26780 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74  codeh.awk script
26790 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20   in.** the make 
267a0 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68  process cause th
267b0 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c  ese values to al
267c0 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20  ign.  Assert()s 
267d0 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62  in the code.** b
267e0 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74  elow verify that
267f0 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65   the numbers are
26800 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74   aligned correct
26810 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
26820 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61  te3ExprIfTrue(Pa
26830 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
26840 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
26850 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
26860 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
26870 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
26880 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
26890 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
268a0 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
268b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
268c0 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
268d0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
268e0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
268f0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
26900 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
26910 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b  0) )     return;
26920 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f    /* Existence o
26930 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
26940 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
26950 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
26960 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
26970 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20  No way this can 
26980 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d  happen */.  op =
26990 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
269a0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
269b0 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
269c0 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
269d0 20 20 20 20 20 45 78 70 72 20 2a 70 41 6c 74 20       Expr *pAlt 
269e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 69 6d  = sqlite3ExprSim
269f0 70 6c 69 66 69 65 64 41 6e 64 4f 72 28 70 45 78  plifiedAndOr(pEx
26a00 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
26a10 41 6c 74 21 3d 70 45 78 70 72 20 29 7b 0a 20 20  Alt!=pExpr ){.  
26a20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26a30 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
26a40 70 41 6c 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  pAlt, dest, jump
26a50 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  IfNull);.      }
26a60 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
26a70 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  AND ){.        i
26a80 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
26a90 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
26aa0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  rse);.        te
26ab0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26ac0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ll==0 );.       
26ad0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
26ae0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
26af0 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 0a 20 20  r->pLeft, d2,.  
26b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b10 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 66 4e           jumpIfN
26b20 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
26b30 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
26b40 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
26b50 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
26b60 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
26b70 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
26b80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
26b90 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
26ba0 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  2);.      }else{
26bb0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
26bc0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
26bd0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
26be0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
26bf0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26c00 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
26c10 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
26c20 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
26c30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
26c40 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
26c50 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
26c60 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
26c70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
26c80 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
26c90 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
26ca0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
26cb0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
26cc0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
26cd0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
26ce0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
26cf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26d00 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48     case TK_TRUTH
26d10 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73  : {.      int is
26d20 4e 6f 74 3b 20 20 20 20 20 20 2f 2a 20 49 53 20  Not;      /* IS 
26d30 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e  NOT TRUE or IS N
26d40 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20  OT FALSE */.    
26d50 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 20    int isTrue;   
26d60 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20    /* IS TRUE or 
26d70 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20  IS NOT TRUE */. 
26d80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
26d90 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26da0 20 20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45        isNot = pE
26db0 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e  xpr->op2==TK_ISN
26dc0 4f 54 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65  OT;.      isTrue
26dd0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72   = sqlite3ExprTr
26de0 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e  uthValue(pExpr->
26df0 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74  pRight);.      t
26e00 65 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20  estcase( isTrue 
26e10 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20  && isNot );.    
26e20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54    testcase( !isT
26e30 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a  rue && isNot );.
26e40 20 20 20 20 20 20 69 66 28 20 69 73 54 72 75 65        if( isTrue
26e50 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20   ^ isNot ){.    
26e60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26e70 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
26e80 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
26e90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26ea0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f              isNo
26eb0 74 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  t ? SQLITE_JUMPI
26ec0 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20  FNULL : 0);.    
26ed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26ee0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
26ef0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
26f00 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a  r->pLeft, dest,.
26f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74             isNot
26f30 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   ? SQLITE_JUMPIF
26f40 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20  NULL : 0);.     
26f50 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
26f60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
26f70 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
26f80 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
26f90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
26fa0 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
26fb0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
26fc0 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  OT );.      op =
26fd0 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54   (op==TK_IS) ? T
26fe0 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20  K_EQ : TK_NE;.  
26ff0 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d      jumpIfNull =
27000 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a   SQLITE_NULLEQ;.
27010 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
27020 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ru */.    case T
27030 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
27040 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
27050 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
27060 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
27070 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
27080 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_EQ: {.      if
27090 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
270a0 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65  ector(pExpr->pLe
270b0 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75  ft) ) goto defau
270c0 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74  lt_expr;.      t
270d0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
270e0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
270f0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
27100 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
27110 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
27120 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
27130 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
27140 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
27150 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
27160 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
27170 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
27180 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27190 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
271a0 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
271b0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
271c0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
271d0 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
271e0 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
271f0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
27200 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
27210 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
27220 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27230 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
27240 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
27250 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
27260 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
27270 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
27280 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
27290 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
272a0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
272b0 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
272c0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
272d0 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
272e0 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
272f0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27300 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
27310 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
27320 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
27330 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  e(op==OP_Eq);.  
27340 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
27350 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
27360 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
27370 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
27380 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
27390 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71  eIf(v, op==OP_Eq
273a0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
273b0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
273c0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
273d0 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74  NE==OP_Ne); test
273e0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
273f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27400 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
27410 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
27420 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
27430 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
27440 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
27450 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Ne && jumpIfNul
27460 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
27470 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27480 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
27490 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
274a0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
274b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
274c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
274d0 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
274e0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
274f0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
27500 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
27510 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  l );   testcase(
27520 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
27530 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27540 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
27550 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61  otNull ); testca
27560 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
27570 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  LL );.      r1 =
27580 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
27590 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
275a0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
275b0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
275c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
275d0 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
275e0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
275f0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
27600 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  ISNULL);.      V
27610 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27620 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
27630 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27640 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
27650 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27660 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27670 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
27680 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
27690 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
276a0 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
276b0 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
276c0 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78   dest, sqlite3Ex
276d0 70 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66  prIfTrue, jumpIf
276e0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
276f0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
27700 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
27710 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
27720 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
27730 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
27740 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
27750 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
27760 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
27770 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c  ull = jumpIfNull
27780 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66   ? dest : destIf
27790 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c  False;.      sql
277a0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
277b0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
277c0 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
277d0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
277e0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
277f0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
27800 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
27810 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
27820 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alse);.      bre
27830 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
27840 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
27850 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72      default_expr
27860 3a 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  :.      if( Expr
27870 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72  AlwaysTrue(pExpr
27880 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
27890 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
278a0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
278b0 73 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79  se if( ExprAlway
278c0 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
278d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  .        /* No-o
278e0 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  p */.      }else
278f0 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
27900 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
27910 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
27920 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
27930 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27940 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
27950 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
27960 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
27970 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
27980 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
27990 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
279a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
279b0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
279c0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
279d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
279e0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
279f0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
27a00 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
27a10 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
27a20 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
27a30 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a  e, regFree2);  .
27a40 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
27a50 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
27a60 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
27a70 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
27a80 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
27a90 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
27aa0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
27ab0 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
27ac0 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
27ad0 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
27ae0 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
27af0 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
27b00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
27b10 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
27b20 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
27b30 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
27b40 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
27b50 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
27b60 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
27b70 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  L or fall throug
27b80 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a  h if jumpIfNull.
27b90 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ** is 0..*/.void
27ba0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
27bb0 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
27bc0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
27bd0 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
27be0 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
27bf0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
27c00 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
27c10 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
27c20 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
27c30 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
27c40 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
27c50 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
27c60 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
27c70 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
27c80 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
27c90 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
27ca0 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  n; /* Existence 
27cb0 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
27cc0 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
27cd0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20  f( pExpr==0 )   
27ce0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
27cf0 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70  he value of pExp
27d00 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65  r->op and op are
27d10 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c   related as foll
27d20 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
27d30 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20       pExpr->op  
27d40 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a            op.  *
27d50 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  *       --------
27d60 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  -          -----
27d70 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20  -----.  **      
27d80 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20   TK_ISNULL      
27d90 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20      OP_NotNull. 
27da0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54   **       TK_NOT
27db0 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f  NULL         OP_
27dc0 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  IsNull.  **     
27dd0 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20    TK_NE         
27de0 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20       OP_Eq.  ** 
27df0 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20        TK_EQ     
27e00 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20           OP_Ne. 
27e10 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20   **       TK_GT 
27e20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
27e30 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Le.  **       TK
27e40 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _LE             
27e50 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Gt.  **     
27e60 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20    TK_GE         
27e70 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20       OP_Lt.  ** 
27e80 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20        TK_LT     
27e90 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20           OP_Ge. 
27ea0 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68   **.  ** For oth
27eb0 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78  er values of pEx
27ec0 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e  pr->op, op is un
27ed0 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73  defined and unus
27ee0 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  ed..  ** The val
27ef0 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  ue of TK_ and OP
27f00 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20  _ constants are 
27f10 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68  arranged such th
27f20 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63  at we.  ** can c
27f30 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69  ompute the mappi
27f40 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74  ng above using t
27f50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
27f60 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73  ression..  ** As
27f70 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74  sert()s verify t
27f80 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74  hat the computat
27f90 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ion is correct..
27fa0 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45    */.  op = ((pE
27fb0 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55  xpr->op+(TK_ISNU
27fc0 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53  LL&1))^1)-(TK_IS
27fd0 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56  NULL&1);..  /* V
27fe0 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c  erify correct al
27ff0 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61  ignment of TK_ a
28000 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
28010 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
28020 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53  pExpr->op!=TK_IS
28030 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  NULL || op==OP_N
28040 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  otNull );.  asse
28050 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
28060 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  K_NOTNULL || op=
28070 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
28080 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28090 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_NE || op==
280a0 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72  OP_Eq );.  asser
280b0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
280c0 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65  _EQ || op==OP_Ne
280d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
280e0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c  xpr->op!=TK_LT |
280f0 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  | op==OP_Ge );. 
28100 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
28110 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op!=TK_LE || op=
28120 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
28130 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
28140 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GT || op==OP_L
28150 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
28160 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20  Expr->op!=TK_GE 
28170 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  || op==OP_Lt );.
28180 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
28190 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
281a0 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
281b0 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
281c0 20 45 78 70 72 20 2a 70 41 6c 74 20 3d 20 73 71   Expr *pAlt = sq
281d0 6c 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66  lite3ExprSimplif
281e0 69 65 64 41 6e 64 4f 72 28 70 45 78 70 72 29 3b  iedAndOr(pExpr);
281f0 0a 20 20 20 20 20 20 69 66 28 20 70 41 6c 74 21  .      if( pAlt!
28200 3d 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  =pExpr ){.      
28210 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
28220 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 41 6c  alse(pParse, pAl
28230 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
28240 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ull);.      }els
28250 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
28260 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20  =TK_AND ){.     
28270 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
28280 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28290 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
282a0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
282b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, 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 20 20 73 71 6c 69 74 65  ;.        sqlite
282e0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
282f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
28300 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
28310 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Null);.      }el
28320 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
28330 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
28340 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
28350 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
28360 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
28370 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
28380 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
28390 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
283a0 4c 65 66 74 2c 20 64 32 2c 0a 20 20 20 20 20 20  Left, d2,.      
283b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283c0 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53      jumpIfNull^S
283d0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
283e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
283f0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
28400 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
28410 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
28420 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
28430 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
28440 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
28450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
28460 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
28470 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
28480 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
28490 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
284a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
284b0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
284c0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
284d0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
284e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
284f0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
28500 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RUTH: {.      in
28510 74 20 69 73 4e 6f 74 3b 20 20 20 2f 2a 20 49 53  t isNot;   /* IS
28520 20 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20   NOT TRUE or IS 
28530 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20  NOT FALSE */.   
28540 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20     int isTrue;  
28550 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
28560 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20   NOT TRUE */.   
28570 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
28580 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28590 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70      isNot = pExp
285a0 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54  r->op2==TK_ISNOT
285b0 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d  ;.      isTrue =
285c0 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74   sqlite3ExprTrut
285d0 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52  hValue(pExpr->pR
285e0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73  ight);.      tes
285f0 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26  tcase( isTrue &&
28600 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20   isNot );.      
28610 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75  testcase( !isTru
28620 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20  e && isNot );.  
28630 20 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e      if( isTrue ^
28640 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20   isNot ){.      
28650 20 20 2f 2a 20 49 53 20 54 52 55 45 20 61 6e 64    /* IS TRUE and
28660 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f   IS NOT FALSE */
28670 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28680 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
28690 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
286a0 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20  , dest,.        
286b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286c0 20 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53     isNot ? 0 : S
286d0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
286e0 29 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  );..      }else{
286f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20 46  .        /* IS F
28700 41 4c 53 45 20 61 6e 64 20 49 53 20 4e 4f 54 20  ALSE and IS NOT 
28710 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  TRUE */.        
28720 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
28730 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
28740 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20  >pLeft, dest,.  
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28760 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20          isNot ? 
28770 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  0 : SQLITE_JUMPI
28780 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
28790 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
287a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
287b0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
287c0 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
287d0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
287e0 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
287f0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
28800 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
28810 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78  .      op = (pEx
28820 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f  pr->op==TK_IS) ?
28830 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a   TK_NE : TK_EQ;.
28840 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c        jumpIfNull
28850 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
28860 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
28870 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65  thru */.    case
28880 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
28890 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
288a0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
288b0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
288c0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
288d0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
288e0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
288f0 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70  sVector(pExpr->p
28900 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66  Left) ) goto def
28910 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20  ault_expr;.     
28920 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
28930 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
28940 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
28950 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
28960 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
28970 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
28980 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
28990 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
289a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
289b0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
289c0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
289d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
289e0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
289f0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
28a00 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
28a10 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
28a20 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
28a30 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
28a40 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
28a50 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
28a60 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
28a70 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Lt);.      asser
28a80 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
28a90 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
28aa0 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
28ab0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
28ac0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28ad0 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
28ae0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
28af0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
28b00 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
28b10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
28b20 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
28b30 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
28b40 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
28b50 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
28b60 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
28b70 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
28b80 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  ase(op==OP_Eq);.
28b90 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
28ba0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
28bb0 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  q && jumpIfNull!
28bc0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
28bd0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
28be0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
28bf0 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
28c00 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
28c10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
28c20 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
28c30 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
28c40 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
28c50 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
28c60 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
28c70 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
28c80 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
28c90 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
28ca0 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
28cb0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
28cc0 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
28cd0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
28ce0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28cf0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
28d00 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
28d10 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
28d20 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
28d30 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
28d40 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
28d50 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
28d60 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28d70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
28d80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
28d90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
28da0 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
28db0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
28dc0 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56  TK_ISNULL );   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 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
28df0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28e00 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
28e10 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
28e20 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
28e30 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
28e40 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
28e50 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
28e60 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
28e70 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
28e80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28e90 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
28ea0 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
28eb0 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
28ec0 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69  Expr, dest, sqli
28ed0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c 20  te3ExprIfFalse, 
28ee0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
28ef0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28f00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28f10 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
28f20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
28f30 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e       if( jumpIfN
28f40 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
28f50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
28f60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
28f70 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  dest, dest);.   
28f80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28f90 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
28fa0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
28fb0 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
28fc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28fd0 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
28fe0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
28ff0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
29000 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29010 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
29020 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
29030 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
29040 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
29050 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
29060 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20    default_expr: 
29070 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 41  .      if( ExprA
29080 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
29090 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
290a0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
290b0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
290c0 73 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79  se if( ExprAlway
290d0 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a  sTrue(pExpr) ){.
290e0 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70          /* no-op
290f0 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
29100 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
29110 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
29120 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
29130 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
29140 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29150 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
29160 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  ot, r1, dest, ju
29170 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
29180 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
29190 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  ge(v);.        t
291a0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
291b0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
291c0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
291d0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
291e0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
291f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
29200 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
29210 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
29220 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
29230 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
29240 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
29250 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71  }../*.** Like sq
29260 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
29270 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 61  () except that a
29280 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
29290 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a   pExpr before.**
292a0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
292b0 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20  , and that copy 
292c0 69 73 20 64 65 6c 65 74 65 64 20 61 66 74 65 72  is deleted after
292d0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
292e0 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65  . This.** ensure
292f0 73 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  s that the origi
29300 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63  nal pExpr is unc
29310 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  hanged..*/.void 
29320 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
29330 73 65 44 75 70 28 50 61 72 73 65 20 2a 70 50 61  seDup(Parse *pPa
29340 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
29350 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a  , int dest,int j
29360 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71  umpIfNull){.  sq
29370 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
29380 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
29390 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45  pCopy = sqlite3E
293a0 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
293b0 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  , 0);.  if( db->
293c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
293d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
293e0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
293f0 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a  , pCopy, dest, j
29400 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  umpIfNull);.  }.
29410 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
29420 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a  ete(db, pCopy);.
29430 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73  }../*.** Express
29440 69 6f 6e 20 70 56 61 72 20 69 73 20 67 75 61 72  ion pVar is guar
29450 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20  anteed to be an 
29460 53 51 4c 20 76 61 72 69 61 62 6c 65 2e 20 70 45  SQL variable. pE
29470 78 70 72 20 6d 61 79 20 62 65 20 61 6e 79 0a 2a  xpr may be any.*
29480 2a 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73  * type of expres
29490 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  sion..**.** If p
294a0 45 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65  Expr is a simple
294b0 20 53 51 4c 20 76 61 6c 75 65 20 2d 20 61 6e 20   SQL value - an 
294c0 69 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73  integer, real, s
294d0 74 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a 20 6f  tring, blob.** o
294e0 72 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2d 20 74  r NULL value - t
294f0 68 65 6e 20 74 68 65 20 56 44 42 45 20 63 75 72  hen the VDBE cur
29500 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 72 65  rently being pre
29510 70 61 72 65 64 20 69 73 20 63 6f 6e 66 69 67 75  pared is configu
29520 72 65 64 0a 2a 2a 20 74 6f 20 72 65 2d 70 72 65  red.** to re-pre
29530 70 61 72 65 20 65 61 63 68 20 74 69 6d 65 20 61  pare each time a
29540 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 62 6f   new value is bo
29550 75 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20  und to variable 
29560 70 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69  pVar..**.** Addi
29570 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 70 45 78  tionally, if pEx
29580 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53  pr is a simple S
29590 51 4c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  QL value and the
295a0 20 76 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a   value is the.**
295b0 20 73 61 6d 65 20 61 73 20 74 68 61 74 20 63 75   same as that cu
295c0 72 72 65 6e 74 6c 79 20 62 6f 75 6e 64 20 74 6f  rrently bound to
295d0 20 76 61 72 69 61 62 6c 65 20 70 56 61 72 2c 20   variable pVar, 
295e0 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
295f0 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  rned..** Otherwi
29600 73 65 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65  se, if the value
29610 73 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61  s are not the sa
29620 6d 65 20 6f 72 20 69 66 20 70 45 78 70 72 20 69  me or if pExpr i
29630 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 0a 2a  s not a simple.*
29640 2a 20 53 51 4c 20 76 61 6c 75 65 2c 20 7a 65 72  * SQL value, zer
29650 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  o is returned..*
29660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
29670 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65  rCompareVariable
29680 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
29690 45 78 70 72 20 2a 70 56 61 72 2c 20 45 78 70 72  Expr *pVar, Expr
296a0 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
296b0 72 65 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  res = 0;.  int i
296c0 56 61 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  Var;.  sqlite3_v
296d0 61 6c 75 65 20 2a 70 4c 2c 20 2a 70 52 20 3d 20  alue *pL, *pR = 
296e0 30 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 56  0;.  .  sqlite3V
296f0 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
29700 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
29710 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
29720 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2c 20 26 70  ITE_AFF_BLOB, &p
29730 52 29 3b 0a 20 20 69 66 28 20 70 52 20 29 7b 0a  R);.  if( pR ){.
29740 20 20 20 20 69 56 61 72 20 3d 20 70 56 61 72 2d      iVar = pVar-
29750 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  >iColumn;.    sq
29760 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
29770 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ask(pParse->pVdb
29780 65 2c 20 69 56 61 72 29 3b 0a 20 20 20 20 70 4c  e, iVar);.    pL
29790 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
297a0 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 50 61 72  tBoundValue(pPar
297b0 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20  se->pReprepare, 
297c0 69 56 61 72 2c 20 53 51 4c 49 54 45 5f 41 46 46  iVar, SQLITE_AFF
297d0 5f 42 4c 4f 42 29 3b 0a 20 20 20 20 69 66 28 20  _BLOB);.    if( 
297e0 70 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  pL ){.      if( 
297f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
29800 70 65 28 70 4c 29 3d 3d 53 51 4c 49 54 45 5f 54  pe(pL)==SQLITE_T
29810 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  EXT ){.        s
29820 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
29830 74 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65 20 73  t(pL); /* Make s
29840 75 72 65 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  ure the encoding
29850 20 69 73 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20   is UTF-8 */.   
29860 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d     }.      res =
29870 20 20 30 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 43    0==sqlite3MemC
29880 6f 6d 70 61 72 65 28 70 4c 2c 20 70 52 2c 20 30  ompare(pL, pR, 0
29890 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
298a0 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52  ite3ValueFree(pR
298b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
298c0 6c 75 65 46 72 65 65 28 70 4c 29 3b 0a 20 20 7d  lueFree(pL);.  }
298d0 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ..  return res;.
298e0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
298f0 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
29900 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
29910 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30  trees.  Return 0
29920 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
29930 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63  xpressions are c
29940 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69  ompletely identi
29950 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69  cal.  Return 1 i
29960 66 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e  f they differ on
29970 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41  ly.** by a COLLA
29980 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74  TE operator at t
29990 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52  he top level.  R
299a0 65 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65  eturn 2 if there
299b0 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73   are differences
299c0 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74  .** other than t
299d0 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c  he top-level COL
299e0 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LATE operator..*
299f0 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
29a00 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
29a10 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
29a20 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
29a30 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
29a40 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
29a50 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
29a60 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
29a70 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
29a80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69  .**.** The pA si
29a90 64 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e  de might be usin
29aa0 67 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20  g TK_REGISTER.  
29ab0 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
29ac0 61 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a  ase and pB is.**
29ad0 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45   not using TK_RE
29ae0 47 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74  GISTER but is ot
29af0 68 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65  herwise equivale
29b00 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72  nt, then still r
29b10 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53  eturn 0..**.** S
29b20 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f  ometimes this ro
29b30 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
29b40 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20  n 2 even if the 
29b50 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  two expressions.
29b60 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71  ** really are eq
29b70 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65  uivalent.  If we
29b80 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68   cannot prove th
29b90 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
29ba0 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69  ns are.** identi
29bb0 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32  cal, we return 2
29bc0 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
29bd0 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  .  So if this ro
29be0 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
29bf0 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20   2, then you do 
29c00 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20  not really know 
29c10 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74  for certain if t
29c20 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
29c30 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
29c40 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20  me.  But if you 
29c50 67 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74  get a 0 or 1 ret
29c60 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a  urn, then you.**
29c70 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65   can be sure the
29c80 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
29c90 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74   the same.  In t
29ca0 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a  he places where.
29cb0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
29cc0 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73  is used, it does
29cd0 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74   not hurt to get
29ce0 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68   an extra 2 - th
29cf0 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74  at.** just might
29d00 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20   result in some 
29d10 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20  slightly slower 
29d20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72  code.  But retur
29d30 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72  ning.** an incor
29d40 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c  rect 0 or 1 coul
29d50 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66  d lead to a malf
29d60 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
29d70 66 20 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20  f pParse is not 
29d80 4e 55 4c 4c 20 74 68 65 6e 20 54 4b 5f 56 41 52  NULL then TK_VAR
29d90 49 41 42 4c 45 20 74 65 72 6d 73 20 69 6e 20 70  IABLE terms in p
29da0 41 20 77 69 74 68 20 62 69 6e 64 69 6e 67 73 20  A with bindings 
29db0 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 52  in.** pParse->pR
29dc0 65 70 72 65 70 61 72 65 20 63 61 6e 20 62 65 20  eprepare can be 
29dd0 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20  matched against 
29de0 6c 69 74 65 72 61 6c 73 20 69 6e 20 70 42 2e 20  literals in pB. 
29df0 20 54 68 65 20 0a 2a 2a 20 70 50 61 72 73 65 2d   The .** pParse-
29e00 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20  >pVdbe->expmask 
29e10 62 69 74 6d 61 73 6b 20 69 73 20 75 70 64 61 74  bitmask is updat
29e20 65 64 20 66 6f 72 20 65 61 63 68 20 76 61 72 69  ed for each vari
29e30 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 64 2e  able referenced.
29e40 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73  .** If pParse is
29e50 20 4e 55 4c 4c 20 28 74 68 65 20 6e 6f 72 6d 61   NULL (the norma
29e60 6c 20 63 61 73 65 29 20 74 68 65 6e 20 61 6e 79  l case) then any
29e70 20 54 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72   TK_VARIABLE ter
29e80 6d 20 69 6e 20 0a 2a 2a 20 41 72 67 75 6d 65 6e  m in .** Argumen
29e90 74 20 70 50 61 72 73 65 20 73 68 6f 75 6c 64 20  t pParse should 
29ea0 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 4e 55 4c 4c  normally be NULL
29eb0 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  . If it is not N
29ec0 55 4c 4c 20 61 6e 64 20 70 41 20 6f 72 0a 2a 2a  ULL and pA or.**
29ed0 20 70 42 20 63 61 75 73 65 73 20 61 20 72 65 74   pB causes a ret
29ee0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 2e 0a  urn value of 2..
29ef0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
29f00 70 72 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20  prCompare(Parse 
29f10 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
29f20 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74  A, Expr *pB, int
29f30 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f   iTab){.  u32 co
29f40 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69  mbinedFlags;.  i
29f50 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
29f60 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
29f70 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a  pB==pA ? 0 : 2;.
29f80 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
29f90 20 26 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56   && pA->op==TK_V
29fa0 41 52 49 41 42 4c 45 20 26 26 20 65 78 70 72 43  ARIABLE && exprC
29fb0 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 70  ompareVariable(p
29fc0 50 61 72 73 65 2c 20 70 41 2c 20 70 42 29 20 29  Parse, pA, pB) )
29fd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
29fe0 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c    }.  combinedFl
29ff0 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20  ags = pA->flags 
2a000 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  | pB->flags;.  i
2a010 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
2a020 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
2a030 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66  {.    if( (pA->f
2a040 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45  lags&pB->flags&E
2a050 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26  P_IntValue)!=0 &
2a060 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d  & pA->u.iValue==
2a070 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a  pB->u.iValue ){.
2a080 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2a090 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2a0a0 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   2;.  }.  if( pA
2a0b0 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 7c 7c 20  ->op!=pB->op || 
2a0c0 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 52 41 49 53 45  pA->op==TK_RAISE
2a0d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
2a0e0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
2a0f0 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
2a100 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d  pare(pParse, pA-
2a110 3e 70 4c 65 66 74 2c 70 42 2c 69 54 61 62 29 3c  >pLeft,pB,iTab)<
2a120 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
2a130 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
2a140 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pB->op==TK_CO
2a150 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
2a160 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2a170 73 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65 66 74  se, pA,pB->pLeft
2a180 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20  ,iTab)<2 ){.    
2a190 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2a1a0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  }.    return 2;.
2a1b0 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
2a1c0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  !=TK_COLUMN && p
2a1d0 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  A->op!=TK_AGG_CO
2a1e0 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54  LUMN && pA->u.zT
2a1f0 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
2a200 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pA->op==TK_FUNCT
2a210 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ION ){.      if(
2a220 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2a230 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
2a240 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20  >u.zToken)!=0 ) 
2a250 72 65 74 75 72 6e 20 32 3b 0a 23 69 66 6e 64 65  return 2;.#ifnde
2a260 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
2a270 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 2f  NDOWFUNC.      /
2a280 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  * Justification 
2a290 66 6f 72 20 74 68 65 20 61 73 73 65 72 74 28 29  for the assert()
2a2a0 3a 0a 20 20 20 20 20 20 2a 2a 20 77 69 6e 64 6f  :.      ** windo
2a2b0 77 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65  w functions have
2a2c0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54   p->op==TK_FUNCT
2a2d0 49 4f 4e 20 62 75 74 20 61 67 67 72 65 67 61 74  ION but aggregat
2a2e0 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20  e functions.    
2a2f0 20 20 2a 2a 20 68 61 76 65 20 70 2d 3e 6f 70 3d    ** have p->op=
2a300 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
2a310 2e 20 20 53 6f 20 61 6e 79 20 63 6f 6d 70 61 72  .  So any compar
2a320 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 6e 20  ison between an 
2a330 61 67 67 72 65 67 61 74 65 0a 20 20 20 20 20 20  aggregate.      
2a340 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  ** function and 
2a350 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  a window functio
2a360 6e 20 73 68 6f 75 6c 64 20 68 61 76 65 20 66 61  n should have fa
2a370 69 6c 65 64 20 62 65 66 6f 72 65 20 72 65 61 63  iled before reac
2a380 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  hing.      ** th
2a390 69 73 20 70 6f 69 6e 74 2e 20 20 41 6e 64 2c 20  is point.  And, 
2a3a0 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
2a3b0 6c 65 20 74 6f 20 68 61 76 65 20 61 20 77 69 6e  le to have a win
2a3c0 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  dow function and
2a3d0 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 63 61 6c  .      ** a scal
2a3e0 61 72 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ar function with
2a3f0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
2a400 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  nd number of arg
2a410 75 6d 65 6e 74 73 2e 20 20 53 6f 0a 20 20 20 20  uments.  So.    
2a420 20 20 2a 2a 20 69 66 20 77 65 20 72 65 61 63 68    ** if we reach
2a430 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 69 74   this point, eit
2a440 68 65 72 20 41 20 61 6e 64 20 42 20 62 6f 74 68  her A and B both
2a450 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
2a460 73 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 6e 65  s or.      ** ne
2a470 69 74 68 65 72 20 61 72 65 20 61 20 77 69 6e 64  ither are a wind
2a480 6f 77 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f  ow functions. */
2a490 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
2a4a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2a4b0 41 2c 45 50 5f 57 69 6e 46 75 6e 63 29 3d 3d 45  A,EP_WinFunc)==E
2a4c0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2a4d0 42 2c 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b  B,EP_WinFunc) );
2a4e0 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
2a4f0 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c 45 50  asProperty(pA,EP
2a500 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20  _WinFunc) ){.   
2a510 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2a520 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28 70 50  WindowCompare(pP
2a530 61 72 73 65 2c 70 41 2d 3e 79 2e 70 57 69 6e 2c  arse,pA->y.pWin,
2a540 70 42 2d 3e 79 2e 70 57 69 6e 29 21 3d 30 20 29  pB->y.pWin)!=0 )
2a550 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20   return 2;.     
2a560 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
2a570 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d  lse if( pA->op==
2a580 54 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  TK_NULL ){.     
2a590 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
2a5a0 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 3d  else if( pA->op=
2a5b0 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20  =TK_COLLATE ){. 
2a5c0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2a5d0 5f 73 74 72 69 63 6d 70 28 70 41 2d 3e 75 2e 7a  _stricmp(pA->u.z
2a5e0 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
2a5f0 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  en)!=0 ) return 
2a600 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
2a610 20 41 4c 57 41 59 53 28 70 42 2d 3e 75 2e 7a 54   ALWAYS(pB->u.zT
2a620 6f 6b 65 6e 21 3d 30 29 20 26 26 20 73 74 72 63  oken!=0) && strc
2a630 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
2a640 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
2a650 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2a660 20 32 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65   2;.    }.#ifnde
2a670 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
2a680 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 65 6c 73  NDOWFUNC.    els
2a690 65 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b  e if( pA->op==TK
2a6a0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  _AGG_FUNCTION ){
2a6b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
2a6c0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2a6d0 41 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 3d 3d  A, EP_WinFunc)==
2a6e0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  0 );.      if( s
2a6f0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2a700 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 79 2e  e(pParse, pA->y.
2a710 70 46 69 6c 74 65 72 2c 20 70 42 2d 3e 79 2e 70  pFilter, pB->y.p
2a720 46 69 6c 74 65 72 2c 20 69 54 61 62 29 20 29 7b  Filter, iTab) ){
2a730 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2a740 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  2;.      }.    }
2a750 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
2a760 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
2a770 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
2a780 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
2a790 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
2a7a0 32 3b 0a 20 20 69 66 28 20 28 63 6f 6d 62 69 6e  2;.  if( (combin
2a7b0 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b  edFlags & EP_Tok
2a7c0 65 6e 4f 6e 6c 79 29 3d 3d 30 20 29 7b 0a 20 20  enOnly)==0 ){.  
2a7d0 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c    if( combinedFl
2a7e0 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
2a7f0 63 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  ct ) return 2;. 
2a800 20 20 20 69 66 28 20 28 63 6f 6d 62 69 6e 65 64     if( (combined
2a810 46 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65 64  Flags & EP_Fixed
2a820 43 6f 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  Col)==0.     && 
2a830 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2a840 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70  re(pParse, pA->p
2a850 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c  Left, pB->pLeft,
2a860 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
2a870 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
2a880 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
2a890 61 72 73 65 2c 20 70 41 2d 3e 70 52 69 67 68 74  arse, pA->pRight
2a8a0 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54  , pB->pRight, iT
2a8b0 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
2a8c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2a8d0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
2a8e0 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e  A->x.pList, pB->
2a8f0 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29  x.pList, iTab) )
2a900 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
2a910 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54  f( pA->op!=TK_ST
2a920 52 49 4e 47 0a 20 20 20 20 20 26 26 20 70 41 2d  RING.     && pA-
2a930 3e 6f 70 21 3d 54 4b 5f 54 52 55 45 46 41 4c 53  >op!=TK_TRUEFALS
2a940 45 0a 20 20 20 20 20 26 26 20 28 63 6f 6d 62 69  E.     && (combi
2a950 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65  nedFlags & EP_Re
2a960 64 75 63 65 64 29 3d 3d 30 0a 20 20 20 20 29 7b  duced)==0.    ){
2a970 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69  .      if( pA->i
2a980 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c  Column!=pB->iCol
2a990 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  umn ) return 2;.
2a9a0 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70        if( pA->op
2a9b0 32 21 3d 70 42 2d 3e 6f 70 32 20 29 20 72 65 74  2!=pB->op2 ) ret
2a9c0 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28  urn 2;.      if(
2a9d0 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
2a9e0 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20  >iTable .       
2a9f0 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d  && (pA->iTable!=
2aa00 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42  iTab || NEVER(pB
2aa10 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20  ->iTable>=0)) ) 
2aa20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
2aa30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2aa40 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
2aa50 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
2aa60 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30  jects.  Return 0
2aa70 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
2aa80 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e  ntical and .** n
2aa90 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20  on-zero if they 
2aaa0 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
2aab0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  y..**.** If any 
2aac0 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
2aad0 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
2aae0 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
2aaf0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
2ab00 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
2ab10 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
2ab20 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
2ab30 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
2ab40 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Tab..**.** This 
2ab50 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
2ab60 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  turn non-zero fo
2ab70 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70  r equivalent Exp
2ab80 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20  rLists.  The.** 
2ab90 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65  only consequence
2aba0 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65   will be disable
2abb0 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  d optimizations.
2abc0 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
2abd0 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72  ne.** must never
2abe0 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
2abf0 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
2ac00 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72  jects are differ
2ac10 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c  ent, or.** a mal
2ac20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
2ac30 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  sult..**.** Two 
2ac40 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72  NULL pointers ar
2ac50 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
2ac60 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  be the same.  Bu
2ac70 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
2ac80 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65  .** always diffe
2ac90 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55  rs from a non-NU
2aca0 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69  LL pointer..*/.i
2acb0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  nt sqlite3ExprLi
2acc0 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69  stCompare(ExprLi
2acd0 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74  st *pA, ExprList
2ace0 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
2acf0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
2ad00 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29  pA==0 && pB==0 )
2ad10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
2ad20 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
2ad30 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
2ad40 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  ( pA->nExpr!=pB-
2ad50 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
2ad60 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
2ad70 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  pA->nExpr; i++){
2ad80 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
2ad90 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78  A = pA->a[i].pEx
2ada0 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  pr;.    Expr *pE
2adb0 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e  xprB = pB->a[i].
2adc0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
2add0 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  A->a[i].sortOrde
2ade0 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74  r!=pB->a[i].sort
2adf0 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31  Order ) return 1
2ae00 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2ae10 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
2ae20 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20  pExprA, pExprB, 
2ae30 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31  iTab) ) return 1
2ae40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2ae50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  ;.}../*.** Like 
2ae60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2ae70 72 65 28 29 20 65 78 63 65 70 74 20 43 4f 4c 4c  re() except COLL
2ae80 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 74  ATE operators at
2ae90 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a   the top-level.*
2aea0 2a 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a  * are ignored..*
2aeb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2aec0 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 45 78 70  rCompareSkip(Exp
2aed0 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c  r *pA, Expr *pB,
2aee0 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 72 65   int iTab){.  re
2aef0 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
2af00 43 6f 6d 70 61 72 65 28 30 2c 0a 20 20 20 20 20  Compare(0,.     
2af10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2af20 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
2af30 41 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  A),.            
2af40 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
2af50 43 6f 6c 6c 61 74 65 28 70 42 29 2c 0a 20 20 20  Collate(pB),.   
2af60 20 20 20 20 20 20 20 20 20 20 69 54 61 62 29 3b            iTab);
2af70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2af80 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 45 78 70   non-zero if Exp
2af90 72 20 70 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  r p can only be 
2afa0 74 72 75 65 20 69 66 20 70 4e 4e 20 69 73 20 6e  true if pNN is n
2afb0 6f 74 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  ot NULL..*/.stat
2afc0 69 63 20 69 6e 74 20 65 78 70 72 49 6d 70 6c 69  ic int exprImpli
2afd0 65 73 4e 6f 74 4e 75 6c 6c 28 0a 20 20 50 61 72  esNotNull(.  Par
2afe0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2aff0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
2b000 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
2b010 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2b020 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
2b030 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a  o be checked */.
2b040 20 20 45 78 70 72 20 2a 70 4e 4e 2c 20 20 20 20    Expr *pNN,    
2b050 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
2b060 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
2b070 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e  NOT NULL */.  in
2b080 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
2b090 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
2b0a0 20 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20 20   evaluated */.  
2b0b0 69 6e 74 20 73 65 65 6e 4e 6f 74 20 20 20 20 20  int seenNot     
2b0c0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
2b0d0 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f   is an operand o
2b0e0 66 20 4e 4f 54 20 2a 2f 0a 29 7b 0a 20 20 61 73  f NOT */.){.  as
2b0f0 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73  sert( p );.  ass
2b100 65 72 74 28 20 70 4e 4e 20 29 3b 0a 20 20 69 66  ert( pNN );.  if
2b110 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
2b120 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 2c 20  pare(pParse, p, 
2b130 70 4e 4e 2c 20 69 54 61 62 29 3d 3d 30 20 29 20  pNN, iTab)==0 ) 
2b140 72 65 74 75 72 6e 20 31 3b 0a 20 20 73 77 69 74  return 1;.  swit
2b150 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
2b160 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
2b170 20 20 20 20 20 69 66 28 20 73 65 65 6e 4e 6f 74       if( seenNot
2b180 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
2b190 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
2b1a0 65 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ect) ) return 0;
2b1b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
2b1c0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2b1d0 2c 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20  ,EP_xIsSelect). 
2b1e0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 2d            || (p-
2b1f0 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 70  >x.pList!=0 && p
2b200 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2b210 3e 30 29 20 29 3b 0a 20 20 20 20 20 20 72 65 74  >0) );.      ret
2b220 75 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e  urn exprImpliesN
2b230 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70  otNull(pParse, p
2b240 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54  ->pLeft, pNN, iT
2b250 61 62 2c 20 73 65 65 6e 4e 6f 74 29 3b 0a 20 20  ab, seenNot);.  
2b260 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
2b270 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
2b280 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
2b290 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20   = p->x.pList;. 
2b2a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
2b2b0 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  st!=0 );.      a
2b2c0 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
2b2d0 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 20 20  xpr==2 );.      
2b2e0 69 66 28 20 73 65 65 6e 4e 6f 74 20 29 20 72 65  if( seenNot ) re
2b2f0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66  turn 0;.      if
2b300 28 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74  ( exprImpliesNot
2b310 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 4c 69  Null(pParse, pLi
2b320 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
2b330 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65 6e 4e  pNN, iTab, seenN
2b340 6f 74 29 0a 20 20 20 20 20 20 20 7c 7c 20 65 78  ot).       || ex
2b350 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c  prImpliesNotNull
2b360 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
2b370 61 5b 31 5d 2e 70 45 78 70 72 2c 20 70 4e 4e 2c  a[1].pExpr, pNN,
2b380 20 69 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29 0a   iTab, seenNot).
2b390 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2b3a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2b3b0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
2b3c0 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75  exprImpliesNotNu
2b3d0 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  ll(pParse, p->pL
2b3e0 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20  eft, pNN, iTab, 
2b3f0 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a  seenNot);.    }.
2b400 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a      case TK_EQ:.
2b410 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
2b420 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
2b430 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
2b440 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
2b450 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
2b460 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
2b470 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
2b480 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
2b490 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20  _STAR:.    case 
2b4a0 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
2b4b0 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
2b4c0 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
2b4d0 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
2b4e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
2b4f0 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
2b500 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63  K_RSHIFT: .    c
2b510 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
2b520 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72 49  .      if( exprI
2b530 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70 50  mpliesNotNull(pP
2b540 61 72 73 65 2c 20 70 2d 3e 70 52 69 67 68 74 2c  arse, p->pRight,
2b550 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65 6e   pNN, iTab, seen
2b560 4e 6f 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Not) ) return 1;
2b570 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
2b580 68 72 75 20 69 6e 74 6f 20 74 68 65 20 6e 65 78  hru into the nex
2b590 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  t case */.    }.
2b5a0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e      case TK_SPAN
2b5b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
2b5c0 4c 4c 41 54 45 3a 0a 20 20 20 20 63 61 73 65 20  LLATE:.    case 
2b5d0 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
2b5e0 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20 20  ase TK_UPLUS:.  
2b5f0 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
2b600 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
2b610 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e   exprImpliesNotN
2b620 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ull(pParse, p->p
2b630 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c  Left, pNN, iTab,
2b640 20 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d   seenNot);.    }
2b650 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55  .    case TK_TRU
2b660 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  TH: {.      if( 
2b670 73 65 65 6e 4e 6f 74 20 29 20 72 65 74 75 72 6e  seenNot ) return
2b680 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
2b690 3e 6f 70 32 21 3d 54 4b 5f 49 53 20 29 20 72 65  >op2!=TK_IS ) re
2b6a0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 72 65  turn 0;.      re
2b6b0 74 75 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73  turn exprImplies
2b6c0 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20  NotNull(pParse, 
2b6d0 70 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69  p->pLeft, pNN, i
2b6e0 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29 3b 0a 20  Tab, seenNot);. 
2b6f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
2b700 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 72 65  _NOT: {.      re
2b710 74 75 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73  turn exprImplies
2b720 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20  NotNull(pParse, 
2b730 70 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69  p->pLeft, pNN, i
2b740 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  Tab, 1);.    }. 
2b750 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2b760 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2b770 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72  rue if we can pr
2b780 6f 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c  ove the pE2 will
2b790 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20   always be true 
2b7a0 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75  if pE1 is.** tru
2b7b0 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  e.  Return false
2b7c0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f   if we cannot co
2b7d0 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66  mplete the proof
2b7e0 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74   or if pE2 might
2b7f0 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45  .** be false.  E
2b800 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
2b810 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20     pE1: x==5    
2b820 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20     pE2: x==5    
2b830 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a           Result:
2b840 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
2b850 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32  : x>0        pE2
2b860 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
2b870 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
2b880 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32  .**     pE1: x=2
2b890 31 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32  1       pE2: x=2
2b8a0 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65  1 OR y=43     Re
2b8b0 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
2b8c0 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20    pE1: x!=123   
2b8d0 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
2b8e0 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
2b8f0 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
2b900 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a   x!=?1      pE2:
2b910 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
2b920 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
2b930 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20  *     pE1: x IS 
2b940 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20  NULL  pE2: x IS 
2b950 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
2b960 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  lt: false.**    
2b970 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20   pE1: x IS ?2   
2b980 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
2b990 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66  ULL    Reuslt: f
2b9a0 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  alse.**.** When 
2b9b0 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c  comparing TK_COL
2b9c0 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65  UMN nodes betwee
2b9d0 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69  n pE1 and pE2, i
2b9e0 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70  f pE2 has.** Exp
2b9f0 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20  r.iTable<0 then 
2ba00 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e  assume a table n
2ba10 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69  umber given by i
2ba20 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50  Tab..**.** If pP
2ba30 61 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  arse is not NULL
2ba40 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
2ba50 73 20 6f 66 20 62 6f 75 6e 64 20 76 61 72 69 61  s of bound varia
2ba60 62 6c 65 73 20 69 6e 20 70 45 31 20 61 72 65 20  bles in pE1 are 
2ba70 0a 2a 2a 20 63 6f 6d 70 61 72 65 64 20 61 67 61  .** compared aga
2ba80 69 6e 73 74 20 6c 69 74 65 72 61 6c 20 76 61 6c  inst literal val
2ba90 75 65 73 20 69 6e 20 70 45 32 20 61 6e 64 20 70  ues in pE2 and p
2baa0 50 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78  Parse->pVdbe->ex
2bab0 70 6d 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69  pmask is.** modi
2bac0 66 69 65 64 20 74 6f 20 72 65 63 6f 72 64 20 77  fied to record w
2bad0 68 69 63 68 20 62 6f 75 6e 64 20 76 61 72 69 61  hich bound varia
2bae0 62 6c 65 73 20 61 72 65 20 72 65 66 65 72 65 6e  bles are referen
2baf0 63 65 64 2e 20 20 49 66 20 70 50 61 72 73 65 20  ced.  If pParse 
2bb00 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  .** is NULL, the
2bb10 6e 20 66 61 6c 73 65 20 77 69 6c 6c 20 62 65 20  n false will be 
2bb20 72 65 74 75 72 6e 65 64 20 69 66 20 70 45 31 20  returned if pE1 
2bb30 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 62 6f 75  contains any bou
2bb40 6e 64 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  nd variables..**
2bb50 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  .** When in doub
2bb60 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  t, return false.
2bb70 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65    Returning true
2bb80 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65   might give a pe
2bb90 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70  rformance.** imp
2bba0 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72  rovement.  Retur
2bbb0 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74  ning false might
2bbc0 20 63 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d   cause a perform
2bbd0 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20  ance reduction, 
2bbe0 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61  but.** it will a
2bbf0 6c 77 61 79 73 20 67 69 76 65 20 74 68 65 20 63  lways give the c
2bc00 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e  orrect answer an
2bc10 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79  d is hence alway
2bc20 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s safe..*/.int s
2bc30 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
2bc40 73 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61  sExpr(Parse *pPa
2bc50 72 73 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20  rse, Expr *pE1, 
2bc60 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69  Expr *pE2, int i
2bc70 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  Tab){.  if( sqli
2bc80 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2bc90 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2c  Parse, pE1, pE2,
2bca0 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20   iTab)==0 ){.   
2bcb0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
2bcc0 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
2bcd0 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74  _OR.   && (sqlit
2bce0 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
2bcf0 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70  r(pParse, pE1, p
2bd00 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  E2->pLeft, iTab)
2bd10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
2bd20 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
2bd30 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c 20  iesExpr(pParse, 
2bd40 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74  pE1, pE2->pRight
2bd50 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20  , iTab) ).  ){. 
2bd60 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
2bd70 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
2bd80 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26  TK_NOTNULL.   &&
2bd90 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e   exprImpliesNotN
2bda0 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 45 31 2c  ull(pParse, pE1,
2bdb0 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61   pE2->pLeft, iTa
2bdc0 62 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 72  b, 0).  ){.    r
2bdd0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
2bde0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2bdf0 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 45 78  * This is the Ex
2be00 70 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b  pr node callback
2be10 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72   for sqlite3Expr
2be20 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f  ImpliesNotNullRo
2be30 77 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65  w()..** If the e
2be40 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72  xpression node r
2be50 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65  equires that the
2be60 20 74 61 62 6c 65 20 61 74 20 70 57 61 6c 6b 65   table at pWalke
2be70 72 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65 20  r->iCur.** have 
2be80 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 6f 6e 2d  one or more non-
2be90 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  NULL column, the
2bea0 6e 20 73 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65  n set pWalker->e
2beb0 43 6f 64 65 20 74 6f 20 31 20 61 6e 64 20 61 62  Code to 1 and ab
2bec0 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ort..**.** This 
2bed0 72 6f 75 74 69 6e 65 20 63 6f 6e 74 72 6f 6c 73  routine controls
2bee0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2bef0 2e 20 20 46 61 6c 73 65 20 70 6f 73 69 74 69 76  .  False positiv
2bf00 65 73 20 28 73 65 74 74 69 6e 67 0a 2a 2a 20 70  es (setting.** p
2bf10 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f  Walker->eCode to
2bf20 20 31 20 77 68 65 6e 20 69 74 20 73 68 6f 75 6c   1 when it shoul
2bf30 64 20 6e 6f 74 20 62 65 29 20 61 72 65 20 64 65  d not be) are de
2bf40 61 64 6c 79 2c 20 62 75 74 20 66 61 6c 73 65 2d  adly, but false-
2bf50 6e 65 67 61 74 69 76 65 73 0a 2a 2a 20 28 6e 65  negatives.** (ne
2bf60 76 65 72 20 73 65 74 74 69 6e 67 20 70 57 61 6c  ver setting pWal
2bf70 6b 65 72 2d 3e 65 43 6f 64 65 29 20 69 73 20 61  ker->eCode) is a
2bf80 20 68 61 72 6d 6c 65 73 73 20 6d 69 73 73 65 64   harmless missed
2bf90 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
2bfa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6d 70  /.static int imp
2bfb0 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57  liesNotNullRow(W
2bfc0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2bfd0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2bfe0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2bff0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
2c000 4d 4e 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  MN );.  testcase
2c010 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2c020 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
2c030 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
2c040 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2c050 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
2c060 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2c070 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
2c080 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
2c090 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  _ISNOT:.    case
2c0a0 20 54 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63 61 73   TK_NOT:.    cas
2c0b0 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
2c0c0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
2c0d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
2c0e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
2c0f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  :.    case TK_CA
2c100 53 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SE:.    case TK_
2c110 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IN:.    case TK_
2c120 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
2c130 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2c140 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
2c150 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2c160 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
2c170 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OT );.      test
2c180 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2c190 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
2c1a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2c1b0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  xpr->op==TK_NOTN
2c1c0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
2c1d0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2c1e0 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
2c1f0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2c200 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ->op==TK_OR );. 
2c210 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2c220 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53  Expr->op==TK_CAS
2c230 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
2c240 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2c250 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74  TK_IN );.      t
2c260 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2c270 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
2c280 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2c290 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 63  WRC_Prune;.    c
2c2a0 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
2c2b0 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
2c2c0 2d 3e 75 2e 69 43 75 72 3d 3d 70 45 78 70 72 2d  ->u.iCur==pExpr-
2c2d0 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  >iTable ){.     
2c2e0 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
2c2f0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  e = 1;.        r
2c300 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2c310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2c320 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2c330 0a 0a 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ..    /* Virtual
2c340 20 74 61 62 6c 65 73 20 61 72 65 20 61 6c 6c 6f   tables are allo
2c350 77 65 64 20 74 6f 20 75 73 65 20 63 6f 6e 73 74  wed to use const
2c360 72 61 69 6e 74 73 20 6c 69 6b 65 20 78 3d 4e 55  raints like x=NU
2c370 4c 4c 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 61  LL.  So.    ** a
2c380 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
2c390 6d 20 78 3d 79 20 64 6f 65 73 20 6e 6f 74 20 70  m x=y does not p
2c3a0 72 6f 76 65 20 74 68 61 74 20 79 20 69 73 20 6e  rove that y is n
2c3b0 6f 74 20 6e 75 6c 6c 20 69 66 20 78 0a 20 20 20  ot null if x.   
2c3c0 20 2a 2a 20 69 73 20 74 68 65 20 63 6f 6c 75 6d   ** is the colum
2c3d0 6e 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74  n of a virtual t
2c3e0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65  able */.    case
2c3f0 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65   TK_EQ:.    case
2c400 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
2c410 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
2c420 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
2c430 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
2c440 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20 74 65   TK_GE:.      te
2c450 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c460 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
2c470 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2c480 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  r->op==TK_NE );.
2c490 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c4a0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  pExpr->op==TK_LT
2c4b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2c4c0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2c4d0 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LE );.      te
2c4e0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c4f0 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
2c500 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2c510 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  r->op==TK_GE );.
2c520 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72        if( (pExpr
2c530 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
2c540 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 72 74  COLUMN && IsVirt
2c550 75 61 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ual(pExpr->pLeft
2c560 2d 3e 79 2e 70 54 61 62 29 29 0a 20 20 20 20 20  ->y.pTab)).     
2c570 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 70 52 69    || (pExpr->pRi
2c580 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ght->op==TK_COLU
2c590 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c 28  MN && IsVirtual(
2c5a0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 79  pExpr->pRight->y
2c5b0 2e 70 54 61 62 29 29 0a 20 20 20 20 20 20 29 7b  .pTab)).      ){
2c5c0 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  .       return W
2c5d0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
2c5e0 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  }.    default:. 
2c5f0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2c600 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
2c610 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2c620 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66  ue (non-zero) if
2c630 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 61   expression p ca
2c640 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75 65 20 69  n only be true i
2c650 66 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e  f at least.** on
2c660 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
2c670 65 20 69 54 61 62 20 69 73 20 6e 6f 6e 2d 6e 75  e iTab is non-nu
2c680 6c 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ll.  In other wo
2c690 72 64 73 2c 20 72 65 74 75 72 6e 20 74 72 75 65  rds, return true
2c6a0 0a 2a 2a 20 69 66 20 65 78 70 72 65 73 73 69 6f  .** if expressio
2c6b0 6e 20 70 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  n p will always 
2c6c0 62 65 20 4e 55 4c 4c 20 6f 72 20 66 61 6c 73 65  be NULL or false
2c6d0 20 69 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   if every column
2c6e0 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e   of iTab.** is N
2c6f0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65  ULL..**.** False
2c700 20 6e 65 67 61 74 69 76 65 73 20 61 72 65 20 61   negatives are a
2c710 63 63 65 70 74 61 62 6c 65 2e 20 20 49 6e 20 6f  cceptable.  In o
2c720 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 69  ther words, it i
2c730 73 20 6f 6b 20 74 6f 20 72 65 74 75 72 6e 0a 2a  s ok to return.*
2c740 2a 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 65  * zero even if e
2c750 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c  xpression p will
2c760 20 6e 65 76 65 72 20 62 65 20 74 72 75 65 20 6f   never be true o
2c770 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f  f every column o
2c780 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c  f iTab.** is NUL
2c790 4c 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61  L.  A false nega
2c7a0 74 69 76 65 20 69 73 20 6d 65 72 65 6c 79 20 61  tive is merely a
2c7b0 20 6d 69 73 73 65 64 20 6f 70 74 69 6d 69 7a 61   missed optimiza
2c7c0 74 69 6f 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  tion opportunity
2c7d0 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 70 6f  ..**.** False po
2c7e0 73 69 74 69 76 65 73 20 61 72 65 20 6e 6f 74 20  sitives are not 
2c7f0 61 6c 6c 6f 77 65 64 2c 20 68 6f 77 65 76 65 72  allowed, however
2c800 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74  .  A false posit
2c810 69 76 65 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a  ive may result.*
2c820 2a 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63  * in an incorrec
2c830 74 20 61 6e 73 77 65 72 2e 0a 2a 2a 0a 2a 2a 20  t answer..**.** 
2c840 54 65 72 6d 73 20 6f 66 20 70 20 74 68 61 74 20  Terms of p that 
2c850 61 72 65 20 6d 61 72 6b 65 64 20 77 69 74 68 20  are marked with 
2c860 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 28 61 6e 64  EP_FromJoin (and
2c870 20 68 65 6e 63 65 20 74 68 61 74 20 63 6f 6d 65   hence that come
2c880 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 4f 4e 20   from.** the ON 
2c890 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
2c8a0 20 6f 66 20 4c 45 46 54 20 4a 4f 49 4e 53 29 20   of LEFT JOINS) 
2c8b0 61 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f  are excluded fro
2c8c0 6d 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 0a  m the analysis..
2c8d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2c8e0 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ne is used to ch
2c8f0 65 63 6b 20 69 66 20 61 20 4c 45 46 54 20 4a 4f  eck if a LEFT JO
2c900 49 4e 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72  IN can be conver
2c910 74 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f  ted into.** an o
2c920 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 20 20 54  rdinary JOIN.  T
2c930 68 65 20 70 20 61 72 67 75 6d 65 6e 74 20 69 73  he p argument is
2c940 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2c950 65 2e 20 20 49 66 20 74 68 65 20 57 48 45 52 45  e.  If the WHERE
2c960 0a 2a 2a 20 63 6c 61 75 73 65 20 72 65 71 75 69  .** clause requi
2c970 72 65 73 20 74 68 61 74 20 73 6f 6d 65 20 63 6f  res that some co
2c980 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 69 67 68  lumn of the righ
2c990 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 4c  t table of the L
2c9a0 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20 62 65 20 6e  EFT JOIN.** be n
2c9b0 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
2c9c0 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20  e LEFT JOIN can 
2c9d0 62 65 20 73 61 66 65 6c 79 20 63 6f 6e 76 65 72  be safely conver
2c9e0 74 65 64 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 6f  ted into an.** o
2c9f0 72 64 69 6e 61 72 79 20 6a 6f 69 6e 2e 0a 2a 2f  rdinary join..*/
2ca00 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2ca10 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f  ImpliesNonNullRo
2ca20 77 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  w(Expr *p, int i
2ca30 54 61 62 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  Tab){.  Walker w
2ca40 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45  ;.  p = sqlite3E
2ca50 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
2ca60 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  );.  while( p ){
2ca70 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
2ca80 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 7b 0a 20 20  TK_NOTNULL ){.  
2ca90 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74      p = p->pLeft
2caa0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2cab0 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  p->op==TK_AND ){
2cac0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2cad0 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e  e3ExprImpliesNon
2cae0 4e 75 6c 6c 52 6f 77 28 70 2d 3e 70 4c 65 66 74  NullRow(p->pLeft
2caf0 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
2cb00 20 31 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d   1;.      p = p-
2cb10 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 7d 65 6c  >pRight;.    }el
2cb20 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  se{.      break;
2cb30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 2e 78  .    }.  }.  w.x
2cb40 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 69  ExprCallback = i
2cb50 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77  mpliesNotNullRow
2cb60 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2cb70 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 78  lback = 0;.  w.x
2cb80 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
2cb90 3d 20 30 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  = 0;.  w.eCode =
2cba0 20 30 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d   0;.  w.u.iCur =
2cbb0 20 69 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33   iTab;.  sqlite3
2cbc0 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
2cbd0 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
2cbe0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  e;.}../*.** An i
2cbf0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
2cc00 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2cc10 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
2cc20 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
2cc30 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
2cc40 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63   an expression c
2cc50 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  an be evaluated 
2cc60 62 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  by reference to 
2cc70 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c  the.** index onl
2cc80 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  y, without havin
2cc90 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72 63 68  g to do a search
2cca0 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
2ccb0 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20  onding.** table 
2ccc0 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64 78 43  entry.  The IdxC
2ccd0 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c 64 20  over.pIdx field 
2cce0 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  is the index.  I
2ccf0 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20  dxCover.iCur.** 
2cd00 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f  is the cursor fo
2cd10 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  r the table..*/.
2cd20 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20  struct IdxCover 
2cd30 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  {.  Index *pIdx;
2cd40 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2cd50 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 66  x to be tested f
2cd60 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20  or coverage */. 
2cd70 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
2cd80 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
2cd90 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
2cda0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2cdb0 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d  o the index */.}
2cdc0 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ;../*.** Check t
2cdd0 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
2cde0 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
2cdf0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c   columns in tabl
2ce00 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75  e .** pWalker->u
2ce10 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72  .pIdxCover->iCur
2ce20 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65   can be satisfie
2ce30 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65  d using the inde
2ce40 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  x.** pWalker->u.
2ce50 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e  pIdxCover->pIdx.
2ce60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
2ce70 78 70 72 49 64 78 43 6f 76 65 72 28 57 61 6c 6b  xprIdxCover(Walk
2ce80 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2ce90 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
2cea0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
2ceb0 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70  OLUMN.   && pExp
2cec0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b  r->iTable==pWalk
2ced0 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
2cee0 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69  >iCur.   && sqli
2cef0 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
2cf00 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78  (pWalker->u.pIdx
2cf10 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70 45 78  Cover->pIdx, pEx
2cf20 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20  pr->iColumn)<0. 
2cf30 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
2cf40 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  >eCode = 1;.    
2cf50 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2cf60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  ;.  }.  return W
2cf70 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2cf80 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
2cf90 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49 64 78  if an index pIdx
2cfa0 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 20 63   on table with c
2cfb0 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e 74 61  ursor iCur conta
2cfc0 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20  ins will.** the 
2cfd0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
2cfe0 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
2cff0 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f 65 73  f the index does
2d000 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65 78   cover the.** ex
2d010 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c  pression and fal
2d020 73 65 20 69 66 20 74 68 65 20 70 45 78 70 72 20  se if the pExpr 
2d030 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66 65 72  expression refer
2d040 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f 6c 75  ences table colu
2d050 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  mns.** that are 
2d060 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65  not found in the
2d070 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
2d080 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f 76 65  ** An index cove
2d090 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69  ring an expressi
2d0a0 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  on means that th
2d0b0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
2d0c0 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64   be.** evaluated
2d0d0 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20   using only the 
2d0e0 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68 6f 75  index and withou
2d0f0 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b  t having to look
2d100 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  up the.** corres
2d110 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 65 6e  ponding table en
2d120 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  try..*/.int sqli
2d130 74 65 33 45 78 70 72 43 6f 76 65 72 65 64 42 79  te3ExprCoveredBy
2d140 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20 2a 70  Index(.  Expr *p
2d150 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Expr,        /* 
2d160 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
2d170 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  tested */.  int 
2d180 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
2d190 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  /* The cursor nu
2d1a0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63 6f 72  mber for the cor
2d1b0 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
2d1c0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
2d1d0 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  x         /* The
2d1e0 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69 67 68   index that migh
2d1f0 74 20 62 65 20 75 73 65 64 20 66 6f 72 20 63 6f  t be used for co
2d200 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57  verage */.){.  W
2d210 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63  alker w;.  struc
2d220 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f 76 3b  t IdxCover xcov;
2d230 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
2d240 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78   sizeof(w));.  x
2d250 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75 72 3b  cov.iCur = iCur;
2d260 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d 20 70  .  xcov.pIdx = p
2d270 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  Idx;.  w.xExprCa
2d280 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49 64 78  llback = exprIdx
2d290 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64  Cover;.  w.u.pId
2d2a0 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a  xCover = &xcov;.
2d2b0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
2d2c0 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  r(&w, pExpr);.  
2d2d0 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b  return !w.eCode;
2d2e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .}.../*.** An in
2d2f0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2d300 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2d310 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  e is used by the
2d320 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20   tree walker.** 
2d330 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e  to count referen
2d340 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c  ces to table col
2d350 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75  umns in the argu
2d360 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20  ments of an .** 
2d370 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
2d380 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  on, in order to 
2d390 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  implement the.**
2d3a0 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
2d3b0 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e  ThisSrc() routin
2d3c0 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63  e..*/.struct Src
2d3d0 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73  Count {.  SrcLis
2d3e0 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e  t *pSrc;   /* On
2d3f0 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f  e particular FRO
2d400 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65  M clause in a ne
2d410 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  sted query */.  
2d420 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20  int nThis;      
2d430 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2d440 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
2d450 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  mns in pSrcList 
2d460 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b  */.  int nOther;
2d470 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d480 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
2d490 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65   columns in othe
2d4a0 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a  r FROM clauses *
2d4b0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  /.};../*.** Coun
2d4c0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
2d4d0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
2d4e0 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lumns..*/.static
2d4f0 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e   int exprSrcCoun
2d500 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
2d510 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
2d520 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28  .  /* The NEVER(
2d530 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  ) on the second 
2d540 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20  term is because 
2d550 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
2d560 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a  sesThisSrc().  *
2d570 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c  * is always call
2d580 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  ed before sqlite
2d590 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2d5a0 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20  egates() and so 
2d5b0 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55  the.  ** TK_COLU
2d5c0 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74  MNs have not yet
2d5d0 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
2d5e0 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
2d5f0 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c  MN.  If.  ** sql
2d600 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
2d610 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65  ThisSrc() is use
2d620 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e  d differently in
2d630 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65   the future, the
2d640 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69  .  ** NEVER() wi
2d650 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ll need to be re
2d660 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  moved. */.  if( 
2d670 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
2d680 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45  LUMN || NEVER(pE
2d690 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2d6a0 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69  COLUMN) ){.    i
2d6b0 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
2d6c0 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70   SrcCount *p = p
2d6d0 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f  Walker->u.pSrcCo
2d6e0 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74  unt;.    SrcList
2d6f0 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
2d700 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d  ;.    int nSrc =
2d710 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53   pSrc ? pSrc->nS
2d720 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28  rc : 0;.    for(
2d730 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b  i=0; i<nSrc; i++
2d740 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ){.      if( pEx
2d750 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  pr->iTable==pSrc
2d760 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[i].iCursor )
2d770 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2d780 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a    if( i<nSrc ){.
2d790 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b        p->nThis++
2d7a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d7b0 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a     p->nOther++;.
2d7c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2d7d0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2d7e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
2d7f0 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ine if any of th
2d800 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
2d810 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f  he pExpr Functio
2d820 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70  n reference.** p
2d830 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e  SrcList.  Return
2d840 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f   true if they do
2d850 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74  .  Also return t
2d860 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74  rue if the funct
2d870 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72  ion.** has no ar
2d880 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f  guments or has o
2d890 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  nly constant arg
2d8a0 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
2d8b0 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a  false if pExpr.*
2d8c0 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c  * references col
2d8d0 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c  umns but not col
2d8e0 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66  umns of tables f
2d8f0 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74  ound in pSrcList
2d900 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d910 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
2d920 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c  Src(Expr *pExpr,
2d930 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
2d940 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  st){.  Walker w;
2d950 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75  .  struct SrcCou
2d960 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74  nt cnt;.  assert
2d970 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2d980 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
2d990 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2d9a0 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74  k = exprSrcCount
2d9b0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2d9c0 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75  lback = 0;.  w.u
2d9d0 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e  .pSrcCount = &cn
2d9e0 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20  t;.  cnt.pSrc = 
2d9f0 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e  pSrcList;.  cnt.
2da00 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74  nThis = 0;.  cnt
2da10 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73  .nOther = 0;.  s
2da20 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
2da30 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e  st(&w, pExpr->x.
2da40 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
2da50 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20   cnt.nThis>0 || 
2da60 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d  cnt.nOther==0;.}
2da70 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
2da80 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
2da90 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2daa0 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
2dab0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
2dac0 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
2dad0 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
2dae0 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
2daf0 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
2db00 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
2db10 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69  gInfoColumn(sqli
2db20 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
2db30 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
2db40 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c  i;.  pInfo->aCol
2db50 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
2db60 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
2db70 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  db,.       pInfo
2db80 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73  ->aCol,.       s
2db90 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f  izeof(pInfo->aCo
2dba0 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70  l[0]),.       &p
2dbb0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20  Info->nColumn,. 
2dbc0 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
2dbd0 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
2dbe0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
2dbf0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
2dc00 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2dc10 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
2dc20 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
2dc30 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
2dc40 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
2dc50 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
2dc60 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
2dc70 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
2dc80 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65  gInfoFunc(sqlite
2dc90 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
2dca0 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
2dcb0 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20  .  pInfo->aFunc 
2dcc0 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
2dcd0 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
2dce0 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  b, .       pInfo
2dcf0 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->aFunc,.       
2dd00 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46  sizeof(pInfo->aF
2dd10 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  unc[0]),.       
2dd20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20  &pInfo->nFunc,. 
2dd30 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
2dd40 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
2dd50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
2dd60 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  he xExprCallback
2dd70 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b   for a tree walk
2dd80 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  er.  It is used 
2dd90 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
2dda0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2ddb0 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20  zeAggregates(). 
2ddc0 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
2ddd0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2dde0 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f  s.** for additio
2ddf0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
2de00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2de10 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28  nalyzeAggregate(
2de20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2de30 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2de40 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
2de50 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61  ntext *pNC = pWa
2de60 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50  lker->u.pNC;.  P
2de70 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
2de80 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72  NC->pParse;.  Sr
2de90 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
2dea0 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
2deb0 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  .  AggInfo *pAgg
2dec0 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e  Info = pNC->uNC.
2ded0 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 61 73 73  pAggInfo;..  ass
2dee0 65 72 74 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67  ert( pNC->ncFlag
2def0 73 20 26 20 4e 43 5f 55 41 67 67 49 6e 66 6f 20  s & NC_UAggInfo 
2df00 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  );.  switch( pEx
2df10 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
2df20 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
2df30 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
2df40 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  LUMN: {.      te
2df50 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2df60 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
2df70 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2df80 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2df90 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
2dfa0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
2dfb0 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e if the column 
2dfc0 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  is in one of the
2dfd0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
2dfe0 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61  ROM.      ** cla
2dff0 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
2e000 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  gate query */.  
2e010 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
2e020 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  SrcList!=0) ){. 
2e030 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
2e040 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2e050 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
2e060 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2e070 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
2e080 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
2e090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
2e0a0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
2e0b0 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
2e0c0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2e0d0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
2e0e0 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
2e0f0 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
2e100 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
2e110 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
2e120 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >iCursor ){.    
2e130 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
2e140 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
2e150 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
2e160 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f   pExpr refers to
2e170 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20   a table.       
2e180 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
2e190 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2e1a0 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
2e1b0 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20  ate query.  .   
2e1c0 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
2e1d0 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20          ** Make 
2e1e0 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  an entry for the
2e1f0 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49   column in pAggI
2e200 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74  nfo->aCol[] if t
2e210 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
2e220 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e   ** is not an en
2e230 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64  try there alread
2e240 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
2e250 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
2e260 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
2e270 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f   pCol = pAggInfo
2e280 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
2e290 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
2e2a0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
2e2b0 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; k++, pCol++){.
2e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2e2d0 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d  ( pCol->iTable==
2e2e0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
2e2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e300 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
2e310 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
2e320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e330 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2e340 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e360 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67       if( (k>=pAg
2e370 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a  gInfo->nColumn).
2e380 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2e390 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43  (k = addAggInfoC
2e3a0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62  olumn(pParse->db
2e3b0 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20  , pAggInfo))>=0 
2e3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
2e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2e3e0 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
2e3f0 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  aCol[k];.       
2e400 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
2e410 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  b = pExpr->y.pTa
2e420 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
2e430 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20   pCol->iTable = 
2e440 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
2e450 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2e460 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  l->iColumn = pEx
2e470 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
2e480 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2e490 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
2e4a0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
2e4b0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
2e4c0 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  terColumn = -1;.
2e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2e4e0 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  ol->pExpr = pExp
2e4f0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
2e500 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70   if( pAggInfo->p
2e510 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
2e520 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
2e530 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , n;.           
2e540 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
2e550 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70  GB = pAggInfo->p
2e560 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
2e570 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2e580 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
2e590 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20  Term = pGB->a;. 
2e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
2e5b0 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20   = pGB->nExpr;. 
2e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
2e5d0 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
2e5e0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
2e5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
2e600 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e  pr *pE = pTerm->
2e610 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
2e620 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d           if( pE-
2e630 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
2e640 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  & pE->iTable==pE
2e650 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
2e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e670 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
2e680 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
2e690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e6a0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
2e6b0 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  orterColumn = j;
2e6c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e6d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e700 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2e710 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2e720 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
2e730 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  rColumn<0 ){.   
2e740 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2e750 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
2e760 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f   = pAggInfo->nSo
2e770 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20  rtingColumn++;. 
2e780 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2e790 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72           /* Ther
2e7b0 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72  e is now an entr
2e7c0 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70  y for pExpr in p
2e7d0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
2e7e0 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20  (either.        
2e7f0 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69      ** because i
2e800 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f  t was there befo
2e810 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65  re or because we
2e820 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74   just created it
2e830 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
2e840 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45  * Convert the pE
2e850 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41  xpr to be a TK_A
2e860 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72  GG_COLUMN referr
2e870 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20  ing to that.    
2e880 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49          ** pAggI
2e890 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72  nfo->aCol[] entr
2e8a0 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
2e8b0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  /.            Ex
2e8c0 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2e8d0 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
2e8e0 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  uce);.          
2e8f0 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
2e900 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
2e910 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2e920 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c  >op = TK_AGG_COL
2e930 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UMN;.           
2e940 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
2e950 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20  i16)k;.         
2e960 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2e970 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
2e980 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
2e990 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
2e9a0 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
2e9b0 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
2e9c0 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
2e9d0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2e9e0 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
2e9f0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
2ea00 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  CTION: {.      i
2ea10 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  f( (pNC->ncFlags
2ea20 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29   & NC_InAggFunc)
2ea30 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 57  ==0.       && pW
2ea40 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70  alker->walkerDep
2ea50 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20  th==pExpr->op2. 
2ea60 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2ea70 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
2ea80 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75  if pExpr is a du
2ea90 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
2eaa0 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20  er aggregate .  
2eab0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
2eac0 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  n that is alread
2ead0 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66  y in the pAggInf
2eae0 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
2eaf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
2eb00 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
2eb10 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67  nc *pItem = pAgg
2eb20 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20  Info->aFunc;.   
2eb30 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2eb40 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
2eb50 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
2eb60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2eb70 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2eb80 28 30 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  (0, pItem->pExpr
2eb90 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20  , pExpr, -1)==0 
2eba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
2ebb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2ebc0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2ebd0 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
2ebe0 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20  nfo->nFunc ){.  
2ebf0 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72          /* pExpr
2ec00 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d   is original.  M
2ec10 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ake a new entry 
2ec20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  in pAggInfo->aFu
2ec30 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  nc[].          *
2ec40 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  /.          u8 e
2ec50 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
2ec60 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >db);.          
2ec70 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75  i = addAggInfoFu
2ec80 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nc(pParse->db, p
2ec90 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2eca0 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
2ecb0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
2ecc0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2ecd0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
2ece0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2ecf0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d           pItem =
2ed00 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   &pAggInfo->aFun
2ed10 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  c[i];.          
2ed20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
2ed30 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
2ed40 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20      pItem->iMem 
2ed50 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2ed60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
2ed70 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2ed80 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2ed90 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
2eda0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2edb0 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >pFunc = sqlite3
2edc0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
2edd0 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
2ede0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2edf0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20  r->u.zToken, .  
2ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee10 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
2ee20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ? pExpr->x.pList
2ee30 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63  ->nExpr : 0, enc
2ee40 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2ee50 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
2ee60 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
2ee70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ee80 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
2ee90 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
2eea0 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b++;.           
2eeb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2eec0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
2eed0 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
2eee0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2eef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ef00 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
2ef10 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20   pExpr point to 
2ef20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
2ef30 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2ef40 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20  ] entry.        
2ef50 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
2ef60 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2ef70 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
2ef80 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
2ef90 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45  ed) );.        E
2efa0 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
2efb0 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
2efc0 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70  duce);.        p
2efd0 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
2efe0 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78  6)i;.        pEx
2eff0 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
2f000 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
2f010 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2f020 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
2f030 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
2f040 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
2f050 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2f060 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2f070 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
2f080 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
2f090 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c  atesInSelect(Wal
2f0a0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
2f0b0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
2f0c0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2f0d0 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  ER(pSelect);.  p
2f0e0 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65  Walker->walkerDe
2f0f0 70 74 68 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  pth++;.  return 
2f100 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2f110 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c  static void anal
2f120 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
2f130 65 6c 65 63 74 45 6e 64 28 57 61 6c 6b 65 72 20  electEnd(Walker 
2f140 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
2f150 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e   *pSelect){.  UN
2f160 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2f170 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b  Select);.  pWalk
2f180 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2d  er->walkerDepth-
2f190 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  -;.}../*.** Anal
2f1a0 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78  yze the pExpr ex
2f1b0 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
2f1c0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
2f1d0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
2f1e0 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
2f1f0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
2f200 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f  ded to AggInfo o
2f210 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e  bject that pNC->
2f220 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e  pAggInfo.** poin
2f230 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e  ts to.  Addition
2f240 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d  al entries are m
2f250 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e  ade on the AggIn
2f260 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20  fo object as.** 
2f270 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
2f280 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
2f290 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
2f2a0 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
2f2b0 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
2f2c0 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
2f2d0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
2f2e0 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76  xprNames()..*/.v
2f2f0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
2f300 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2f310 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
2f320 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
2f330 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
2f340 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2f350 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2f360 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  e;.  w.xSelectCa
2f370 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
2f380 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
2f390 63 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ct;.  w.xSelectC
2f3a0 61 6c 6c 62 61 63 6b 32 20 3d 20 61 6e 61 6c 79  allback2 = analy
2f3b0 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2f3c0 6c 65 63 74 45 6e 64 3b 0a 20 20 77 2e 77 61 6c  lectEnd;.  w.wal
2f3d0 6b 65 72 44 65 70 74 68 20 3d 20 30 3b 0a 20 20  kerDepth = 0;.  
2f3e0 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20  w.u.pNC = pNC;. 
2f3f0 20 77 2e 70 50 61 72 73 65 20 3d 20 30 3b 0a 20   w.pParse = 0;. 
2f400 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
2f410 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73  rcList!=0 );.  s
2f420 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
2f430 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  w, pExpr);.}../*
2f440 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
2f450 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2f460 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
2f470 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
2f480 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
2f490 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
2f4a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
2f4b0 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
2f4c0 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
2f4d0 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
2f4e0 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76   cut short..*/.v
2f4f0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
2f500 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61  nalyzeAggList(Na
2f510 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
2f520 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
2f530 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
2f540 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2f550 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
2f560 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
2f570 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
2f580 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
2f590 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
2f5a0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
2f5b0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2f5c0 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74  regates(pNC, pIt
2f5d0 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
2f5e0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
2f5f0 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65  llocate a single
2f600 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f   new register fo
2f610 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f  r use to hold so
2f620 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  me intermediate 
2f630 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73  result..*/.int s
2f640 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2f650 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
2f660 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2f670 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20  TempReg==0 ){.  
2f680 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73    return ++pPars
2f690 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72  e->nMem;.  }.  r
2f6a0 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54  eturn pParse->aT
2f6b0 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d  empReg[--pParse-
2f6c0 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f  >nTempReg];.}../
2f6d0 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2f6e0 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69  a register, maki
2f6f0 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ng available for
2f700 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20   reuse for some 
2f710 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65  other.** purpose
2f720 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2f730 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2f740 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2f750 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20  nt iReg){.  if( 
2f760 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e  iReg && pParse->
2f770 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
2f780 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
2f790 52 65 67 29 20 29 7b 0a 20 20 20 20 70 50 61 72  Reg) ){.    pPar
2f7a0 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
2f7b0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
2f7c0 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
2f7d0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
2f7e0 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
2f7f0 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
2f800 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
2f810 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
2f820 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50  e3GetTempRange(P
2f830 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2f840 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
2f850 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  , n;.  if( nReg=
2f860 3d 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69  =1 ) return sqli
2f870 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
2f880 61 72 73 65 29 3b 0a 20 20 69 20 3d 20 70 50 61  arse);.  i = pPa
2f890 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a  rse->iRangeReg;.
2f8a0 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52    n = pParse->nR
2f8b0 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e  angeReg;.  if( n
2f8c0 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 70 50  Reg<=n ){.    pP
2f8d0 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
2f8e0 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61  += nReg;.    pPa
2f8f0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d  rse->nRangeReg -
2f900 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  = nReg;.  }else{
2f910 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d  .    i = pParse-
2f920 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
2f930 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
2f940 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
2f950 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  i;.}.void sqlite
2f960 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
2f970 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2f980 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
2f990 52 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67  Reg){.  if( nReg
2f9a0 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==1 ){.    sqlit
2f9b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
2f9c0 28 70 50 61 72 73 65 2c 20 69 52 65 67 29 3b 0a  (pParse, iReg);.
2f9d0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2f9e0 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73    if( nReg>pPars
2f9f0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a  e->nRangeReg ){.
2fa00 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
2fa10 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20  geReg = nReg;.  
2fa20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
2fa30 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  Reg = iReg;.  }.
2fa40 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c  }../*.** Mark al
2fa50 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  l temporary regi
2fa60 73 74 65 72 73 20 61 73 20 62 65 69 6e 67 20 75  sters as being u
2fa70 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72  navailable for r
2fa80 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  euse..*/.void sq
2fa90 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
2faa0 67 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  gCache(Parse *pP
2fab0 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
2fac0 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  >nTempReg = 0;. 
2fad0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2fae0 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg = 0;.}../*.**
2faf0 20 56 61 6c 69 64 61 74 65 20 74 68 61 74 20 6e   Validate that n
2fb00 6f 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  o temporary regi
2fb10 73 74 65 72 20 66 61 6c 6c 73 20 77 69 74 68 69  ster falls withi
2fb20 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a  n the range of.*
2fb30 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c  * iFirst..iLast,
2fb40 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 54 68 69   inclusive.  Thi
2fb50 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
2fb60 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74 68  y call from with
2fb70 69 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73  in assert().** s
2fb80 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69  tatements..*/.#i
2fb90 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2fba0 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 54  G.int sqlite3NoT
2fbb0 65 6d 70 73 49 6e 52 61 6e 67 65 28 50 61 72 73  empsInRange(Pars
2fbc0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
2fbd0 46 69 72 73 74 2c 20 69 6e 74 20 69 4c 61 73 74  First, int iLast
2fbe0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
2fbf0 28 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  ( pParse->nRange
2fc00 52 65 67 3e 30 0a 20 20 20 26 26 20 70 50 61 72  Reg>0.   && pPar
2fc10 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70 50  se->iRangeReg+pP
2fc20 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2fc30 3e 20 69 46 69 72 73 74 0a 20 20 20 26 26 20 70  > iFirst.   && p
2fc40 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2fc50 20 3c 3d 20 69 4c 61 73 74 0a 20 20 29 7b 0a 20   <= iLast.  ){. 
2fc60 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2fc70 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
2fc80 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b  Parse->nTempReg;
2fc90 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
2fca0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2fcb0 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50  i]>=iFirst && pP
2fcc0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69  arse->aTempReg[i
2fcd0 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20  ]<=iLast ){.    
2fce0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
2fcf0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
2fd00 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2fd10 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a        LITE_DEBUG */.