/ Hex Artifact Content
Login

Artifact 2756d2875ac5b7a7efcc54edea3c8a31f4126684ded18da6fb406f4d3780a5f5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72   op;.  if( pExpr
0600: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e  ->flags & EP_Gen
0610: 65 72 69 63 20 29 20 72 65 74 75 72 6e 20 30 3b  eric ) return 0;
0620: 0a 20 20 77 68 69 6c 65 28 20 45 78 70 72 48 61  .  while( ExprHa
0630: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0640: 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20 20   EP_Skip) ){.   
0650: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0660: 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
0670: 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 45  ;.    pExpr = pE
0680: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
0690: 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30  assert( pExpr!=0
06a0: 20 29 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70   );.  }.  op = p
06b0: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
06c0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
06d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
06e0: 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49 73  pr->flags&EP_xIs
06f0: 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72 65  Select );.    re
0700: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
0710: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
0720: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
0730: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
0740: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
0750: 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
0760: 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23 69 66   pExpr->op2;.#if
0770: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0780: 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d  _CAST.  if( op==
0790: 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61  TK_CAST ){.    a
07a0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
07b0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
07c0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
07d0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
07e0: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45  3AffinityType(pE
07f0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
0800: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
0810: 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f  if( (op==TK_AGG_
0820: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
0830: 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45 78 70  _COLUMN) && pExp
0840: 72 2d 3e 79 2e 70 54 61 62 20 29 7b 0a 20 20 20  r->y.pTab ){.   
0850: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0860: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0870: 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54 61 62  ty(pExpr->y.pTab
0880: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
0890: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d  );.  }.  if( op=
08a0: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
08b0: 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  N ){.    assert(
08c0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66   pExpr->pLeft->f
08d0: 6c 61 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63  lags&EP_xIsSelec
08e0: 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t );.    return 
08f0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
0900: 69 74 79 28 0a 20 20 20 20 20 20 20 20 70 45 78  ity(.        pEx
0910: 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65  pr->pLeft->x.pSe
0920: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
0930: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
0940: 70 45 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d  pExpr.    );.  }
0950: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d  .  return pExpr-
0960: 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a  >affinity;.}../*
0970: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
0980: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
0990: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  or expression pE
09a0: 78 70 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f  xpr to be the co
09b0: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
09c0: 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f  nce named by pTo
09d0: 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20  ken.   Return a 
09e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77  pointer to a new
09f0: 20 45 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a   Expr node that.
0a00: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
0a10: 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  e COLLATE operat
0a20: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  or..**.** If a m
0a30: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
0a40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
0a50: 68 61 74 20 66 61 63 74 20 69 73 20 72 65 63 6f  hat fact is reco
0a60: 72 64 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e  rded in pParse->
0a70: 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45  db.** and the pE
0a80: 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  xpr parameter is
0a90: 20 72 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e   returned unchan
0aa0: 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ged..*/.Expr *sq
0ab0: 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
0ac0: 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73  ateToken(.  Pars
0ad0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
0ae0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
0af0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
0b00: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
0b10: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
0b20: 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73   "COLLATE" claus
0b30: 65 20 74 6f 20 74 68 69 73 20 65 78 70 72 65 73  e to this expres
0b40: 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  sion */.  const 
0b50: 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65  Token *pCollName
0b60: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f  ,  /* Name of co
0b70: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0b80: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
0b90: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e              /
0ba0: 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74  * True to dequot
0bb0: 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29  e pCollName */.)
0bc0: 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d  {.  if( pCollNam
0bd0: 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78  e->n>0 ){.    Ex
0be0: 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
0bf0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72  e3ExprAlloc(pPar
0c00: 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41  se->db, TK_COLLA
0c10: 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64  TE, pCollName, d
0c20: 65 71 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28  equote);.    if(
0c30: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70   pNew ){.      p
0c40: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78  New->pLeft = pEx
0c50: 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pr;.      pNew->
0c60: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c  flags |= EP_Coll
0c70: 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20  ate|EP_Skip;.   
0c80: 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b     pExpr = pNew;
0c90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0ca0: 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70  urn pExpr;.}.Exp
0cb0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64  r *sqlite3ExprAd
0cc0: 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50  dCollateString(P
0cd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
0ce0: 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74  pr *pExpr, const
0cf0: 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f   char *zC){.  To
0d00: 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28  ken s;.  assert(
0d10: 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69   zC!=0 );.  sqli
0d20: 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c  te3TokenInit(&s,
0d30: 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72   (char*)zC);.  r
0d40: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0d50: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
0d60: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
0d70: 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &s, 0);.}../*.**
0d80: 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54   Skip over any T
0d90: 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  K_COLLATE operat
0da0: 6f 72 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69  ors and any unli
0db0: 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b  kely().** or lik
0dc0: 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69  elihood() functi
0dd0: 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f  on at the root o
0de0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  f an expression.
0df0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
0e00: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
0e10: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
0e20: 20 77 68 69 6c 65 28 20 70 45 78 70 72 20 26 26   while( pExpr &&
0e30: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
0e40: 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 7c  (pExpr, EP_Skip|
0e50: 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a  EP_Unlikely) ){.
0e60: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
0e70: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
0e80: 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20  P_Unlikely) ){. 
0e90: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
0ea0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0eb0: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
0ec0: 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  t) );.      asse
0ed0: 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  rt( pExpr->x.pLi
0ee0: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
0ef0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
0f00: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pr->op==TK_FUNCT
0f10: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ION );.      pEx
0f20: 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  pr = pExpr->x.pL
0f30: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
0f40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
0f50: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0f60: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
0f70: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  );.      pExpr =
0f80: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
0f90: 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65     }.  }   .  re
0fa0: 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f  turn pExpr;.}../
0fb0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0fc0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
0fd0: 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ce for the expre
0fe0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a  ssion pExpr. If.
0ff0: 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  ** there is no d
1000: 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  efined collating
1010: 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72   sequence, retur
1020: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  n NULL..**.** Se
1030: 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 45  e also: sqlite3E
1040: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29 0a 2a  xprNNCollSeq().*
1050: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
1060: 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29 20  ExprNNCollSeq() 
1070: 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 65  works the same e
1080: 78 61 63 74 20 74 68 61 74 20 69 74 20 72 65 74  xact that it ret
1090: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65 66 61  urns the.** defa
10a0: 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 66  ult collation if
10b0: 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20 64 65   pExpr has no de
10c0: 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 2e  fined collation.
10d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
10e0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 69  ting sequence mi
10f0: 67 68 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65  ght be determine
1100: 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f  d by a COLLATE o
1110: 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20 62 79  perator.** or by
1120: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
1130: 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61   a column with a
1140: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
1150: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20  ng sequence..** 
1160: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
1170: 73 20 74 61 6b 65 20 66 69 72 73 74 20 70 72 65  s take first pre
1180: 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74 20 6f  cedence.  Left o
1190: 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a 2a 20  perands take.** 
11a0: 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20  precedence over 
11b0: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73 2e 0a  right operands..
11c0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
11d0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50  te3ExprCollSeq(P
11e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
11f0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71  pr *pExpr){.  sq
1200: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1210: 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c 53 65  se->db;.  CollSe
1220: 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
1230: 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70 72 3b  Expr *p = pExpr;
1240: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
1250: 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e 6f     int op = p->o
1260: 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  p;.    if( p->fl
1270: 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72 69 63  ags & EP_Generic
1280: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
1290: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
12a0: 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b  R ) op = p->op2;
12b0: 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b  .    if( (op==TK
12c0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f  _AGG_COLUMN || o
12d0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
12e0: 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a  op==TK_TRIGGER).
12f0: 20 20 20 20 20 26 26 20 70 2d 3e 79 2e 70 54 61       && p->y.pTa
1300: 62 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  b!=0.    ){.    
1310: 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49    /* op==TK_REGI
1320: 53 54 45 52 20 26 26 20 70 2d 3e 79 2e 70 54 61  STER && p->y.pTa
1330: 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65  b!=0 happens whe
1340: 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67  n pExpr was orig
1350: 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  inally.      ** 
1360: 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20  a TK_COLUMN but 
1370: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65  was previously e
1380: 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63  valuated and cac
1390: 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65  hed in a registe
13a0: 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  r */.      int j
13b0: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
13c0: 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b       if( j>=0 ){
13d0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
13e0: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e  har *zColl = p->
13f0: 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  y.pTab->aCol[j].
1400: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
1410: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
1420: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
1430: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
1440: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1450: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1460: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54   if( op==TK_CAST
1470: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   || op==TK_UPLUS
1480: 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d   ){.      p = p-
1490: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63 6f  >pLeft;.      co
14a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
14b0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c    if( op==TK_COL
14c0: 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 70 43  LATE ){.      pC
14d0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
14e0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
14f0: 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75  ENC(db), 0, p->u
1500: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1510: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1520: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
1530: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
1540: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
1550: 20 26 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66   && (p->pLeft->f
1560: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1570: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
1580: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
1590: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15a0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 78 74 20      Expr *pNext 
15b0: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
15c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70        /* The Exp
15d0: 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76  r.x union is nev
15e0: 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20 73  er used at the s
15f0: 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70 72  ame time as Expr
1600: 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  .pRight */.     
1610: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e     assert( p->x.
1620: 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pList==0 || p->p
1630: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
1640: 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20      /* p->flags 
1650: 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65  holds EP_Collate
1660: 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66   and p->pLeft->f
1670: 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20  lags does not.  
1680: 41 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  And.        ** p
1690: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e  ->x.pSelect cann
16a0: 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e  ot.  So if p->x.
16b0: 70 4c 65 66 74 20 65 78 69 73 74 73 2c 20 69 74  pLeft exists, it
16c0: 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 0a 20 20   must hold at.  
16d0: 20 20 20 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f        ** least o
16e0: 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54  ne EP_Collate. T
16f0: 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hus the followin
1700: 67 20 74 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f  g two ALWAYS. */
1710: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1720: 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 41 4c  x.pList!=0 && AL
1730: 57 41 59 53 28 21 45 78 70 72 48 61 73 50 72 6f  WAYS(!ExprHasPro
1740: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
1750: 65 6c 65 63 74 29 29 20 29 7b 0a 20 20 20 20 20  elect)) ){.     
1760: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1770: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 41        for(i=0; A
1780: 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69  LWAYS(i<p->x.pLi
1790: 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29  st->nExpr); i++)
17a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
17b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
17c0: 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  y(p->x.pList->a[
17d0: 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c  i].pExpr, EP_Col
17e0: 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  late) ){.       
17f0: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
1800: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1810: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
1820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1830: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1840: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1850: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
1860: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1870: 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61  else{.      brea
1880: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
1890: 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43  f( sqlite3CheckC
18a0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
18b0: 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43  Coll) ){ .    pC
18c0: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  oll = 0;.  }.  r
18d0: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
18e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1900: 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  nce for the expr
1910: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66  ession pExpr. If
1920: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20  .** there is no 
1930: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
1940: 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75  g sequence, retu
1950: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1960: 74 68 65 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63  the.** defautl c
1970: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1980: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
1990: 6f 3a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  o: sqlite3ExprCo
19a0: 6c 6c 53 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68  llSeq().**.** Th
19b0: 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  e sqlite3ExprCol
19c0: 6c 53 65 71 28 29 20 72 6f 75 74 69 6e 65 20 77  lSeq() routine w
19d0: 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 65 78  orks the same ex
19e0: 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
19f0: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
1a00: 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66 69  there is no defi
1a10: 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a  ned collation..*
1a20: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
1a30: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
1a40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1a50: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43  xpr *pExpr){.  C
1a60: 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 73 71 6c 69  ollSeq *p = sqli
1a70: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1a80: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
1a90: 20 69 66 28 20 70 3d 3d 30 20 29 20 70 20 3d 20   if( p==0 ) p = 
1aa0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
1ab0: 74 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  tColl;.  assert(
1ac0: 20 70 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p!=0 );.  retur
1ad0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
1ae0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1af0: 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
1b00: 20 68 61 76 65 20 65 71 75 69 76 61 6c 65 6e 74   have equivalent
1b10: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1b20: 6e 63 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nces..*/.int sql
1b30: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d  ite3ExprCollSeqM
1b40: 61 74 63 68 28 50 61 72 73 65 20 2a 70 50 61 72  atch(Parse *pPar
1b50: 73 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45  se, Expr *pE1, E
1b60: 78 70 72 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c  xpr *pE2){.  Col
1b70: 6c 53 65 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73  lSeq *pColl1 = s
1b80: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
1b90: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 31 29  Seq(pParse, pE1)
1ba0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
1bb0: 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ll2 = sqlite3Exp
1bc0: 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  rNNCollSeq(pPars
1bd0: 65 2c 20 70 45 32 29 3b 0a 20 20 72 65 74 75 72  e, pE2);.  retur
1be0: 6e 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  n sqlite3StrICmp
1bf0: 28 70 43 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20  (pColl1->zName, 
1c00: 70 43 6f 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d  pColl2->zName)==
1c10: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  0;.}../*.** pExp
1c20: 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20  r is an operand 
1c30: 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  of a comparison 
1c40: 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20  operator.  aff2 
1c50: 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61  is the.** type a
1c60: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f  ffinity of the o
1c70: 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54  ther operand.  T
1c80: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1c90: 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20  rns the.** type 
1ca0: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
1cb0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
1cc0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1cd0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61  operator..*/.cha
1ce0: 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  r sqlite3Compare
1cf0: 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70  Affinity(Expr *p
1d00: 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32 29  Expr, char aff2)
1d10: 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d 20  {.  char aff1 = 
1d20: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
1d30: 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ity(pExpr);.  if
1d40: 28 20 61 66 66 31 20 26 26 20 61 66 66 32 20 29  ( aff1 && aff2 )
1d50: 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69  {.    /* Both si
1d60: 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  des of the compa
1d70: 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e  rison are column
1d80: 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75  s. If one has nu
1d90: 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66  meric.    ** aff
1da0: 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e  inity, use that.
1db0: 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 6e   Otherwise use n
1dc0: 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  o affinity..    
1dd0: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
1de0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1df0: 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c  ity(aff1) || sql
1e00: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1e10: 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20  inity(aff2) ){. 
1e20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e30: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
1e40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
1e60: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20  FF_BLOB;.    }. 
1e70: 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66 31   }else if( !aff1
1e80: 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20   && !aff2 ){.   
1e90: 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65   /* Neither side
1ea0: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1eb0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
1ec0: 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20   Compare the.   
1ed0: 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65   ** results dire
1ee0: 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctly..    */.   
1ef0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
1f00: 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65  FF_BLOB;.  }else
1f10: 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64  {.    /* One sid
1f20: 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  e is a column, t
1f30: 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e  he other is not.
1f40: 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73   Use the columns
1f50: 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
1f60: 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d    assert( aff1==
1f70: 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a  0 || aff2==0 );.
1f80: 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31      return (aff1
1f90: 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a   + aff2);.  }.}.
1fa0: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
1fb0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1fc0: 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74  rator.  Return t
1fd0: 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  he type affinity
1fe0: 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
1ff0: 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f  be applied to bo
2000: 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f  th operands prio
2010: 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63  r to doing the c
2020: 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74  omparison..*/.st
2030: 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72  atic char compar
2040: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70  isonAffinity(Exp
2050: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61  r *pExpr){.  cha
2060: 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28  r aff;.  assert(
2070: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
2080: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
2090: 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IN || pExpr->
20a0: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20  op==TK_LT ||.   
20b0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
20c0: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72  ==TK_GT || pExpr
20d0: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70  ->op==TK_GE || p
20e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
20f0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
2100: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c  pr->op==TK_NE ||
2110: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2120: 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  S || pExpr->op==
2130: 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73  TK_ISNOT );.  as
2140: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
2150: 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71  ft );.  aff = sq
2160: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
2170: 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  y(pExpr->pLeft);
2180: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52  .  if( pExpr->pR
2190: 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20  ight ){.    aff 
21a0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
21b0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
21c0: 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20  pRight, aff);.  
21d0: 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61  }else if( ExprHa
21e0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
21f0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2200: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
2210: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
2220: 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  ty(pExpr->x.pSel
2230: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ect->pEList->a[0
2240: 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20  ].pExpr, aff);. 
2250: 20 7d 65 6c 73 65 20 69 66 28 20 61 66 66 3d 3d   }else if( aff==
2260: 30 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53  0 ){.    aff = S
2270: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
2280: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66    }.  return aff
2290: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
22a0: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
22b0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e   expression, eg.
22c0: 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e   '=', '<', IN(..
22d0: 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61  .) etc..** idx_a
22e0: 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61  ffinity is the a
22f0: 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e  ffinity of an in
2300: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65  dexed column. Re
2310: 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20  turn true.** if 
2320: 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61  the index with a
2330: 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69  ffinity idx_affi
2340: 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64  nity may be used
2350: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
2360: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
2370: 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74  in pExpr..*/.int
2380: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
2390: 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45  inityOk(Expr *pE
23a0: 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66  xpr, char idx_af
23b0: 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20  finity){.  char 
23c0: 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  aff = comparison
23d0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
23e0: 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29  .  switch( aff )
23f0: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
2400: 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20  E_AFF_BLOB:.    
2410: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2420: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
2430: 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75  TEXT:.      retu
2440: 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d  rn idx_affinity=
2450: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
2460: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
2470: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
2480: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
2490: 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74  nity(idx_affinit
24a0: 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  y);.  }.}../*.**
24b0: 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76   Return the P5 v
24c0: 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64  alue that should
24d0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62   be used for a b
24e0: 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e  inary comparison
24f0: 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45  .** opcode (OP_E
2500: 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75  q, OP_Ge etc.) u
2510: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70  sed to compare p
2520: 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32  Expr1 and pExpr2
2530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62  ..*/.static u8 b
2540: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45  inaryCompareP5(E
2550: 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70  xpr *pExpr1, Exp
2560: 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a  r *pExpr2, int j
2570: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38  umpIfNull){.  u8
2580: 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c   aff = (char)sql
2590: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
25a0: 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20  (pExpr2);.  aff 
25b0: 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d  = (u8)sqlite3Com
25c0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
25d0: 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29  pr1, aff) | (u8)
25e0: 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65  jumpIfNull;.  re
25f0: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
2600: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
2610: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61  ter to the colla
2620: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68  tion sequence th
2630: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
2640: 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79  d by.** a binary
2650: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
2660: 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70  ator comparing p
2670: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
2680: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65  .**.** If the le
2690: 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ft hand expressi
26a0: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
26b0: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65  ng sequence type
26c0: 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
26d0: 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  used. Otherwise 
26e0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
26f0: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
2700: 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73  ight hand expres
2710: 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c  sion.** is used,
2720: 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20   or the default 
2730: 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74  (BINARY) if neit
2740: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68  her expression h
2750: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  as a collating.*
2760: 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72  * type..**.** Ar
2770: 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62  gument pRight (b
2780: 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61  ut not pLeft) ma
2790: 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  y be a null poin
27a0: 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ter. In this cas
27b0: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  e,.** it is not 
27c0: 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43  considered..*/.C
27d0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42  ollSeq *sqlite3B
27e0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
27f0: 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Seq(.  Parse *pP
2800: 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70  arse, .  Expr *p
2810: 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70  Left, .  Expr *p
2820: 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53  Right.){.  CollS
2830: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73  eq *pColl;.  ass
2840: 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
2850: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
2860: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
2870: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2880: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2890: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
28a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
28b0: 68 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66  ht && (pRight->f
28c0: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
28d0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  e)!=0 ){.    pCo
28e0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
28f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2900: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
2910: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
2920: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2930: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
2940: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
2950: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  ){.      pColl =
2960: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2970: 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67  Seq(pParse, pRig
2980: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ht);.    }.  }. 
2990: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
29a0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
29b0: 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
29c0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
29d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
29e0: 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61  odeCompare(.  Pa
29f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2a00: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28  /* The parsing (
2a10: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
2a20: 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ing) context */.
2a30: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
2a40: 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
2a50: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
2a60: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f  r *pRight,     /
2a70: 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72  * The right oper
2a80: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63  and */.  int opc
2a90: 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ode,       /* Th
2aa0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63  e comparison opc
2ab0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31  ode */.  int in1
2ac0: 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65  , int in2, /* Re
2ad0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f  gister holding o
2ae0: 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74  perands */.  int
2af0: 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
2b00: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
2b10: 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a  rue.  */.  int j
2b20: 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
2b30: 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66  If true, jump if
2b40: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
2b50: 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  is NULL */.){.  
2b60: 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64  int p5;.  int ad
2b70: 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dr;.  CollSeq *p
2b80: 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74  4;..  p4 = sqlit
2b90: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
2ba0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2bb0: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
2bc0: 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70   p5 = binaryComp
2bd0: 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69  areP5(pLeft, pRi
2be0: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
2bf0: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
2c00: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61  e3VdbeAddOp4(pPa
2c10: 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f  rse->pVdbe, opco
2c20: 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69  de, in2, dest, i
2c30: 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n1,.            
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2c50: 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c  void*)p4, P4_COL
2c60: 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33  LSEQ);.  sqlite3
2c70: 56 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61  VdbeChangeP5(pPa
2c80: 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29  rse->pVdbe, (u8)
2c90: 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  p5);.  return ad
2ca0: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dr;.}../*.** Ret
2cb0: 75 72 6e 20 74 72 75 65 20 69 66 20 65 78 70 72  urn true if expr
2cc0: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
2cd0: 61 20 76 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c  a vector, or fal
2ce0: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  se otherwise..**
2cf0: 0a 2a 2a 20 41 20 76 65 63 74 6f 72 20 69 73 20  .** A vector is 
2d00: 64 65 66 69 6e 65 64 20 61 73 20 61 6e 79 20 65  defined as any e
2d10: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 72  xpression that r
2d20: 65 73 75 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72  esults in two or
2d30: 20 6d 6f 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73   more.** columns
2d40: 20 6f 66 20 72 65 73 75 6c 74 2e 20 20 45 76 65   of result.  Eve
2d50: 72 79 20 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64  ry TK_VECTOR nod
2d60: 65 20 69 73 20 61 6e 20 76 65 63 74 6f 72 20 62  e is an vector b
2d70: 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61  ecause the.** pa
2d80: 72 73 65 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65  rser will not ge
2d90: 6e 65 72 61 74 65 20 61 20 54 4b 5f 56 45 43 54  nerate a TK_VECT
2da0: 4f 52 20 77 69 74 68 20 66 65 77 65 72 20 74 68  OR with fewer th
2db0: 61 6e 20 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a  an two entries..
2dc0: 2a 2a 20 42 75 74 20 61 20 54 4b 5f 53 45 4c 45  ** But a TK_SELE
2dd0: 43 54 20 6d 69 67 68 74 20 62 65 20 65 69 74 68  CT might be eith
2de0: 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61  er a vector or a
2df0: 20 73 63 61 6c 61 72 2e 20 49 74 20 69 73 20 6f   scalar. It is o
2e00: 6e 6c 79 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  nly.** considere
2e10: 64 20 61 20 76 65 63 74 6f 72 20 69 66 20 69 74  d a vector if it
2e20: 20 68 61 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65   has two or more
2e30: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e   result columns.
2e40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2e50: 78 70 72 49 73 56 65 63 74 6f 72 28 45 78 70 72  xprIsVector(Expr
2e60: 20 2a 70 45 78 70 72 29 7b 0a 20 20 72 65 74 75   *pExpr){.  retu
2e70: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 56 65  rn sqlite3ExprVe
2e80: 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3e  ctorSize(pExpr)>
2e90: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  1;.}../*.** If t
2ea0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  he expression pa
2eb0: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
2ec0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20   argument is of 
2ed0: 74 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a  type TK_VECTOR .
2ee0: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ** return the nu
2ef0: 6d 62 65 72 20 6f 66 20 65 78 70 72 65 73 73 69  mber of expressi
2f00: 6f 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f  ons in the vecto
2f10: 72 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 65 78  r. Or, if the ex
2f20: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61  pression.** is a
2f30: 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 72 65 74   sub-select, ret
2f40: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2f50: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
2f60: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72   sub-select. For
2f70: 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 74 79  .** any other ty
2f80: 70 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  pe of expression
2f90: 2c 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69  , return 1..*/.i
2fa0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 56 65  nt sqlite3ExprVe
2fb0: 63 74 6f 72 53 69 7a 65 28 45 78 70 72 20 2a 70  ctorSize(Expr *p
2fc0: 45 78 70 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d  Expr){.  u8 op =
2fd0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
2fe0: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
2ff0: 52 20 29 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  R ) op = pExpr->
3000: 6f 70 32 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  op2;.  if( op==T
3010: 4b 5f 56 45 43 54 4f 52 20 29 7b 0a 20 20 20 20  K_VECTOR ){.    
3020: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e  return pExpr->x.
3030: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
3040: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
3050: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72  _SELECT ){.    r
3060: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70  eturn pExpr->x.p
3070: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
3080: 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nExpr;.  }else{.
3090: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
30a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
30b0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
30c0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 6f   subexpression o
30d0: 66 20 70 56 65 63 74 6f 72 20 74 68 61 74 20 69  f pVector that i
30e0: 73 20 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f  s the i-th.** co
30f0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
3100: 6f 72 20 28 6e 75 6d 62 65 72 65 64 20 73 74 61  or (numbered sta
3110: 72 74 69 6e 67 20 77 69 74 68 20 30 29 2e 20 20  rting with 0).  
3120: 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a  The caller must.
3130: 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 69  ** ensure that i
3140: 20 69 73 20 77 69 74 68 69 6e 20 72 61 6e 67 65   is within range
3150: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74  ..**.** If pVect
3160: 6f 72 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73  or is really a s
3170: 63 61 6c 61 72 20 28 61 6e 64 20 22 73 63 61 6c  calar (and "scal
3180: 61 72 22 20 68 65 72 65 20 69 6e 63 6c 75 64 65  ar" here include
3190: 73 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20  s subqueries.** 
31a0: 74 68 61 74 20 72 65 74 75 72 6e 20 61 20 73 69  that return a si
31b0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68  ngle column!) th
31c0: 65 6e 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f  en return pVecto
31d0: 72 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a  r unmodified..**
31e0: 0a 2a 2a 20 70 56 65 63 74 6f 72 20 72 65 74 61  .** pVector reta
31f0: 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  ins ownership of
3200: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 75   the returned su
3210: 62 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a  bexpression..**.
3220: 2a 2a 20 49 66 20 74 68 65 20 76 65 63 74 6f 72  ** If the vector
3230: 20 69 73 20 61 20 28 53 45 4c 45 43 54 20 2e 2e   is a (SELECT ..
3240: 2e 29 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  .) then the expr
3250: 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  ession returned 
3260: 69 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20 65  is.** just the e
3270: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68  xpression for th
3280: 65 20 69 2d 74 68 20 74 65 72 6d 20 6f 66 20 74  e i-th term of t
3290: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61  he result set, a
32a0: 6e 64 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65  nd may.** not be
32b0: 20 72 65 61 64 79 20 66 6f 72 20 65 76 61 6c 75   ready for evalu
32c0: 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68  ation because th
32d0: 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 68  e table cursor h
32e0: 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65  as not yet.** be
32f0: 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a  en positioned..*
3300: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 56  /.Expr *sqlite3V
3310: 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
3320: 72 28 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c  r(Expr *pVector,
3330: 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72   int i){.  asser
3340: 74 28 20 69 3c 73 71 6c 69 74 65 33 45 78 70 72  t( i<sqlite3Expr
3350: 56 65 63 74 6f 72 53 69 7a 65 28 70 56 65 63 74  VectorSize(pVect
3360: 6f 72 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  or) );.  if( sql
3370: 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
3380: 28 70 56 65 63 74 6f 72 29 20 29 7b 0a 20 20 20  (pVector) ){.   
3390: 20 61 73 73 65 72 74 28 20 70 56 65 63 74 6f 72   assert( pVector
33a0: 2d 3e 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63  ->op2==0 || pVec
33b0: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  tor->op==TK_REGI
33c0: 53 54 45 52 20 29 3b 0a 20 20 20 20 69 66 28 20  STER );.    if( 
33d0: 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f  pVector->op==TK_
33e0: 53 45 4c 45 43 54 20 7c 7c 20 70 56 65 63 74 6f  SELECT || pVecto
33f0: 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43  r->op2==TK_SELEC
3400: 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T ){.      retur
3410: 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65  n pVector->x.pSe
3420: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
3430: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65  i].pExpr;.    }e
3440: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
3450: 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69  n pVector->x.pLi
3460: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
3470: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3480: 72 6e 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f  rn pVector;.}../
3490: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
34a0: 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20 45 78   return a new Ex
34b0: 70 72 20 6f 62 6a 65 63 74 20 77 68 69 63 68 20  pr object which 
34c0: 77 68 65 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a  when passed to.*
34d0: 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  * sqlite3ExprCod
34e0: 65 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  e() will generat
34f0: 65 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20  e all necessary 
3500: 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a  code to compute.
3510: 2a 2a 20 74 68 65 20 69 46 69 65 6c 64 2d 74 68  ** the iField-th
3520: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76   column of the v
3530: 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
3540: 20 70 56 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20   pVector..**.** 
3550: 49 74 20 69 73 20 6f 6b 20 66 6f 72 20 70 56 65  It is ok for pVe
3560: 63 74 6f 72 20 74 6f 20 62 65 20 61 20 73 63 61  ctor to be a sca
3570: 6c 61 72 20 28 61 73 20 6c 6f 6e 67 20 61 73 20  lar (as long as 
3580: 69 46 69 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a  iField==0).  .**
3590: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
35a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
35b0: 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78  s like sqlite3Ex
35c0: 70 72 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  prDup()..**.** T
35d0: 68 65 20 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74  he caller owns t
35e0: 68 65 20 72 65 74 75 72 6e 65 64 20 45 78 70 72  he returned Expr
35f0: 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 73 20 72   object and is r
3600: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a  esponsible for.*
3610: 2a 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  * ensuring that 
3620: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
3630: 75 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  ue eventually ge
3640: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
3650: 54 68 65 20 63 61 6c 6c 65 72 20 72 65 74 61 69  The caller retai
3660: 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  ns ownership of 
3670: 70 56 65 63 74 6f 72 2e 20 20 49 66 20 70 56 65  pVector.  If pVe
3680: 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c  ctor is a TK_SEL
3690: 45 43 54 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ECT,.** then the
36a0: 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74   returned object
36b0: 20 77 69 6c 6c 20 72 65 66 65 72 65 6e 63 65 20   will reference 
36c0: 70 56 65 63 74 6f 72 20 61 6e 64 20 73 6f 20 70  pVector and so p
36d0: 56 65 63 74 6f 72 20 6d 75 73 74 20 72 65 6d 61  Vector must rema
36e0: 69 6e 0a 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20  in.** valid for 
36f0: 74 68 65 20 6c 69 66 65 20 6f 66 20 74 68 65 20  the life of the 
3700: 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e  returned object.
3710: 20 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20    If pVector is 
3720: 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f  a TK_VECTOR.** o
3730: 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  r a scalar expre
3740: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63  ssion, then it c
3750: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 20 61 73  an be deleted as
3760: 20 73 6f 6f 6e 20 61 73 20 74 68 69 73 20 72 6f   soon as this ro
3770: 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
3780: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20  ..**.** A trick 
3790: 74 6f 20 63 61 75 73 65 20 61 20 54 4b 5f 53 45  to cause a TK_SE
37a0: 4c 45 43 54 20 70 56 65 63 74 6f 72 20 74 6f 20  LECT pVector to 
37b0: 62 65 20 64 65 6c 65 74 65 64 20 74 6f 67 65 74  be deleted toget
37c0: 68 65 72 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  her with.** the 
37d0: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
37e0: 6a 65 63 74 20 69 73 20 74 6f 20 61 74 74 61 63  ject is to attac
37f0: 68 20 74 68 65 20 70 56 65 63 74 6f 72 20 74 6f  h the pVector to
3800: 20 74 68 65 20 70 52 69 67 68 74 20 66 69 65 6c   the pRight fiel
3810: 64 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75  d.** of the retu
3820: 72 6e 65 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43  rned TK_SELECT_C
3830: 4f 4c 55 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63  OLUMN Expr objec
3840: 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  t..*/.Expr *sqli
3850: 74 65 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72  te3ExprForVector
3860: 46 69 65 6c 64 28 0a 20 20 50 61 72 73 65 20 2a  Field(.  Parse *
3870: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
3880: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
3890: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63   */.  Expr *pVec
38a0: 74 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  tor,       /* Th
38b0: 65 20 76 65 63 74 6f 72 2e 20 20 4c 69 73 74 20  e vector.  List 
38c0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  of expressions o
38d0: 72 20 61 20 73 75 62 2d 53 45 4c 45 43 54 20 2a  r a sub-SELECT *
38e0: 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 20 20  /.  int iField  
38f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
3900: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
3910: 76 65 63 74 6f 72 20 74 6f 20 72 65 74 75 72 6e  vector to return
3920: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
3930: 52 65 74 3b 0a 20 20 69 66 28 20 70 56 65 63 74  Ret;.  if( pVect
3940: 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  or->op==TK_SELEC
3950: 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  T ){.    assert(
3960: 20 70 56 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20   pVector->flags 
3970: 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
3980: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f  ;.    /* The TK_
3990: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78  SELECT_COLUMN Ex
39a0: 70 72 20 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a  pr node:.    **.
39b0: 20 20 20 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20      ** pLeft:   
39c0: 20 20 20 20 20 20 20 20 70 56 65 63 74 6f 72 20          pVector 
39d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45  containing TK_SE
39e0: 4c 45 43 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74  LECT.  Not delet
39f0: 65 64 2e 0a 20 20 20 20 2a 2a 20 70 52 69 67 68  ed..    ** pRigh
3a00: 74 3a 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20  t:          not 
3a10: 75 73 65 64 2e 20 20 42 75 74 20 72 65 63 75 72  used.  But recur
3a20: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a  sively deleted..
3a30: 20 20 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20      ** iColumn: 
3a40: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 6f 66          Index of
3a50: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65   a column in pVe
3a60: 63 74 6f 72 0a 20 20 20 20 2a 2a 20 69 54 61 62  ctor.    ** iTab
3a70: 6c 65 3a 20 20 20 20 20 20 20 20 20 20 30 20 6f  le:          0 o
3a80: 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
3a90: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c  columns on the L
3aa0: 48 53 20 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d  HS of an assignm
3ab0: 65 6e 74 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74  ent.    ** pLeft
3ac0: 2d 3e 69 54 61 62 6c 65 3a 20 20 20 46 69 72 73  ->iTable:   Firs
3ad0: 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  t in an array of
3ae0: 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
3af0: 67 20 72 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20  g result, or 0. 
3b00: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
3b10: 20 20 20 20 20 20 20 69 66 20 74 68 65 20 72 65         if the re
3b20: 73 75 6c 74 20 69 73 20 6e 6f 74 20 79 65 74 20  sult is not yet 
3b30: 63 6f 6d 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a  computed..    **
3b40: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45  .    ** sqlite3E
3b50: 78 70 72 44 65 6c 65 74 65 28 29 20 73 70 65 63  xprDelete() spec
3b60: 69 66 69 63 61 6c 6c 79 20 73 6b 69 70 73 20 74  ifically skips t
3b70: 68 65 20 72 65 63 75 72 73 69 76 65 20 64 65 6c  he recursive del
3b80: 65 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c  ete of.    ** pL
3b90: 65 66 74 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54  eft on TK_SELECT
3ba0: 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20  _COLUMN nodes.  
3bb0: 42 75 74 20 70 52 69 67 68 74 20 69 73 20 66 6f  But pRight is fo
3bc0: 6c 6c 6f 77 65 64 2c 20 73 6f 20 70 56 65 63 74  llowed, so pVect
3bd0: 6f 72 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  or.    ** can be
3be0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 70 52 69   attached to pRi
3bf0: 67 68 74 20 74 6f 20 63 61 75 73 65 20 74 68 69  ght to cause thi
3c00: 73 20 6e 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f  s node to take o
3c10: 77 6e 65 72 73 68 69 70 20 6f 66 0a 20 20 20 20  wnership of.    
3c20: 2a 2a 20 70 56 65 63 74 6f 72 2e 20 20 54 79 70  ** pVector.  Typ
3c30: 69 63 61 6c 6c 79 20 74 68 65 72 65 20 77 69 6c  ically there wil
3c40: 6c 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b  l be multiple TK
3c50: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e  _SELECT_COLUMN n
3c60: 6f 64 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68  odes.    ** with
3c70: 20 74 68 65 20 73 61 6d 65 20 70 4c 65 66 74 20   the same pLeft 
3c80: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
3c90: 56 65 63 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79  Vector, but only
3ca0: 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 20 20 20   one of them.   
3cb0: 20 2a 2a 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65   ** will own the
3cc0: 20 70 56 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f   pVector..    */
3cd0: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
3ce0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
3cf0: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
3d00: 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  N, 0, 0);.    if
3d10: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
3d20: 70 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pRet->iColumn = 
3d30: 69 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52  iField;.      pR
3d40: 65 74 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63  et->pLeft = pVec
3d50: 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
3d60: 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c  ssert( pRet==0 |
3d70: 7c 20 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d  | pRet->iTable==
3d80: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
3d90: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3da0: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70  p==TK_VECTOR ) p
3db0: 56 65 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72  Vector = pVector
3dc0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
3dd0: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
3de0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
3df0: 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
3e00: 2c 20 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20  , pVector, 0);. 
3e10: 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
3e20: 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73  TokenRemap(pPars
3e30: 65 2c 20 70 52 65 74 2c 20 70 56 65 63 74 6f 72  e, pRet, pVector
3e40: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
3e50: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pRet;.}../*.** I
3e60: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
3e70: 70 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b  pr is of type TK
3e80: 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74  _SELECT, generat
3e90: 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
3ea0: 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74 75 72 6e  te.** it. Return
3eb0: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
3ec0: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
3ed0: 74 20 69 73 20 73 74 6f 72 65 64 20 28 6f 72 2c  t is stored (or,
3ee0: 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d   if the .** sub-
3ef0: 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 6d  select returns m
3f00: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c  ore than one col
3f10: 75 6d 6e 2c 20 74 68 65 20 66 69 72 73 74 20 69  umn, the first i
3f20: 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20 6f 66  n an array.** of
3f30: 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 77 68   registers in wh
3f40: 69 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 69  ich the result i
3f50: 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a 2a 2a  s stored)..**.**
3f60: 20 49 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74   If pExpr is not
3f70: 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70   a TK_SELECT exp
3f80: 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20  ression, return 
3f90: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
3fa0: 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65   exprCodeSubsele
3fb0: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
3fc0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
3fd0: 20 20 69 6e 74 20 72 65 67 20 3d 20 30 3b 0a 23    int reg = 0;.#
3fe0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3ff0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
4000: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
4010: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65  SELECT ){.    re
4020: 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  g = sqlite3CodeS
4030: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
4040: 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 23 65 6e   pExpr);.  }.#en
4050: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67  dif.  return reg
4060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
4070: 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e  ent pVector poin
4080: 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65  ts to a vector e
4090: 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68  xpression - eith
40a0: 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a  er a TK_VECTOR.*
40b0: 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74  * or TK_SELECT t
40c0: 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65  hat returns more
40d0: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
40e0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
40f0: 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72  returns.** the r
4100: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f  egister number o
4110: 66 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  f a register tha
4120: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
4130: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65  alue of.** eleme
4140: 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65  nt iField of the
4150: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   vector..**.** I
4160: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
4170: 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73  K_SELECT express
4180: 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66  ion, then code f
4190: 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20  or it must have 
41a0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
41b0: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
41c0: 20 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62   the exprCodeSub
41d0: 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65  select() routine
41e0: 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
41f0: 65 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53  e parameter regS
4200: 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20  elect should be 
4210: 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
4220: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
4230: 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  rs.** containing
4240: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
4250: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  the sub-select. 
4260: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f  .**.** If pVecto
4270: 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f  r is of type TK_
4280: 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64  VECTOR, then cod
4290: 65 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73  e for the reques
42a0: 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20  ted field.** is 
42b0: 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68  generated. In th
42c0: 69 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72  is case (*pRegFr
42d0: 65 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74  ee) may be set t
42e0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
42f0: 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  ** a temporary r
4300: 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72  egister to be fr
4310: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
4320: 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
4330: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ng..**.** Before
4340: 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70   returning, outp
4350: 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  ut parameter (*p
4360: 70 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f  pExpr) is set to
4370: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
4380: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72   Expr object cor
4390: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c  responding to el
43a0: 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74  ement iElem of t
43b0: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74  he vector..*/.st
43c0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63  atic int exprVec
43d0: 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50  torRegister(.  P
43e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4400: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
4410: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74  */.  Expr *pVect
4420: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
4430: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74       /* Vector t
4440: 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e  o extract elemen
4450: 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
4460: 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20  iField,         
4470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4480: 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20  ield to extract 
4490: 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a  from pVector */.
44a0: 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c    int regSelect,
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44c0: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
44d0: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
44e0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
44f0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
4500: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78        /* OUT: Ex
4510: 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74  pression element
4520: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46   */.  int *pRegF
4530: 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
4540: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65        /* OUT: Te
4550: 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
4560: 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f  ree */.){.  u8 o
4570: 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b  p = pVector->op;
4580: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
4590: 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d  K_VECTOR || op==
45a0: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
45b0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
45c0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
45d0: 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70  ISTER ){.    *pp
45e0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65  Expr = sqlite3Ve
45f0: 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
4600: 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64  (pVector, iField
4610: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56  );.    return pV
4620: 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46  ector->iTable+iF
4630: 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ield;.  }.  if( 
4640: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
4650: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70  .    *ppExpr = p
4660: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
4670: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69  t->pEList->a[iFi
4680: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
4690: 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63   return regSelec
46a0: 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20  t+iField;.  }.  
46b0: 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f  *ppExpr = pVecto
46c0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46  r->x.pList->a[iF
46d0: 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72  ield].pExpr;.  r
46e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
46f0: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
4700: 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46  , *ppExpr, pRegF
4710: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ree);.}../*.** E
4720: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
4730: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
4740: 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74  between two vect
4750: 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75  or values. Compu
4760: 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  te.** the result
4770: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
4780: 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c  on (1, 0, or NUL
4790: 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  L) and write tha
47a0: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f  t.** result into
47b0: 20 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a   register dest..
47c0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
47d0: 20 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68   must satisfy th
47e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63  e following prec
47f0: 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  onditions:.**.**
4800: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
4810: 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70  ==TK_IS:      op
4820: 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d  ==TK_EQ and p5==
4830: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
4840: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
4850: 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70  ==TK_ISNOT:   op
4860: 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d  ==TK_NE and p5==
4870: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
4880: 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20      otherwise:  
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
48a0: 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  ==pExpr->op and 
48b0: 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20  p5==0.*/.static 
48c0: 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43  void codeVectorC
48d0: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
48e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
48f0: 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f  /* Code generato
4900: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
4910: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
4920: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
4930: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
4940: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
4950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
4960: 72 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74  rite results int
4970: 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
4980: 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20  */.  u8 op,     
4990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
49a0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
49b0: 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  r */.  u8 p5    
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49d0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72  SQLITE_NULLEQ or
49e0: 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64   zero */.){.  Vd
49f0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
4a00: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
4a10: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
4a20: 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69  eft;.  Expr *pRi
4a30: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
4a40: 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74  ght;.  int nLeft
4a50: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
4a60: 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
4a70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4a80: 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69  regLeft = 0;.  i
4a90: 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b  nt regRight = 0;
4aa0: 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a  .  u8 opx = op;.
4ab0: 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d    int addrDone =
4ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4ad0: 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  Label(pParse);..
4ae0: 20 20 69 66 28 20 6e 4c 65 66 74 21 3d 73 71 6c    if( nLeft!=sql
4af0: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
4b00: 7a 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  ze(pRight) ){.  
4b10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4b20: 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
4b30: 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
4b40: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
4b50: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
4b60: 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45  >op==TK_EQ || pE
4b70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 0a  xpr->op==TK_NE .
4b80: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
4b90: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45  >op==TK_IS || pE
4ba0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4bb0: 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78  T .       || pEx
4bc0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pr->op==TK_LT ||
4bd0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
4be0: 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78  T .       || pEx
4bf0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
4c00: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
4c10: 45 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  E .  );.  assert
4c20: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20  ( pExpr->op==op 
4c30: 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  || (pExpr->op==T
4c40: 4b 5f 49 53 20 26 26 20 6f 70 3d 3d 54 4b 5f 45  K_IS && op==TK_E
4c50: 51 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  Q).            |
4c60: 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  | (pExpr->op==TK
4c70: 5f 49 53 4e 4f 54 20 26 26 20 6f 70 3d 3d 54 4b  _ISNOT && op==TK
4c80: 5f 4e 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  _NE) );.  assert
4c90: 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78 70 72  ( p5==0 || pExpr
4ca0: 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20 61 73  ->op!=op );.  as
4cb0: 73 65 72 74 28 20 70 35 3d 3d 53 51 4c 49 54 45  sert( p5==SQLITE
4cc0: 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78 70 72  _NULLEQ || pExpr
4cd0: 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20 20 70  ->op==op );..  p
4ce0: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 53 54 4f 52  5 |= SQLITE_STOR
4cf0: 45 50 32 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d  EP2;.  if( opx==
4d00: 54 4b 5f 4c 45 20 29 20 6f 70 78 20 3d 20 54 4b  TK_LE ) opx = TK
4d10: 5f 4c 54 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d  _LT;.  if( opx==
4d20: 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20 54 4b  TK_GE ) opx = TK
4d30: 5f 47 54 3b 0a 0a 20 20 72 65 67 4c 65 66 74 20  _GT;..  regLeft 
4d40: 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c  = exprCodeSubsel
4d50: 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ect(pParse, pLef
4d60: 74 29 3b 0a 20 20 72 65 67 52 69 67 68 74 20 3d  t);.  regRight =
4d70: 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65   exprCodeSubsele
4d80: 63 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  ct(pParse, pRigh
4d90: 74 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t);..  for(i=0; 
4da0: 31 20 2f 2a 4c 6f 6f 70 20 65 78 69 74 73 20 62  1 /*Loop exits b
4db0: 79 20 22 62 72 65 61 6b 22 2a 2f 3b 20 69 2b 2b  y "break"*/; i++
4dc0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 46 72  ){.    int regFr
4dd0: 65 65 31 20 3d 20 30 2c 20 72 65 67 46 72 65 65  ee1 = 0, regFree
4de0: 32 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 72 20  2 = 0;.    Expr 
4df0: 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20 20 69  *pL, *pR; .    i
4e00: 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 61  nt r1, r2;.    a
4e10: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
4e20: 3c 6e 4c 65 66 74 20 29 3b 0a 20 20 20 20 72 31  <nLeft );.    r1
4e30: 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67   = exprVectorReg
4e40: 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c  ister(pParse, pL
4e50: 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c  eft, i, regLeft,
4e60: 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29   &pL, &regFree1)
4e70: 3b 0a 20 20 20 20 72 32 20 3d 20 65 78 70 72 56  ;.    r2 = exprV
4e80: 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50  ectorRegister(pP
4e90: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69 2c  arse, pRight, i,
4ea0: 20 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c 20   regRight, &pR, 
4eb0: 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
4ec0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
4ed0: 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f 70 78 2c  se, pL, pR, opx,
4ee0: 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 70   r1, r2, dest, p
4ef0: 35 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  5);.    testcase
4f00: 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
4f10: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4f20: 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 74 65  ==OP_Lt);.    te
4f30: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
4f40: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4f50: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
4f60: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4f70: 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
4f80: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f90: 5f 47 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Gt);.    testca
4fa0: 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
4fb0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4fc0: 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
4fd0: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4fe0: 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
4ff0: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
5000: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
5010: 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43  p==OP_Ne); VdbeC
5020: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
5030: 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71 6c 69  OP_Ne);.    sqli
5040: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5050: 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
5060: 65 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e1);.    sqlite3
5070: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5080: 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
5090: 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65  ;.    if( i==nLe
50a0: 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62 72  ft-1 ){.      br
50b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
50c0: 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29 7b  f( opx==TK_EQ ){
50d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
50e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
50f0: 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64 72  fNot, dest, addr
5100: 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Done); VdbeCover
5110: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35  age(v);.      p5
5120: 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e   |= SQLITE_KEEPN
5130: 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ULL;.    }else i
5140: 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b  f( opx==TK_NE ){
5150: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5160: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5170: 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e  f, dest, addrDon
5180: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
5190: 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d  (v);.      p5 |=
51a0: 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c   SQLITE_KEEPNULL
51b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
51c0: 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54     assert( op==T
51d0: 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LT || op==TK_G
51e0: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  T || op==TK_LE |
51f0: 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  | op==TK_GE );. 
5200: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5210: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c 73  AddOp2(v, OP_Els
5220: 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72 44  eNotEq, 0, addrD
5230: 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  one);.      Vdbe
5240: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
5250: 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20  ==TK_LT);.      
5260: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
5270: 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20  , op==TK_GT);.  
5280: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
5290: 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29  If(v, op==TK_LE)
52a0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
52b0: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
52c0: 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  _GE);.      if( 
52d0: 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70 78  i==nLeft-2 ) opx
52e0: 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d   = op;.    }.  }
52f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
5300: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
5310: 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66 20  drDone);.}..#if 
5320: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
5330: 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  DEPTH>0./*.** Ch
5340: 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e  eck that argumen
5350: 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73  t nHeight is les
5360: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
5370: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a  to the maximum.*
5380: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  * expression dep
5390: 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69  th allowed. If i
53a0: 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20  t is not, leave 
53b0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
53c0: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a   in.** pParse..*
53d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
53e0: 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72  rCheckHeight(Par
53f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
5400: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20  nHeight){.  int 
5410: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5420: 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d    int mxHeight =
5430: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
5440: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
5450: 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20  _EXPR_DEPTH];.  
5460: 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65  if( nHeight>mxHe
5470: 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
5480: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5490: 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70  se, .       "Exp
54a0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20  ression tree is 
54b0: 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d  too large (maxim
54c0: 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d  um depth %d)", m
54d0: 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20  xHeight.    );. 
54e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
54f0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
5500: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  rn rc;.}../* The
5510: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65   following three
5520: 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67   functions, heig
5530: 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67  htOfExpr(), heig
5540: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a  htOfExprList().*
5550: 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65  * and heightOfSe
5560: 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64  lect(), are used
5570: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
5580: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
5590: 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65  .** of any expre
55a0: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
55b0: 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72  enced by the str
55c0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
55d0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72   the.** first ar
55e0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
55f0: 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65   this maximum he
5600: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
5610: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
5620: 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a   value pointed.*
5630: 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74  * to by pnHeight
5640: 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  , the second par
5650: 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74  ameter, then set
5660: 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68   *pnHeight to th
5670: 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a  at.** value..*/.
5680: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5690: 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70  htOfExpr(Expr *p
56a0: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
56b0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
56c0: 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e   if( p->nHeight>
56d0: 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20  *pnHeight ){.   
56e0: 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70     *pnHeight = p
56f0: 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d  ->nHeight;.    }
5700: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
5710: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  id heightOfExprL
5720: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  ist(ExprList *p,
5730: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5740: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5750: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
5760: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
5770: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67  i++){.      heig
5780: 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d  htOfExpr(p->a[i]
5790: 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74  .pExpr, pnHeight
57a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  );.    }.  }.}.s
57b0: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
57c0: 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74  tOfSelect(Select
57d0: 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20 2a   *pSelect, int *
57e0: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53 65 6c  pnHeight){.  Sel
57f0: 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  ect *p;.  for(p=
5800: 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d 70 2d  pSelect; p; p=p-
5810: 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 68 65  >pPrior){.    he
5820: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57  ightOfExpr(p->pW
5830: 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b  here, pnHeight);
5840: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5850: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e  r(p->pHaving, pn
5860: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5870: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69  ghtOfExpr(p->pLi
5880: 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  mit, pnHeight);.
5890: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
58a0: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
58b0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
58c0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
58d0: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48  p->pGroupBy, pnH
58e0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
58f0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5900: 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67  pOrderBy, pnHeig
5910: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
5920: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
5930: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
5940: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
5950: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a   passed as an .*
5960: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65  * argument. An e
5970: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e  xpression with n
5980: 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72  o children, Expr
5990: 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78  .pList or .** Ex
59a0: 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65  pr.pSelect membe
59b0: 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f  r has a height o
59c0: 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65  f 1. Any other e
59d0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73  xpression.** has
59e0: 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20   a height equal 
59f0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  to the maximum h
5a00: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68  eight of any oth
5a10: 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  er .** reference
5a20: 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e  d Expr plus one.
5a30: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
5a40: 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61  agate EP_Propaga
5a50: 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d  te flags up from
5a60: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f   Expr.x.pList to
5a70: 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20   Expr.flags,.** 
5a80: 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  if appropriate..
5a90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5aa0: 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70  xprSetHeight(Exp
5ab0: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  r *p){.  int nHe
5ac0: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
5ad0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66  htOfExpr(p->pLef
5ae0: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5af0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5b00: 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74  pRight, &nHeight
5b10: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
5b20: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
5b30: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
5b40: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5b50: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e  p->x.pSelect, &n
5b60: 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  Height);.  }else
5b70: 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20   if( p->x.pList 
5b80: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
5b90: 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69  xprList(p->x.pLi
5ba0: 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  st, &nHeight);. 
5bb0: 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45     p->flags |= E
5bc0: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71  P_Propagate & sq
5bd0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
5be0: 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  gs(p->x.pList);.
5bf0: 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74    }.  p->nHeight
5c00: 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a   = nHeight + 1;.
5c10: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
5c20: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
5c30: 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65  riable using the
5c40: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29   exprSetHeight()
5c50: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a   function. If.**
5c60: 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67   the height is g
5c70: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
5c80: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  maximum allowed 
5c90: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
5ca0: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
5cb0: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
5cc0: 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67  *.** Also propag
5cd0: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
5ce0: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
5cf0: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
5d00: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
5d10: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
5d20: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
5d30: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
5d40: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
5d50: 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p){.  if( pParse
5d60: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
5d70: 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74  .  exprSetHeight
5d80: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (p);.  sqlite3Ex
5d90: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
5da0: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
5db0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
5dc0: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  rn the maximum h
5dd0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70  eight of any exp
5de0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5df0: 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68  erenced.** by th
5e00: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5e10: 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
5e20: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
5e30: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
5e40: 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20  prHeight(Select 
5e50: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
5e60: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
5e70: 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65  OfSelect(p, &nHe
5e80: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
5e90: 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65  nHeight;.}.#else
5ea0: 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67   /* ABOVE:  Heig
5eb0: 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65  ht enforcement e
5ec0: 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20  nabled.  BELOW: 
5ed0: 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65  Height enforceme
5ee0: 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20  nt off */./*.** 
5ef0: 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  Propagate all EP
5f00: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
5f10: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5f20: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5f30: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5f40: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5f50: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5f60: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5f70: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5f80: 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  p && p->x.pList 
5f90: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
5fa0: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
5fb0: 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66  ect) ){.    p->f
5fc0: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
5fd0: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
5fe0: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5ff0: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23  .pList);.  }.}.#
6000: 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65  define exprSetHe
6010: 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f  ight(y).#endif /
6020: 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  * SQLITE_MAX_EXP
6030: 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a  R_DEPTH>0 */../*
6040: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6050: 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c   is the core all
6060: 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20  ocator for Expr 
6070: 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e  nodes..**.** Con
6080: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
6090: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64  ression node and
60a0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
60b0: 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79  r to it.  Memory
60c0: 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64  .** for this nod
60d0: 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54  e and for the pT
60e0: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  oken argument is
60f0: 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   a single alloca
6100: 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  tion.** obtained
6110: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
6120: 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61  alloc().  The ca
6130: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
6140: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
6150: 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
6160: 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75   the node eventu
6170: 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e  ally gets freed.
6180: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74  .**.** If dequot
6190: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
61a0: 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74  the token (if it
61b0: 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75   exists) is dequ
61c0: 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75  oted..** If dequ
61d0: 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f  ote is false, no
61e0: 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65   dequoting is pe
61f0: 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64 65  rformed.  The de
6200: 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74  Quote.** paramet
6210: 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
6220: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20   pToken is NULL 
6230: 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20  or if the token 
6240: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65  does not.** appe
6250: 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ar to be quoted.
6260: 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20    If the quotes 
6270: 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  were of the form
6280: 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71   "..." (double-q
6290: 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74  uotes).** then t
62a0: 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20  he EP_DblQuoted 
62b0: 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
62c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
62d0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61  de..**.** Specia
62e0: 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d  l case:  If op==
62f0: 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70  TK_INTEGER and p
6300: 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Token points to 
6310: 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a  a string that.**
6320: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74   can be translat
6330: 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74  ed into a 32-bit
6340: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
6350: 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a  he token is not.
6360: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a  ** stored in u.z
6370: 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c  Token.  Instead,
6380: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
6390: 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ues is written.*
63a0: 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20  * into u.iValue 
63b0: 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61  and the EP_IntVa
63c0: 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e  lue flag is set.
63d0: 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61    No extra stora
63e0: 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74  ge.** is allocat
63f0: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69  ed to hold the i
6400: 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20  nteger text and 
6410: 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67  the dequote flag
6420: 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
6430: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
6440: 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65  rAlloc(.  sqlite
6450: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
6460: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
6470: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6480: 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  awNN() */.  int 
6490: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
64a0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
64b0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
64c0: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
64d0: 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61  n,    /* Token a
64e0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
64f0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
6500: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
6510: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
6520: 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20  dequote */.){.  
6530: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
6540: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
6550: 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a  int iValue = 0;.
6560: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
6570: 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e   );.  if( pToken
6580: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
6590: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
65a0: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
65b0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
65c0: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
65d0: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
65e0: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
65f0: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
6600: 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c      assert( iVal
6610: 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ue>=0 );.    }. 
6620: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
6630: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
6640: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
6650: 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  )+nExtra);.  if(
6660: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   pNew ){.    mem
6670: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
6680: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
6690: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
66a0: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
66b0: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
66c0: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
66d0: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
66e0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
66f0: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
6700: 6c 75 65 7c 45 50 5f 4c 65 61 66 7c 28 69 56 61  lue|EP_Leaf|(iVa
6710: 6c 75 65 3f 45 50 5f 49 73 54 72 75 65 3a 45 50  lue?EP_IsTrue:EP
6720: 5f 49 73 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  _IsFalse);.     
6730: 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
6740: 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20  e = iValue;.    
6750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6760: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
6770: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
6780: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
6790: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
67a0: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
67b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
67c0: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
67d0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
67e0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
67f0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
6800: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
6810: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
6820: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
6830: 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33 49 73  ote && sqlite3Is
6840: 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54  quote(pNew->u.zT
6850: 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20  oken[0]) ){.    
6860: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
6870: 75 6f 74 65 45 78 70 72 28 70 4e 65 77 29 3b 0a  uoteExpr(pNew);.
6880: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6890: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  }.    }.#if SQLI
68a0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
68b0: 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48  H>0.    pNew->nH
68c0: 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69  eight = 1;.#endi
68d0: 66 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f  .  }.  return
68e0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
68f0: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  Allocate a new e
6900: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
6910: 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69  rom a zero-termi
6920: 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74  nated token that
6930: 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   has.** already 
6940: 62 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a  been dequoted..*
6950: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
6960: 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
6970: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
6980: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c  * Handle for sql
6990: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
69a0: 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29  () (may be null)
69b0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
69d0: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
69e0: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
69f0: 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20  ar *zToken      
6a00: 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  /* Token argumen
6a10: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
6a20: 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20  L */.){.  Token 
6a30: 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65  x;.  x.z = zToke
6a40: 6e 3b 0a 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74  n;.  x.n = sqlit
6a50: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65  e3Strlen30(zToke
6a60: 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  n);.  return sql
6a70: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
6a80: 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a  , op, &x, 0);.}.
6a90: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75  ./*.** Attach su
6aa0: 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64  btrees pLeft and
6ab0: 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20 45   pRight to the E
6ac0: 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a  xpr node pRoot..
6ad0: 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d  **.** If pRoot==
6ae0: 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
6af0: 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c  that a memory al
6b00: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
6b10: 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  as occurred..** 
6b20: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 65  In that case, de
6b30: 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65 65  lete the subtree
6b40: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
6b50: 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ht..*/.void sqli
6b60: 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62  te3ExprAttachSub
6b70: 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33  trees(.  sqlite3
6b80: 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52   *db,.  Expr *pR
6b90: 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65  oot,.  Expr *pLe
6ba0: 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft,.  Expr *pRig
6bb0: 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f  ht.){.  if( pRoo
6bc0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  t==0 ){.    asse
6bd0: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
6be0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69  iled );.    sqli
6bf0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6c00: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  , pLeft);.    sq
6c10: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6c20: 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  db, pRight);.  }
6c30: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52  else{.    if( pR
6c40: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52  ight ){.      pR
6c50: 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 52  oot->pRight = pR
6c60: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  ight;.      pRoo
6c70: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  t->flags |= EP_P
6c80: 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67 68  ropagate & pRigh
6c90: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
6ca0: 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b      if( pLeft ){
6cb0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c  .      pRoot->pL
6cc0: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  eft = pLeft;.   
6cd0: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
6ce0: 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  |= EP_Propagate 
6cf0: 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a  & pLeft->flags;.
6d00: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
6d10: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
6d20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
6d30: 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e 6f  ocate an Expr no
6d40: 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61  de which joins a
6d50: 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75  s many as two su
6d60: 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  btrees..**.** On
6d70: 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
6d80: 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65   subtrees can be
6d90: 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61   NULL.  Return a
6da0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6db0: 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65  new.** Expr node
6dc0: 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d  .  Or, if an OOM
6dd0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
6de0: 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  et pParse->db->m
6df0: 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20  allocFailed,.** 
6e00: 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65  free the subtree
6e10: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
6e20: 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  L..*/.Expr *sqli
6e30: 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73  te3PExpr(.  Pars
6e40: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6e50: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
6e60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
6e70: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6e80: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6e90: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78  n opcode */.  Ex
6ea0: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
6eb0: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70        /* Left op
6ec0: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
6ed0: 2a 70 52 69 67 68 74 20 20 20 20 20 20 20 20 20  *pRight         
6ee0: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
6ef0: 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  and */.){.  Expr
6f00: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
6f10: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
6f20: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
6f30: 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 69 66 28  of(Expr));.  if(
6f40: 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74   p ){.    memset
6f50: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  (p, 0, sizeof(Ex
6f60: 70 72 29 29 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  pr));.    p->op 
6f70: 3d 20 6f 70 20 26 20 30 78 66 66 3b 0a 20 20 20  = op & 0xff;.   
6f80: 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20   p->iAgg = -1;. 
6f90: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74     sqlite3ExprAt
6fa0: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
6fb0: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
6fc0: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
6fd0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
6fe0: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
6ff0: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65  ->nHeight);.  }e
7000: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
7010: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
7020: 65 2d 3e 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20  e->db, pLeft);. 
7030: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
7040: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7050: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20   pRight);.  }.  
7060: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
7070: 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74 20 74  ** Add pSelect t
7080: 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70 53 65  o the Expr.x.pSe
7090: 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c  lect field.  Or,
70a0: 20 69 66 20 70 45 78 70 72 20 69 73 20 4e 55 4c   if pExpr is NUL
70b0: 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d  L (due.** do a m
70c0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
70d0: 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e 20 64   failure) then d
70e0: 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c 65 63  elete the pSelec
70f0: 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69  t object..*/.voi
7100: 64 20 73 71 6c 69 74 65 33 50 45 78 70 72 41 64  d sqlite3PExprAd
7110: 64 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  dSelect(Parse *p
7120: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7130: 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  pr, Select *pSel
7140: 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70  ect){.  if( pExp
7150: 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  r ){.    pExpr->
7160: 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  x.pSelect = pSel
7170: 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ect;.    ExprSet
7180: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
7190: 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50 5f  EP_xIsSelect|EP_
71a0: 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 73  Subquery);.    s
71b0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
71c0: 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72  ghtAndFlags(pPar
71d0: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 65  se, pExpr);.  }e
71e0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
71f0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
7200: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
7210: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
7220: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7230: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d   pSelect);.  }.}
7240: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  .../*.** Join tw
7250: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
7260: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
7270: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
7280: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
7290: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
72a0: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
72b0: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
72c0: 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20  .** If one side 
72d0: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
72e0: 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e  the AND is known
72f0: 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68   to be false, th
7300: 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  en instead.** of
7310: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e   returning an AN
7320: 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75  D expression, ju
7330: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73  st return a cons
7340: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
7350: 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20  with.** a value 
7360: 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70  of false..*/.Exp
7370: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e  r *sqlite3ExprAn
7380: 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
7390: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
73a0: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 73  pr *pRight){.  s
73b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
73c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
73d0: 4c 65 66 74 3d 3d 30 20 20 29 7b 0a 20 20 20 20  Left==0  ){.    
73e0: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
73f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
7400: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
7410: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
7420: 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73  e if( ExprAlways
7430: 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20  False(pLeft) || 
7440: 45 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  ExprAlwaysFalse(
7450: 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73  pRight) ){.    s
7460: 71 6c 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41  qlite3ExprUnmapA
7470: 6e 64 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c  ndDelete(pParse,
7480: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c   pLeft);.    sql
7490: 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41 6e 64  ite3ExprUnmapAnd
74a0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70  Delete(pParse, p
74b0: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
74c0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
74d0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
74e0: 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
74f0: 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20  okens[0], 0);.  
7500: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
7510: 6e 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  n sqlite3PExpr(p
7520: 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 70  Parse, TK_AND, p
7530: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
7540: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
7550: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
7560: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
7570: 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  a function with 
7580: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75  multiple.** argu
7590: 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ments..*/.Expr *
75a0: 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74  sqlite3ExprFunct
75b0: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
75c0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
75d0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
75e0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
75f0: 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 41 72  List,      /* Ar
7600: 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20  gument list */. 
7610: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20   Token *pToken, 
7620: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
7630: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  f the function *
7640: 2f 0a 20 20 69 6e 74 20 65 44 69 73 74 69 6e 63  /.  int eDistinc
7650: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 46 5f  t         /* SF_
7660: 44 69 73 74 69 6e 63 74 20 6f 72 20 53 46 5f 41  Distinct or SF_A
7670: 4c 4c 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20 20  LL or 0 */.){.  
7680: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71  Expr *pNew;.  sq
7690: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
76a0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
76b0: 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e  ( pToken );.  pN
76c0: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
76d0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e  Alloc(db, TK_FUN
76e0: 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31  CTION, pToken, 1
76f0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
7700: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
7710: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
7720: 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f  , pList); /* Avo
7730: 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77  id memory leak w
7740: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
7750: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
7760: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
7770: 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 45 78 70  t && pList->nExp
7780: 72 20 3e 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  r > pParse->db->
7790: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
77a0: 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MIT_FUNCTION_ARG
77b0: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
77c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
77d0: 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75 6d   "too many argum
77e0: 65 6e 74 73 20 6f 6e 20 66 75 6e 63 74 69 6f 6e  ents on function
77f0: 20 25 54 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20   %T", pToken);. 
7800: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
7810: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45 78  st = pList;.  Ex
7820: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e  prSetProperty(pN
7830: 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29 3b  ew, EP_HasFunc);
7840: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
7850: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
7860: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
7870: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
7880: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
7890: 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b  s(pParse, pNew);
78a0: 0a 20 20 69 66 28 20 65 44 69 73 74 69 6e 63 74  .  if( eDistinct
78b0: 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  ==SF_Distinct ) 
78c0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
78d0: 70 4e 65 77 2c 20 45 50 5f 44 69 73 74 69 6e 63  pNew, EP_Distinc
78e0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  t);.  return pNe
78f0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
7900: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
7910: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
7920: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
7930: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
7940: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
7950: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
7960: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
7970: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
7980: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
7990: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
79a0: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
79b0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
79c0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
79d0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
79e0: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
79f0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
7a00: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
7a10: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
7a20: 74 20 74 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f  t too big to avo
7a30: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
7a40: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
7a50: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
7a60: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
7a70: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
7a80: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
7a90: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
7aa0: 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61  rm ":aaa", "@aaa
7ab0: 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65  ", or "$aaa" are
7ac0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61   assigned the sa
7ad0: 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20  me number.** as 
7ae0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73  the previous ins
7af0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  tance of the sam
7b00: 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20  e wildcard.  Or 
7b10: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
7b20: 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65  irst.** instance
7b30: 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64   of the wildcard
7b40: 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  , the next seque
7b50: 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  ntial variable n
7b60: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
7b70: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
7b80: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
7b90: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
7ba0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
7bb0: 78 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73  xpr, u32 n){.  s
7bc0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7bd0: 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74  rse->db;.  const
7be0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61   char *z;.  ynVa
7bf0: 72 20 78 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  r x;..  if( pExp
7c00: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
7c10: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
7c20: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
7c30: 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f   EP_IntValue|EP_
7c40: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
7c50: 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70  Only) );.  z = p
7c60: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
7c70: 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
7c80: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d  ;.  assert( z[0]
7c90: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7ca0: 20 6e 3d 3d 28 75 33 32 29 73 71 6c 69 74 65 33   n==(u32)sqlite3
7cb0: 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20  Strlen30(z) );. 
7cc0: 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a   if( z[1]==0 ){.
7cd0: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
7ce0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e  of the form "?".
7cf0: 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78    Assign the nex
7d00: 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  t variable numbe
7d10: 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  r */.    assert(
7d20: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20   z[0]=='?' );.  
7d30: 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b    x = (ynVar)(++
7d40: 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20  pParse->nVar);. 
7d50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
7d60: 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20 20 69  doAdd = 0;.    i
7d70: 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[0]=='?' ){.
7d80: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
7d90: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
7da0: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
7db0: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
7dc0: 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  er and.      ** 
7dd0: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
7de0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
7df0: 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20  .      i64 i;.  
7e00: 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20      int bOk;.   
7e10: 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f     if( n==2 ){ /
7e20: 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46  *OPTIMIZATION-IF
7e30: 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 20 20  -TRUE*/.        
7e40: 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f  i = z[1]-'0';  /
7e50: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
7e60: 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73 69  e of ?N for a si
7e70: 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a  ngle digit N */.
7e80: 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b          bOk = 1;
7e90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7ea0: 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73        bOk = 0==s
7eb0: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b  qlite3Atoi64(&z[
7ec0: 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c  1], &i, n-1, SQL
7ed0: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
7ee0: 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
7ef0: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( i==0 );.     
7f00: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20   testcase( i==1 
7f10: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7f20: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
7f30: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7f40: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31  RIABLE_NUMBER]-1
7f50: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7f60: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
7f70: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7f80: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
7f90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b  );.      if( bOk
7fa0: 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e  ==0 || i<1 || i>
7fb0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7fc0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
7fd0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
7fe0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7ff0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
8000: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
8010: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
8020: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
8030: 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74        db->aLimit
8040: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
8050: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b  RIABLE_NUMBER]);
8060: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
8070: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 78  .      }.      x
8080: 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20   = (ynVar)i;.   
8090: 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d     if( x>pParse-
80a0: 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20  >nVar ){.       
80b0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
80c0: 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20 20 20  (int)x;.        
80d0: 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20  doAdd = 1;.     
80e0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
80f0: 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65  e3VListNumToName
8100: 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c  (pParse->pVList,
8110: 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   x)==0 ){.      
8120: 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20    doAdd = 1;.   
8130: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
8140: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
8150: 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20  ds like ":aaa", 
8160: 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61 22  "$aaa" or "@aaa"
8170: 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d  .  Reuse the sam
8180: 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20  e variable.     
8190: 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68   ** number as th
81a0: 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e  e prior appearan
81b0: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ce of the same n
81c0: 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e  ame, or if the n
81d0: 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ame.      ** has
81e0: 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20   never appeared 
81f0: 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68  before, reuse th
8200: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20  e same variable 
8210: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a  number.      */.
8220: 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72        x = (ynVar
8230: 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d  )sqlite3VListNam
8240: 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70  eToNum(pParse->p
8250: 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20  VList, z, n);.  
8260: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a      if( x==0 ){.
8270: 20 20 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56          x = (ynV
8280: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
8290: 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64 6f 41  ar);.        doA
82a0: 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  dd = 1;.      }.
82b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f      }.    if( do
82c0: 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Add ){.      pPa
82d0: 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71  rse->pVList = sq
82e0: 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28 64 62  lite3VListAdd(db
82f0: 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  , pParse->pVList
8300: 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20  , z, n, x);.    
8310: 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69  }.  }.  pExpr->i
8320: 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66  Column = x;.  if
8330: 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  ( x>db->aLimit[S
8340: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8350: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
8360: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8370: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
8380: 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62   many SQL variab
8390: 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  les");.  }.}../*
83a0: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
83b0: 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73  delete an expres
83c0: 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74  sion tree..*/.st
83d0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
83e0: 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65  LINE void sqlite
83f0: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71  3ExprDeleteNN(sq
8400: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
8410: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
8420: 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69  !=0 );.  /* Sani
8430: 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74  ty check: Assert
8440: 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c   that the IntVal
8450: 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  ue is non-negati
8460: 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  ve if it exists 
8470: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  */.  assert( !Ex
8480: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8490: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
84a0: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20   p->u.iValue>=0 
84b0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45  );..  assert( !E
84c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
84d0: 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 7c 7c  , EP_WinFunc) ||
84e0: 20 70 2d 3e 79 2e 70 57 69 6e 21 3d 30 20 7c 7c   p->y.pWin!=0 ||
84f0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
8500: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  d );.  assert( p
8510: 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op!=TK_FUNCTIO
8520: 4e 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  N || ExprHasProp
8530: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
8540: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
8550: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d  .          || p-
8560: 3e 79 2e 70 57 69 6e 3d 3d 30 20 7c 7c 20 45 78  >y.pWin==0 || Ex
8570: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8580: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a   EP_WinFunc) );.
8590: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
85a0: 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48 61  BUG.  if( ExprHa
85b0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
85c0: 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48 61  Leaf) && !ExprHa
85d0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
85e0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
85f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 65    assert( p->pLe
8600: 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ft==0 );.    ass
8610: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
8620: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8630: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30   p->x.pSelect==0
8640: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
8650: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
8660: 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f 6b  perty(p, (EP_Tok
8670: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29  enOnly|EP_Leaf))
8680: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45   ){.    /* The E
8690: 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e  xpr.x union is n
86a0: 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65  ever used at the
86b0: 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78   same time as Ex
86c0: 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20  pr.pRight */.   
86d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c   assert( p->x.pL
86e0: 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ist==0 || p->pRi
86f0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
8700: 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70 2d  ( p->pLeft && p-
8710: 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op!=TK_SELECT_C
8720: 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33 45  OLUMN ) sqlite3E
8730: 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20  xprDeleteNN(db, 
8740: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  p->pLeft);.    i
8750: 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a  f( p->pRight ){.
8760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8770: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 2d  rDeleteNN(db, p-
8780: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 65  >pRight);.    }e
8790: 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50  lse if( ExprHasP
87a0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
87b0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
87c0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
87d0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
87e0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c  Select);.    }el
87f0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
8800: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
8810: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  db, p->x.pList);
8820: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 45  .    }.    if( E
8830: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8840: 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b  , EP_WinFunc) ){
8850: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8860: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
8870: 4e 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  N );.      sqlit
8880: 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 64  e3WindowDelete(d
8890: 62 2c 20 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20  b, p->y.pWin);. 
88a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 45     }.  }.  if( E
88b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
88c0: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
88d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
88e0: 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  b, p->u.zToken);
88f0: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
8900: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 74  roperty(p, EP_St
8910: 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71 6c  atic) ){.    sql
8920: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
8930: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20   p);.  }.}.void 
8940: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8950: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
8960: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
8970: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65   ) sqlite3ExprDe
8980: 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d  leteNN(db, p);.}
8990: 0a 0a 2f 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69  ../* Invoke sqli
89a0: 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d  te3RenameExprUnm
89b0: 61 70 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  ap() and sqlite3
89c0: 45 78 70 72 44 65 6c 65 74 65 28 29 20 6f 6e 20  ExprDelete() on 
89d0: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
89e0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
89f0: 65 33 45 78 70 72 55 6e 6d 61 70 41 6e 64 44 65  e3ExprUnmapAndDe
8a00: 6c 65 74 65 28 50 61 72 73 65 20 2a 70 50 61 72  lete(Parse *pPar
8a10: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
8a20: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
8a30: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
8a40: 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
8a50: 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61  e3RenameExprUnma
8a60: 70 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  p(pParse, p);.  
8a70: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
8a80: 78 70 72 44 65 6c 65 74 65 4e 4e 28 70 50 61 72  xprDeleteNN(pPar
8a90: 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  se->db, p);.  }.
8aa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8ab0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
8ac0: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
8ad0: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
8ae0: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70   structure .** p
8af0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
8b00: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  st argument. Thi
8b10: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
8b20: 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  of EXPR_FULLSIZE
8b30: 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45  ,.** EXPR_REDUCE
8b40: 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f  DSIZE or EXPR_TO
8b50: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a  KENONLYSIZE..*/.
8b60: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
8b70: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
8b80: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
8b90: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8ba0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74  TokenOnly) ) ret
8bb0: 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  urn EXPR_TOKENON
8bc0: 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78  LYSIZE;.  if( Ex
8bd0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8be0: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72   EP_Reduced) ) r
8bf0: 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43  eturn EXPR_REDUC
8c00: 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  EDSIZE;.  return
8c10: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
8c20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
8c30: 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
8c40: 6e 74 20 6f 66 20 61 6e 20 45 78 70 72 20 6e 6f  nt of an Expr no
8c50: 64 65 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  de, taking care 
8c60: 6e 6f 74 20 74 6f 20 72 65 61 64 0a 2a 2a 20 70  not to read.** p
8c70: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
8c80: 68 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  he structure for
8c90: 20 61 20 72 65 64 75 63 65 64 2d 73 69 7a 65 20   a reduced-size 
8ca0: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  version of the s
8cb0: 6f 75 72 63 65 0a 2a 2a 20 45 78 70 72 2e 0a 2a  ource.** Expr..*
8cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
8cd0: 70 72 4e 6f 64 65 43 6f 70 79 28 45 78 70 72 20  prNodeCopy(Expr 
8ce0: 2a 70 44 65 73 74 2c 20 45 78 70 72 20 2a 70 53  *pDest, Expr *pS
8cf0: 72 63 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 44  rc){.  memset(pD
8d00: 65 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  est, 0, sizeof(E
8d10: 78 70 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28  xpr));.  memcpy(
8d20: 70 44 65 73 74 2c 20 70 53 72 63 2c 20 65 78 70  pDest, pSrc, exp
8d30: 72 53 74 72 75 63 74 53 69 7a 65 28 70 53 72 63  rStructSize(pSrc
8d40: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ));.}../*.** The
8d50: 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28   dupedExpr*Size(
8d60: 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20  ) routines each 
8d70: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
8d80: 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
8d90: 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  red.** to store 
8da0: 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70  a copy of an exp
8db0: 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65  ression or expre
8dc0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65  ssion tree.  The
8dd0: 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68  y differ in.** h
8de0: 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74  ow much of the t
8df0: 72 65 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e  ree is measured.
8e00: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  .**.**     duped
8e10: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29  ExprStructSize()
8e20: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c       Size of onl
8e30: 79 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  y the Expr struc
8e40: 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70  ture .**     dup
8e50: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29  edExprNodeSize()
8e60: 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45         Size of E
8e70: 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20  xpr + space for 
8e80: 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70  token.**     dup
8e90: 65 64 45 78 70 72 53 69 7a 65 28 29 20 20 20 20  edExprSize()    
8ea0: 20 20 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f         Expr + to
8eb0: 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f  ken + subtree co
8ec0: 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a  mponents.**.****
8ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f10: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
8f20: 65 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  e dupedExprStruc
8f30: 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e  tSize() function
8f40: 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c   returns two val
8f50: 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68  ues OR-ed togeth
8f60: 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65  er:  .** (1) the
8f70: 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
8f80: 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68  for a copy of th
8f90: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
8fa0: 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32   only and .** (2
8fb0: 29 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61  ) the EP_xxx fla
8fc0: 67 73 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  gs that indicate
8fd0: 20 77 68 61 74 20 74 68 65 20 73 74 72 75 63 74   what the struct
8fe0: 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20  ure size should 
8ff0: 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  be..** The retur
9000: 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61  n values is alwa
9010: 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a  ys one of:.**.**
9020: 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53        EXPR_FULLS
9030: 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  IZE.**      EXPR
9040: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c  _REDUCEDSIZE   |
9050: 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20   EP_Reduced.**  
9060: 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e      EXPR_TOKENON
9070: 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65  LYSIZE | EP_Toke
9080: 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nOnly.**.** The 
9090: 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75  size of the stru
90a0: 63 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75  cture can be fou
90b0: 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68  nd by masking th
90c0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
90d0: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
90e0: 65 20 77 69 74 68 20 30 78 66 66 66 2e 20 20 54  e with 0xfff.  T
90f0: 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20  he flags can be 
9100: 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67  found by masking
9110: 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   the.** return v
9120: 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65 64  alue with EP_Red
9130: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
9140: 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  y..**.** Note th
9150: 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45  at with flags==E
9160: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74  XPRDUP_REDUCE, t
9170: 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72  his routines wor
9180: 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a  ks on full-size.
9190: 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20 45  ** (unreduced) E
91a0: 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74  xpr objects as t
91b0: 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c  hey or originall
91c0: 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  y constructed by
91d0: 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20   the parser..** 
91e0: 44 75 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f  During expressio
91f0: 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72  n analysis, extr
9200: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  a information is
9210: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f   computed and mo
9220: 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65  ved into.** late
9230: 72 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 45  r parts of the E
9240: 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74  xpr object and t
9250: 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  hat extra inform
9260: 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20  ation might get 
9270: 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69  chopped.** off i
9280: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9290: 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f   is reduced.  No
92a0: 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20  te also that it 
92b0: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f  does not work to
92c0: 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52  .** make an EXPR
92d0: 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20  DUP_REDUCE copy 
92e0: 6f 66 20 61 20 72 65 64 75 63 65 64 20 65 78 70  of a reduced exp
92f0: 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20  ression.  It is 
9300: 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f  only legal.** to
9310: 20 72 65 64 75 63 65 20 61 20 70 72 69 73 74 69   reduce a pristi
9320: 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ne expression tr
9330: 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73  ee from the pars
9340: 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65  er.  The impleme
9350: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75  ntation.** of du
9360: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
9370: 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74  e() contain mult
9380: 69 70 6c 65 20 61 73 73 65 72 74 28 29 20 73 74  iple assert() st
9390: 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74  atements that at
93a0: 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f  tempt.** to enfo
93b0: 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61  rce this constra
93c0: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
93d0: 6e 74 20 64 75 70 65 64 45 78 70 72 53 74 72 75  nt dupedExprStru
93e0: 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  ctSize(Expr *p, 
93f0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
9400: 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  t nSize;.  asser
9410: 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  t( flags==EXPRDU
9420: 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67  P_REDUCE || flag
9430: 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20  s==0 ); /* Only 
9440: 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61  one flag value a
9450: 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65  llowed */.  asse
9460: 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  rt( EXPR_FULLSIZ
9470: 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73  E<=0xfff );.  as
9480: 73 65 72 74 28 20 28 30 78 66 66 66 20 26 20 28  sert( (0xfff & (
9490: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
94a0: 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a  kenOnly))==0 );.
94b0: 20 20 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c    if( 0==flags |
94c0: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  | p->op==TK_SELE
94d0: 43 54 5f 43 4f 4c 55 4d 4e 20 0a 23 69 66 6e 64  CT_COLUMN .#ifnd
94e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
94f0: 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 7c 7c 20  INDOWFUNC.   || 
9500: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9510: 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 0a 23  p, EP_WinFunc).#
9520: 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 6e  endif.  ){.    n
9530: 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c  Size = EXPR_FULL
9540: 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  SIZE;.  }else{. 
9550: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9560: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9570: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
9580: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
9590: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
95a0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
95b0: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
95c0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
95d0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
95e0: 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20  emToken) );.    
95f0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9600: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
9610: 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20  oReduce) );.    
9620: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20  if( p->pLeft || 
9630: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
9640: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
9650: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45  _REDUCEDSIZE | E
9660: 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d  P_Reduced;.    }
9670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
9680: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
9690: 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   );.      nSize 
96a0: 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  = EXPR_TOKENONLY
96b0: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
96c0: 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nly;.    }.  }. 
96d0: 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d   return nSize;.}
96e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
96f0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
9700: 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  e space in bytes
9710: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
9720: 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20  re the copy .** 
9730: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
9740: 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79  cture and a copy
9750: 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a   of the Expr.u.z
9760: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
9770: 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20   that.** string 
9780: 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a  is defined.).*/.
9790: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
97a0: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70  ExprNodeSize(Exp
97b0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
97c0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
97d0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
97e0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20  ize(p, flags) & 
97f0: 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78  0xfff;.  if( !Ex
9800: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9810: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
9820: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
9830: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
9840: 69 74 65 33 53 74 72 6c 65 6e 33 30 4e 4e 28 70  ite3Strlen30NN(p
9850: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20  ->u.zToken)+1;. 
9860: 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e   }.  return ROUN
9870: 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a  D8(nByte);.}../*
9880: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
9890: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
98a0: 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74  equired to creat
98b0: 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  e a duplicate of
98c0: 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73   the .** express
98d0: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
98e0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
98f0: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
9900: 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61  ument is a.** ma
9910: 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58  sk containing EX
9920: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
9930: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
9940: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
9950: 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65 61  es space to crea
9960: 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  te a copy of the
9970: 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20   Expr struct.** 
9980: 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62  itself and the b
9990: 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20 74  uffer referred t
99a0: 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  o by Expr.u.zTok
99b0: 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a  en, if any..**.*
99c0: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
99d0: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
99e0: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65  set, then the re
99f0: 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75  turn value inclu
9a00: 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f  des .** space to
9a10: 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45   duplicate all E
9a20: 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65  xpr nodes in the
9a30: 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20   tree formed by 
9a40: 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61  Expr.pLeft .** a
9a50: 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20 76  nd Expr.pRight v
9a60: 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f  ariables (but no
9a70: 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74  t for any struct
9a80: 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  ures pointed to 
9a90: 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64  or .** descended
9aa0: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
9ab0: 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78  .pList or Expr.x
9ac0: 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c  .pSelect variabl
9ad0: 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  es)..*/.static i
9ae0: 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  nt dupedExprSize
9af0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
9b00: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
9b10: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  e = 0;.  if( p )
9b20: 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75  {.    nByte = du
9b30: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
9b40: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  p, flags);.    i
9b50: 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50  f( flags&EXPRDUP
9b60: 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20  _REDUCE ){.     
9b70: 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45   nByte += dupedE
9b80: 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74  xprSize(p->pLeft
9b90: 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64  , flags) + duped
9ba0: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67  ExprSize(p->pRig
9bb0: 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ht, flags);.    
9bc0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
9bd0: 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Byte;.}../*.** T
9be0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
9bf0: 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
9c00: 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78 63  e3ExprDup(), exc
9c10: 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42 75  ept that if pzBu
9c20: 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20  ffer .** is not 
9c30: 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66  NULL then *pzBuf
9c40: 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  fer is assumed t
9c50: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
9c60: 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  fer large enough
9c70: 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68   .** to store th
9c80: 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73  e copy of expres
9c90: 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69  sion p, the copi
9ca0: 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65  es of p->u.zToke
9cb0: 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61  n.** (if applica
9cc0: 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f  ble), and the co
9cd0: 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70  pies of the p->p
9ce0: 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67  Left and p->pRig
9cf0: 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  ht expressions,.
9d00: 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72  ** if any. Befor
9d10: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
9d20: 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f  Buffer is set to
9d30: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
9d40: 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74  past the.** port
9d50: 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65  ion of the buffe
9d60: 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79  r copied into by
9d70: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
9d80: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
9d90: 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  exprDup(sqlite3 
9da0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
9db0: 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a  t dupFlags, u8 *
9dc0: 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78  *pzBuffer){.  Ex
9dd0: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
9de0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
9df0: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a  return */.  u8 *
9e00: 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  zAlloc;         
9e10: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63    /* Memory spac
9e20: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
9e30: 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63  build Expr objec
9e40: 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69  t */.  u32 stati
9e50: 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  cFlag;       /* 
9e60: 45 50 5f 53 74 61 74 69 63 20 69 66 20 73 70 61  EP_Static if spa
9e70: 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  ce not obtained 
9e80: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a  from malloc */..
9e90: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
9ea0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  );.  assert( p )
9eb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75 70 46  ;.  assert( dupF
9ec0: 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c  lags==0 || dupFl
9ed0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
9ee0: 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UCE );.  assert(
9ef0: 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20   pzBuffer==0 || 
9f00: 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55  dupFlags==EXPRDU
9f10: 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f  P_REDUCE );..  /
9f20: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  * Figure out whe
9f30: 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
9f40: 6e 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75  new Expr structu
9f50: 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42  re. */.  if( pzB
9f60: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c  uffer ){.    zAl
9f70: 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b  loc = *pzBuffer;
9f80: 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20  .    staticFlag 
9f90: 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d  = EP_Static;.  }
9fa0: 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63  else{.    zAlloc
9fb0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
9fc0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65  ocRawNN(db, dupe
9fd0: 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70  dExprSize(p, dup
9fe0: 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61  Flags));.    sta
9ff0: 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d  ticFlag = 0;.  }
a000: 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20  .  pNew = (Expr 
a010: 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28  *)zAlloc;..  if(
a020: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20   pNew ){.    /* 
a030: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
a040: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
a050: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
a060: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
a070: 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20      ** by pNew. 
a080: 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45  This is either E
a090: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58  XPR_FULLSIZE, EX
a0a0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
a0b0: 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f  r.    ** EXPR_TO
a0c0: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f  KENONLYSIZE. nTo
a0d0: 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  ken is set to th
a0e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
a0f0: 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a  s consumed.    *
a100: 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66  * by the copy of
a110: 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e   the p->u.zToken
a120: 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29   string (if any)
a130: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e  ..    */.    con
a140: 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72  st unsigned nStr
a150: 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45  uctSize = dupedE
a160: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
a170: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a180: 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69  const int nNewSi
a190: 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  ze = nStructSize
a1a0: 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e   & 0xfff;.    in
a1b0: 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66  t nToken;.    if
a1c0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a1d0: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
a1e0: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
a1f0: 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65  n ){.      nToke
a200: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
a210: 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  n30(p->u.zToken)
a220: 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   + 1;.    }else{
a230: 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20  .      nToken = 
a240: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
a250: 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20   dupFlags ){.   
a260: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
a270: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
a280: 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a  _Reduced)==0 );.
a290: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
a2a0: 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65  loc, p, nNewSize
a2b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a2c0: 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20      u32 nSize = 
a2d0: 28 75 33 32 29 65 78 70 72 53 74 72 75 63 74 53  (u32)exprStructS
a2e0: 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65  ize(p);.      me
a2f0: 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20  mcpy(zAlloc, p, 
a300: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  nSize);.      if
a310: 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c  ( nSize<EXPR_FUL
a320: 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20  LSIZE ){ .      
a330: 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63    memset(&zAlloc
a340: 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52  [nSize], 0, EXPR
a350: 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29  _FULLSIZE-nSize)
a360: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a370: 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
a380: 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54  EP_Reduced, EP_T
a390: 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50  okenOnly, and EP
a3a0: 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70  _Static flags ap
a3b0: 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a  propriately. */.
a3c0: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
a3d0: 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c  &= ~(EP_Reduced|
a3e0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
a3f0: 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b  Static|EP_MemTok
a400: 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66  en);.    pNew->f
a410: 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53  lags |= nStructS
a420: 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65  ize & (EP_Reduce
a430: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b  d|EP_TokenOnly);
a440: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
a450: 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a   |= staticFlag;.
a460: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
a470: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72   p->u.zToken str
a480: 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  ing, if any. */.
a490: 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29      if( nToken )
a4a0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
a4b0: 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a  oken = pNew->u.z
a4c0: 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26  Token = (char*)&
a4d0: 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d  zAlloc[nNewSize]
a4e0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
a4f0: 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  Token, p->u.zTok
a500: 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
a510: 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28   }..    if( 0==(
a520: 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e  (p->flags|pNew->
a530: 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f 6b  flags) & (EP_Tok
a540: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29  enOnly|EP_Leaf))
a550: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c   ){.      /* Fil
a560: 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78  l in the pNew->x
a570: 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77  .pSelect or pNew
a580: 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72  ->x.pList member
a590: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45  . */.      if( E
a5a0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a5b0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
a5c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
a5d0: 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  >x.pSelect = sql
a5e0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
a5f0: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  , p->x.pSelect, 
a600: 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  dupFlags);.     
a610: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a620: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20  pNew->x.pList = 
a630: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
a640: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73  up(db, p->x.pLis
a650: 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  t, dupFlags);.  
a660: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a670: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77   /* Fill in pNew
a680: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77  ->pLeft and pNew
a690: 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20  ->pRight. */.   
a6a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
a6b0: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65  erty(pNew, EP_Re
a6c0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
a6d0: 6c 79 7c 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  ly|EP_WinFunc) )
a6e0: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b  {.      zAlloc +
a6f0: 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53  = dupedExprNodeS
a700: 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29  ize(p, dupFlags)
a710: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70  ;.      if( !Exp
a720: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
a730: 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  w, EP_TokenOnly|
a740: 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  EP_Leaf) ){.    
a750: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
a760: 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a 20 20 20  = p->pLeft ?.   
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20 70     exprDup(db, p
a790: 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50  ->pLeft, EXPRDUP
a7a0: 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63  _REDUCE, &zAlloc
a7b0: 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 70  ) : 0;.        p
a7c0: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 2d  New->pRight = p-
a7d0: 3e 70 52 69 67 68 74 20 3f 0a 20 20 20 20 20 20  >pRight ?.      
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7f0: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
a800: 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f  pRight, EXPRDUP_
a810: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
a820: 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   : 0;.      }.#i
a830: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a840: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
a850: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
a860: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e  operty(p, EP_Win
a870: 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
a880: 20 70 4e 65 77 2d 3e 79 2e 70 57 69 6e 20 3d 20   pNew->y.pWin = 
a890: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75 70  sqlite3WindowDup
a8a0: 28 64 62 2c 20 70 4e 65 77 2c 20 70 2d 3e 79 2e  (db, pNew, p->y.
a8b0: 70 57 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  pWin);.        a
a8c0: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
a8d0: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
a8e0: 57 69 6e 46 75 6e 63 29 20 29 3b 0a 20 20 20 20  WinFunc) );.    
a8f0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
a900: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
a910: 46 55 4e 43 20 2a 2f 0a 20 20 20 20 20 20 69 66  FUNC */.      if
a920: 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20  ( pzBuffer ){.  
a930: 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20        *pzBuffer 
a940: 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  = zAlloc;.      
a950: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
a960: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
a970: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
a980: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
a990: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
a9a0: 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  pNew->op==TK_SEL
a9b0: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  ECT_COLUMN ){.  
a9c0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
a9d0: 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a  eft = p->pLeft;.
a9e0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
a9f0: 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20  ( p->iColumn==0 
aa00: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  || p->pRight==0 
aa10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
aa20: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
aa30: 30 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d  0  || p->pRight=
aa40: 3d 70 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20  =p->pLeft );.   
aa50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aa60: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66        pNew->pLef
aa70: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
aa80: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c  up(db, p->pLeft,
aa90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
aaa0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
aab0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
aac0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
aad0: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ht, 0);.      }.
aae0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
aaf0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
ab00: 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74  * Create and ret
ab10: 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20  urn a deep copy 
ab20: 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61  of the object pa
ab30: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
ab40: 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  nd .** argument.
ab50: 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69   If an OOM condi
ab60: 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65  tion is encounte
ab70: 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  red, NULL is ret
ab80: 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  urned.** and the
ab90: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
aba0: 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23  d flag set..*/.#
abb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
abc0: 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69  IT_CTE.static Wi
abd0: 74 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69  th *withDup(sqli
abe0: 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70  te3 *db, With *p
abf0: 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20  ){.  With *pRet 
ac00: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
ac10: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
ac20: 34 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  4 nByte = sizeof
ac30: 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d  (*p) + sizeof(p-
ac40: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74  >a[0]) * (p->nCt
ac50: 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d  e-1);.    pRet =
ac60: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
ac70: 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
ac80: 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b  .    if( pRet ){
ac90: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
aca0: 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d      pRet->nCte =
acb0: 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20   p->nCte;.      
acc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
acd0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
ace0: 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65    pRet->a[i].pSe
acf0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
ad00: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61  lectDup(db, p->a
ad10: 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b  [i].pSelect, 0);
ad20: 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61  .        pRet->a
ad30: 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69  [i].pCols = sqli
ad40: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
ad50: 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73  b, p->a[i].pCols
ad60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
ad70: 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  et->a[i].zName =
ad80: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
ad90: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  (db, p->a[i].zNa
ada0: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
adb0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
adc0: 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  pRet;.}.#else.# 
add0: 64 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78  define withDup(x
ade0: 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69  ,y) 0.#endif..#i
adf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ae00: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 2f 2a 0a  T_WINDOWFUNC./*.
ae10: 2a 2a 20 54 68 65 20 67 61 74 68 65 72 53 65 6c  ** The gatherSel
ae20: 65 63 74 57 69 6e 64 6f 77 73 28 29 20 70 72 6f  ectWindows() pro
ae30: 63 65 64 75 72 65 20 61 6e 64 20 69 74 73 20 68  cedure and its h
ae40: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 0a 2a 2a  elper routine.**
ae50: 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e   gatherSelectWin
ae60: 64 6f 77 73 43 61 6c 6c 62 61 63 6b 28 29 20 61  dowsCallback() a
ae70: 72 65 20 75 73 65 64 20 74 6f 20 73 63 61 6e 20  re used to scan 
ae80: 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69  all the expressi
ae90: 6f 6e 73 0a 2a 2a 20 61 6e 20 61 20 6e 65 77 6c  ons.** an a newl
aea0: 79 20 64 75 70 6c 69 63 61 74 65 64 20 53 45 4c  y duplicated SEL
aeb0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
aec0: 64 20 67 61 74 68 65 72 20 61 6c 6c 20 6f 66 20  d gather all of 
aed0: 74 68 65 20 57 69 6e 64 6f 77 0a 2a 2a 20 6f 62  the Window.** ob
aee0: 6a 65 63 74 73 20 66 6f 75 6e 64 20 74 68 65 72  jects found ther
aef0: 65 2c 20 61 73 73 65 6d 62 6c 69 6e 67 20 74 68  e, assembling th
af00: 65 6d 20 6f 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  em onto the link
af10: 65 64 20 6c 69 73 74 20 61 74 20 53 65 6c 65 63  ed list at Selec
af20: 74 2d 3e 70 57 69 6e 2e 0a 2a 2f 0a 73 74 61 74  t->pWin..*/.stat
af30: 69 63 20 69 6e 74 20 67 61 74 68 65 72 53 65 6c  ic int gatherSel
af40: 65 63 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62 61  ectWindowsCallba
af50: 63 6b 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ck(Walker *pWalk
af60: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
af70: 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
af80: 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26  p==TK_FUNCTION &
af90: 26 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 21  & pExpr->y.pWin!
afa0: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
afb0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
afc0: 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46  y(pExpr, EP_WinF
afd0: 75 6e 63 29 20 29 3b 0a 20 20 20 20 70 45 78 70  unc) );.    pExp
afe0: 72 2d 3e 79 2e 70 57 69 6e 2d 3e 70 4e 65 78 74  r->y.pWin->pNext
aff0: 57 69 6e 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  Win = pWalker->u
b000: 2e 70 53 65 6c 65 63 74 2d 3e 70 57 69 6e 3b 0a  .pSelect->pWin;.
b010: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70      pWalker->u.p
b020: 53 65 6c 65 63 74 2d 3e 70 57 69 6e 20 3d 20 70  Select->pWin = p
b030: 45 78 70 72 2d 3e 79 2e 70 57 69 6e 3b 0a 20 20  Expr->y.pWin;.  
b040: 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
b050: 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
b060: 63 20 69 6e 74 20 67 61 74 68 65 72 53 65 6c 65  c int gatherSele
b070: 63 74 57 69 6e 64 6f 77 73 53 65 6c 65 63 74 43  ctWindowsSelectC
b080: 61 6c 6c 62 61 63 6b 28 57 61 6c 6b 65 72 20 2a  allback(Walker *
b090: 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
b0a0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 3d  *p){.  return p=
b0b0: 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c  =pWalker->u.pSel
b0c0: 65 63 74 20 3f 20 57 52 43 5f 43 6f 6e 74 69 6e  ect ? WRC_Contin
b0d0: 75 65 20 3a 20 57 52 43 5f 50 72 75 6e 65 3b 0a  ue : WRC_Prune;.
b0e0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 61  }.static void ga
b0f0: 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77  therSelectWindow
b100: 73 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  s(Select *p){.  
b110: 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45  Walker w;.  w.xE
b120: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 67 61  xprCallback = ga
b130: 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77  therSelectWindow
b140: 73 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 77 2e 78  sCallback;.  w.x
b150: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
b160: 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e   gatherSelectWin
b170: 64 6f 77 73 53 65 6c 65 63 74 43 61 6c 6c 62 61  dowsSelectCallba
b180: 63 6b 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ck;.  w.xSelectC
b190: 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20  allback2 = 0;.  
b1a0: 77 2e 70 50 61 72 73 65 20 3d 20 30 3b 0a 20 20  w.pParse = 0;.  
b1b0: 77 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b  w.u.pSelect = p;
b1c0: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
b1d0: 6c 65 63 74 28 26 77 2c 20 70 29 3b 0a 7d 0a 23  lect(&w, p);.}.#
b1e0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
b1f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75  e following grou
b200: 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61  p of routines ma
b210: 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f  ke deep copies o
b220: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  f expressions,.*
b230: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
b240: 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e  ts, ID lists, an
b250: 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d select stateme
b260: 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73  nts.  The copies
b270: 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74   can.** be delet
b280: 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73  ed (by being pas
b290: 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73  sed to their res
b2a0: 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74  pective ...Delet
b2b0: 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a  e() routines).**
b2c0: 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69   without effecti
b2d0: 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73  ng the originals
b2e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ..**.** The expr
b2f0: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c  ession list, ID,
b300: 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74   and source list
b310: 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69  s return by sqli
b320: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29  te3ExprListDup()
b330: 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69  ,.** sqlite3IdLi
b340: 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c  stDup(), and sql
b350: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29  ite3SrcListDup()
b360: 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74   can not be furt
b370: 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a  her expanded .**
b380: 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
b390: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c  alls to sqlite*L
b3a0: 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74  istAppend() rout
b3b0: 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  ines..**.** Any 
b3c0: 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20  tables that the 
b3d0: 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f  SrcList might po
b3e0: 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64  int to are not d
b3f0: 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  uplicated..**.**
b400: 20 54 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   The flags param
b410: 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20  eter contains a 
b420: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74  combination of t
b430: 68 65 20 45 58 50 52 44 55 50 5f 58 58 58 20 66  he EXPRDUP_XXX f
b440: 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20  lags..** If the 
b450: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66  EXPRDUP_REDUCE f
b460: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
b470: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72   the structure r
b480: 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20  eturned is a.** 
b490: 74 72 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f  truncated versio
b4a0: 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45  n of the usual E
b4b0: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 74 68  xpr structure th
b4c0: 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65  at will be store
b4d0: 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20  d as.** part of 
b4e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
b4f0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
b500: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
b510: 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ema..*/.Expr *sq
b520: 6c 69 74 65 33 45 78 70 72 44 75 70 28 73 71 6c  lite3ExprDup(sql
b530: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
b540: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
b550: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
b560: 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52  0 || flags==EXPR
b570: 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20  DUP_REDUCE );.  
b580: 72 65 74 75 72 6e 20 70 20 3f 20 65 78 70 72 44  return p ? exprD
b590: 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c  up(db, p, flags,
b5a0: 20 30 29 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c   0) : 0;.}.ExprL
b5b0: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
b5c0: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
b5d0: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
b5e0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
b5f0: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
b600: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
b610: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a  t_item *pItem, *
b620: 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20  pOldItem;.  int 
b630: 69 3b 0a 20 20 45 78 70 72 20 2a 70 50 72 69 6f  i;.  Expr *pPrio
b640: 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20 30 3b 0a  rSelectCol = 0;.
b650: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
b660: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
b670: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
b680: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
b690: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 71 6c 69  ocRawNN(db, sqli
b6a0: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
b6b0: 64 62 2c 20 70 29 29 3b 0a 20 20 69 66 28 20 70  db, p));.  if( p
b6c0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
b6d0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72  0;.  pNew->nExpr
b6e0: 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70   = p->nExpr;.  p
b6f0: 49 74 65 6d 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a  Item = pNew->a;.
b700: 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e    pOldItem = p->
b710: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
b720: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
b730: 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d  Item++, pOldItem
b740: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
b750: 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74  OldExpr = pOldIt
b760: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 45  em->pExpr;.    E
b770: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
b780: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
b790: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
b7a0: 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66  (db, pOldExpr, f
b7b0: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lags);.    if( p
b7c0: 4f 6c 64 45 78 70 72 20 0a 20 20 20 20 20 26 26  OldExpr .     &&
b7d0: 20 70 4f 6c 64 45 78 70 72 2d 3e 6f 70 3d 3d 54   pOldExpr->op==T
b7e0: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a  K_SELECT_COLUMN.
b7f0: 20 20 20 20 20 26 26 20 28 70 4e 65 77 45 78 70       && (pNewExp
b800: 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  r = pItem->pExpr
b810: 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
b820: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45     assert( pNewE
b830: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20  xpr->iColumn==0 
b840: 7c 7c 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  || i>0 );.      
b850: 69 66 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43  if( pNewExpr->iC
b860: 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  olumn==0 ){.    
b870: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
b880: 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c  Expr->pLeft==pOl
b890: 64 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 3b  dExpr->pRight );
b8a0: 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 53  .        pPriorS
b8b0: 65 6c 65 63 74 43 6f 6c 20 3d 20 70 4e 65 77 45  electCol = pNewE
b8c0: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65  xpr->pLeft = pNe
b8d0: 77 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  wExpr->pRight;. 
b8e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b8f0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
b900: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
b910: 74 28 20 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78  t( pItem[-1].pEx
b920: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
b930: 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70   assert( pNewExp
b940: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65  r->iColumn==pIte
b950: 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  m[-1].pExpr->iCo
b960: 6c 75 6d 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20  lumn+1 );.      
b970: 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
b980: 53 65 6c 65 63 74 43 6f 6c 3d 3d 70 49 74 65 6d  SelectCol==pItem
b990: 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 70 4c 65 66  [-1].pExpr->pLef
b9a0: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  t );.        pNe
b9b0: 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70  wExpr->pLeft = p
b9c0: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3b 0a  PriorSelectCol;.
b9d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b9e0: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
b9f0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
ba00: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
ba10: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
ba20: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
ba30: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
ba40: 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a  ldItem->zSpan);.
ba50: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
ba60: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
ba70: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
ba80: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
ba90: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
baa0: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
bab0: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
bac0: 20 20 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65     pItem->bSorte
bad0: 72 52 65 66 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rRef = pOldItem-
bae0: 3e 62 53 6f 72 74 65 72 52 65 66 3b 0a 20 20 20  >bSorterRef;.   
baf0: 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64   pItem->u = pOld
bb00: 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72  Item->u;.  }.  r
bb10: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
bb20: 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c  *.** If cursors,
bb30: 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73   triggers, views
bb40: 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
bb50: 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20  are all omitted 
bb60: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c  from.** the buil
bb70: 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20  d, then none of 
bb80: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
bb90: 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66  utines, except f
bba0: 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65  or .** sqlite3Se
bbb0: 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62  lectDup(), can b
bbc0: 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65  e called. sqlite
bbd0: 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20  3SelectDup() is 
bbe0: 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c  sometimes.** cal
bbf0: 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  led with a NULL 
bc00: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  argument..*/.#if
bc10: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
bc20: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
bc30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
bc40: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20  MIT_TRIGGER) \. 
bc50: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
bc60: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
bc70: 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  ).SrcList *sqlit
bc80: 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c  e3SrcListDup(sql
bc90: 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
bca0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
bcb0: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  {.  SrcList *pNe
bcc0: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  w;.  int i;.  in
bcd0: 74 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72  t nByte;.  asser
bce0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
bcf0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
bd00: 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  0;.  nByte = siz
bd10: 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53  eof(*p) + (p->nS
bd20: 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d  rc>0 ? sizeof(p-
bd30: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72  >a[0]) * (p->nSr
bd40: 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65  c-1) : 0);.  pNe
bd50: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
bd60: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79  locRawNN(db, nBy
bd70: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  te );.  if( pNew
bd80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
bd90: 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70    pNew->nSrc = p
bda0: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
bdb0: 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >nSrc;.  for(i=0
bdc0: 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b  ; i<p->nSrc; i++
bdd0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
bde0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  cList_item *pNew
bdf0: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
be00: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
be10: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
be20: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
be30: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
be40: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
be50: 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49  >pSchema = pOldI
be60: 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  tem->pSchema;.  
be70: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74    pNewItem->zDat
be80: 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44  abase = sqlite3D
be90: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
bea0: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
beb0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
bec0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
bed0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
bee0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
bef0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69    pNewItem->zAli
bf00: 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  as = sqlite3DbSt
bf10: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
bf20: 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
bf30: 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70  pNewItem->fg = p
bf40: 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20  OldItem->fg;.   
bf50: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73   pNewItem->iCurs
bf60: 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  or = pOldItem->i
bf70: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77  Cursor;.    pNew
bf80: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
bf90: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64  b = pOldItem->ad
bfa0: 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70  drFillSub;.    p
bfb0: 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  NewItem->regRetu
bfc0: 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72  rn = pOldItem->r
bfd0: 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  egReturn;.    if
bfe0: 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69  ( pNewItem->fg.i
bff0: 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20  sIndexedBy ){.  
c000: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
c010: 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71  .zIndexedBy = sq
c020: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
c030: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a  , pOldItem->u1.z
c040: 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20  IndexedBy);.    
c050: 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  }.    pNewItem->
c060: 70 49 42 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49  pIBIndex = pOldI
c070: 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20  tem->pIBIndex;. 
c080: 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d     if( pNewItem-
c090: 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
c0a0: 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  .      pNewItem-
c0b0: 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a  >u1.pFuncArg = .
c0c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c0d0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
c0e0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46   pOldItem->u1.pF
c0f0: 75 6e 63 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a  uncArg, flags);.
c100: 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
c110: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
c120: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
c130: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
c140: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54  {.      pTab->nT
c150: 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20  abRef++;.    }. 
c160: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65     pNewItem->pSe
c170: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
c180: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  lectDup(db, pOld
c190: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66  Item->pSelect, f
c1a0: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lags);.    pNewI
c1b0: 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74  tem->pOn = sqlit
c1c0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
c1d0: 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61  ldItem->pOn, fla
c1e0: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  gs);.    pNewIte
c1f0: 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69  m->pUsing = sqli
c200: 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c  te3IdListDup(db,
c210: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e   pOldItem->pUsin
c220: 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  g);.    pNewItem
c230: 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64  ->colUsed = pOld
c240: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
c250: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
c260: 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  ;.}.IdList *sqli
c270: 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c  te3IdListDup(sql
c280: 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
c290: 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a   *p){.  IdList *
c2a0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
c2b0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
c2c0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
c2d0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
c2e0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c2f0: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
c300: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
c310: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
c320: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49  rn 0;.  pNew->nI
c330: 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e  d = p->nId;.  pN
c340: 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  ew->a = sqlite3D
c350: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
c360: 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70   p->nId*sizeof(p
c370: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
c380: 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20   pNew->a==0 ){. 
c390: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c3a0: 4e 4e 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  NN(db, pNew);.  
c3b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
c3c0: 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    /* Note that b
c3d0: 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65 20  ecause the size 
c3e0: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  of the allocatio
c3f0: 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20  n for p->a[] is 
c400: 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61  not.  ** necessa
c410: 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66 20  rily a power of 
c420: 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c 69  two, sqlite3IdLi
c430: 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20 6e  stAppend() may n
c440: 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a  ot be called.  *
c450: 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63 61  * on the duplica
c460: 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  te created by th
c470: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a  is function. */.
c480: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
c490: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
c4a0: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
c4b0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
c4c0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
c4d0: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
c4e0: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
c4f0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
c500: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
c510: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
c520: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
c530: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
c540: 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d  ->idx = pOldItem
c550: 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ->idx;.  }.  ret
c560: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
c570: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
c580: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
c590: 2c 20 53 65 6c 65 63 74 20 2a 70 44 75 70 2c 20  , Select *pDup, 
c5a0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65  int flags){.  Se
c5b0: 6c 65 63 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a  lect *pRet = 0;.
c5c0: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 78 74 20    Select *pNext 
c5d0: 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 2a  = 0;.  Select **
c5e0: 70 70 20 3d 20 26 70 52 65 74 3b 0a 20 20 53 65  pp = &pRet;.  Se
c5f0: 6c 65 63 74 20 2a 70 3b 0a 0a 20 20 61 73 73 65  lect *p;..  asse
c600: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 66  rt( db!=0 );.  f
c610: 6f 72 28 70 3d 70 44 75 70 3b 20 70 3b 20 70 3d  or(p=pDup; p; p=
c620: 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
c630: 53 65 6c 65 63 74 20 2a 70 4e 65 77 20 3d 20 73  Select *pNew = s
c640: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c650: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  wNN(db, sizeof(*
c660: 70 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  p) );.    if( pN
c670: 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ew==0 ) break;. 
c680: 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20     pNew->pEList 
c690: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
c6a0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
c6b0: 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  st, flags);.    
c6c0: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
c6d0: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64  ite3SrcListDup(d
c6e0: 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67  b, p->pSrc, flag
c6f0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57  s);.    pNew->pW
c700: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
c710: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68  prDup(db, p->pWh
c720: 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ere, flags);.   
c730: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
c740: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
c750: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f  tDup(db, p->pGro
c760: 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  upBy, flags);.  
c770: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
c780: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c790: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
c7a0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c7b0: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
c7c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c7d0: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
c7e0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c7f0: 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  ew->op = p->op;.
c800: 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
c810: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 70 4e 65  = pNext;.    pNe
c820: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  w->pPrior = 0;. 
c830: 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20     pNew->pLimit 
c840: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c850: 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  (db, p->pLimit, 
c860: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c870: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
c880: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
c890: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73  = 0;.    pNew->s
c8a0: 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
c8b0: 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73  Flags & ~SF_Uses
c8c0: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 70  Ephemeral;.    p
c8d0: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
c8e0: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70  m[0] = -1;.    p
c8f0: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
c900: 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70  m[1] = -1;.    p
c910: 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  New->nSelectRow 
c920: 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  = p->nSelectRow;
c930: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  .    pNew->pWith
c940: 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c 20 70   = withDup(db, p
c950: 2d 3e 70 57 69 74 68 29 3b 0a 23 69 66 6e 64 65  ->pWith);.#ifnde
c960: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
c970: 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 70 4e 65  NDOWFUNC.    pNe
c980: 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20  w->pWin = 0;.   
c990: 20 70 4e 65 77 2d 3e 70 57 69 6e 44 65 66 6e 20   pNew->pWinDefn 
c9a0: 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c  = sqlite3WindowL
c9b0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  istDup(db, p->pW
c9c0: 69 6e 44 65 66 6e 29 3b 0a 20 20 20 20 69 66 28  inDefn);.    if(
c9d0: 20 70 2d 3e 70 57 69 6e 20 29 20 67 61 74 68 65   p->pWin ) gathe
c9e0: 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 28 70  rSelectWindows(p
c9f0: 4e 65 77 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  New);.#endif.   
ca00: 20 70 4e 65 77 2d 3e 73 65 6c 49 64 20 3d 20 70   pNew->selId = p
ca10: 2d 3e 73 65 6c 49 64 3b 0a 20 20 20 20 2a 70 70  ->selId;.    *pp
ca20: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 70 20   = pNew;.    pp 
ca30: 3d 20 26 70 4e 65 77 2d 3e 70 50 72 69 6f 72 3b  = &pNew->pPrior;
ca40: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 4e 65  .    pNext = pNe
ca50: 77 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  w;.  }..  return
ca60: 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 53   pRet;.}.#else.S
ca70: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
ca80: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
ca90: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
caa0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
cab0: 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
cac0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
cad0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
cae0: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
caf0: 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78  the end of an ex
cb00: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
cb10: 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69  If pList is.** i
cb20: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
cb30: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
cb40: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
cb50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 4c 69 73  ..**.** The pLis
cb60: 74 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  t argument must 
cb70: 62 65 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f  be either NULL o
cb80: 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
cb90: 6e 20 45 78 70 72 4c 69 73 74 0a 2a 2a 20 6f 62  n ExprList.** ob
cba0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 70 72  tained from a pr
cbb0: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
cbc0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
cbd0: 64 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  d().  This routi
cbe0: 6e 65 0a 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65  ne.** may not be
cbf0: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 45 78   used with an Ex
cc00: 70 72 4c 69 73 74 20 6f 62 74 61 69 6e 65 64 20  prList obtained 
cc10: 66 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 70 72  from sqlite3Expr
cc20: 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a 20 52 65  ListDup()..** Re
cc30: 61 73 6f 6e 3a 20 20 54 68 69 73 20 72 6f 75 74  ason:  This rout
cc40: 69 6e 65 20 61 73 73 75 6d 65 73 20 74 68 61 74  ine assumes that
cc50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
cc60: 6c 6f 74 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61  lots in pList->a
cc70: 5b 5d 0a 2a 2a 20 69 73 20 61 20 70 6f 77 65 72  [].** is a power
cc80: 20 6f 66 20 74 77 6f 2e 20 20 54 68 61 74 20 69   of two.  That i
cc90: 73 20 74 72 75 65 20 66 6f 72 20 73 71 6c 69 74  s true for sqlit
cca0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
ccb0: 28 29 20 72 65 74 75 72 6e 73 0a 2a 2a 20 62 75  () returns.** bu
ccc0: 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
ccd0: 72 69 6c 79 20 74 72 75 65 20 66 72 6f 6d 20 74  rily true from t
cce0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
ccf0: 6f 66 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  of sqlite3ExprLi
cd00: 73 74 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  stDup()..**.** I
cd10: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
cd20: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
cd30: 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c  rs, the entire l
cd40: 69 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64  ist is freed and
cd50: 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  .** NULL is retu
cd60: 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55  rned.  If non-NU
cd70: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  LL is returned, 
cd80: 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
cd90: 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68  nteed.** that th
cda0: 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20  e new entry was 
cdb0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70  successfully app
cdc0: 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69  ended..*/.ExprLi
cdd0: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
cde0: 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72  istAppend(.  Par
cdf0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ce00: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
ce10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
ce20: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
ce30: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
ce40: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
ce50: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
ce60: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
ce80: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
ce90: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
cea0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
ceb0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
cec0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
ced0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
cee0: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
cef0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
cf00: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
cf10: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
cf20: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
cf30: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69  b, sizeof(ExprLi
cf40: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
cf50: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
cf60: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
cf70: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e    }.    pList->n
cf80: 45 78 70 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Expr = 0;.  }els
cf90: 65 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45  e if( (pList->nE
cfa0: 78 70 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45  xpr & (pList->nE
cfb0: 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20  xpr-1))==0 ){.  
cfc0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
cfd0: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
cfe0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
cff0: 2c 20 70 4c 69 73 74 2c 20 0a 20 20 20 20 20 20  , pList, .      
d000: 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74     sizeof(*pList
d010: 29 2b 28 32 2a 28 73 71 6c 69 74 65 33 5f 69 6e  )+(2*(sqlite3_in
d020: 74 36 34 29 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t64)pList->nExpr
d030: 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  -1)*sizeof(pList
d040: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
d050: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
d060: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
d070: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20      }.    pList 
d080: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49  = pNew;.  }.  pI
d090: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
d0a0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b  pList->nExpr++];
d0b0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
d0c0: 74 6f 66 28 73 74 72 75 63 74 20 45 78 70 72 4c  tof(struct ExprL
d0d0: 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29 3d  ist_item,zName)=
d0e0: 3d 73 69 7a 65 6f 66 28 70 49 74 65 6d 2d 3e 70  =sizeof(pItem->p
d0f0: 45 78 70 72 29 20 29 3b 0a 20 20 61 73 73 65 72  Expr) );.  asser
d100: 74 28 20 6f 66 66 73 65 74 6f 66 28 73 74 72 75  t( offsetof(stru
d110: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
d120: 2c 70 45 78 70 72 29 3d 3d 30 20 29 3b 0a 20 20  ,pExpr)==0 );.  
d130: 6d 65 6d 73 65 74 28 26 70 49 74 65 6d 2d 3e 7a  memset(&pItem->z
d140: 4e 61 6d 65 2c 30 2c 73 69 7a 65 6f 66 28 2a 70  Name,0,sizeof(*p
d150: 49 74 65 6d 29 2d 6f 66 66 73 65 74 6f 66 28 73  Item)-offsetof(s
d160: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
d170: 74 65 6d 2c 7a 4e 61 6d 65 29 29 3b 0a 20 20 70  tem,zName));.  p
d180: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
d190: 78 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  xpr;.  return pL
d1a0: 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20  ist;..no_mem:   
d1b0: 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65    .  /* Avoid le
d1c0: 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20  aking memory if 
d1d0: 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65  malloc has faile
d1e0: 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  d. */.  sqlite3E
d1f0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
d200: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  xpr);.  sqlite3E
d210: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
d220: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  , pList);.  retu
d230: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  rn 0;.}../*.** p
d240: 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78 70  Columns and pExp
d250: 72 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72 20  r form a vector 
d260: 61 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63 68  assignment which
d270: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
d280: 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 66  SET.** clause of
d290: 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65   an UPDATE state
d2a0: 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69 73  ment.  Like this
d2b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 28  :.**.**        (
d2c0: 61 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31 2c  a,b,c) = (expr1,
d2d0: 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 20  expr2,expr3).** 
d2e0: 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20 3d  Or:    (a,b,c) =
d2f0: 20 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20 46   (SELECT x,y,z F
d300: 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  ROM ....).**.** 
d310: 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66  For each term of
d320: 20 74 68 65 20 76 65 63 74 6f 72 20 61 73 73 69   the vector assi
d330: 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20 6e  gnment, append n
d340: 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68  ew entries to th
d350: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
d360: 6c 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e 20  list pList.  In 
d370: 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 73 75  the case of a su
d380: 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 52 48  bquery on the RH
d390: 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f  S, append.** TK_
d3a0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65 78  SELECT_COLUMN ex
d3b0: 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78  pressions..*/.Ex
d3c0: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
d3d0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65 63  xprListAppendVec
d3e0: 74 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tor(.  Parse *pP
d3f0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
d400: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d410: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
d420: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  pList,       /* 
d430: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
d440: 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62   append. Might b
d450: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69  e NULL */.  IdLi
d460: 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20 20  st *pColumns,   
d470: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61     /* List of na
d480: 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74 68  mes of LHS of th
d490: 65 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a  e assignment */.
d4a0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
d4b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74           /* Vect
d4c0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  or expression to
d4d0: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69   be appended. Mi
d4e0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
d4f0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
d500: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
d510: 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  int n;.  int i;.
d520: 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70    int iFirst = p
d530: 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
d540: 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70 43  xpr : 0;.  /* pC
d550: 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79 20  olumns can only 
d560: 62 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20 61  be NULL due to a
d570: 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f 4d  n OOM but an OOM
d580: 20 77 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a 20   will cause an. 
d590: 20 2a 2a 20 65 78 69 74 20 70 72 69 6f 72 20 74   ** exit prior t
d5a0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  o this routine b
d5b0: 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a  eing invoked */.
d5c0: 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 6f 6c    if( NEVER(pCol
d5d0: 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f 20  umns==0) ) goto 
d5e0: 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72  vector_append_er
d5f0: 72 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ror;.  if( pExpr
d600: 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74 6f  ==0 ) goto vecto
d610: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a  r_append_error;.
d620: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53  .  /* If the RHS
d630: 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20 74 68   is a vector, th
d640: 65 6e 20 77 65 20 63 61 6e 20 69 6d 6d 65 64 69  en we can immedi
d650: 61 74 65 6c 79 20 63 68 65 63 6b 20 74 6f 20 73  ately check to s
d660: 65 65 20 74 68 61 74 20 0a 20 20 2a 2a 20 74 68  ee that .  ** th
d670: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 52 48  e size of the RH
d680: 53 20 61 6e 64 20 4c 48 53 20 6d 61 74 63 68 2e  S and LHS match.
d690: 20 20 42 75 74 20 69 66 20 74 68 65 20 52 48 53    But if the RHS
d6a0: 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 0a 20   is a SELECT, . 
d6b0: 20 2a 2a 20 77 69 6c 64 63 61 72 64 73 20 28 22   ** wildcards ("
d6c0: 2a 22 29 20 69 6e 20 74 68 65 20 72 65 73 75 6c  *") in the resul
d6d0: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
d6e0: 45 43 54 20 6d 75 73 74 20 62 65 20 65 78 70 61  ECT must be expa
d6f0: 6e 64 65 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a  nded before.  **
d700: 20 77 65 20 63 61 6e 20 64 6f 20 74 68 65 20 73   we can do the s
d710: 69 7a 65 20 63 68 65 63 6b 2c 20 73 6f 20 64 65  ize check, so de
d720: 66 65 72 20 74 68 65 20 73 69 7a 65 20 63 68 65  fer the size che
d730: 63 6b 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65  ck until code ge
d740: 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  neration..  */. 
d750: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
d760: 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 43 6f  TK_SELECT && pCo
d770: 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d 28 6e 3d 73  lumns->nId!=(n=s
d780: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
d790: 53 69 7a 65 28 70 45 78 70 72 29 29 20 29 7b 0a  Size(pExpr)) ){.
d7a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d7b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20  Msg(pParse, "%d 
d7c0: 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64  columns assigned
d7d0: 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20   %d values",.   
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20   pColumns->nId, 
d800: 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65 63  n);.    goto vec
d810: 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72  tor_append_error
d820: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30  ;.  }..  for(i=0
d830: 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49  ; i<pColumns->nI
d840: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  d; i++){.    Exp
d850: 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20 73 71  r *pSubExpr = sq
d860: 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63 74  lite3ExprForVect
d870: 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65 2c 20  orField(pParse, 
d880: 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20 20 70  pExpr, i);.    p
d890: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
d8a0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
d8b0: 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53 75 62  rse, pList, pSub
d8c0: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
d8d0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73  List ){.      as
d8e0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
d8f0: 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31 20 29  pr==iFirst+i+1 )
d900: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ;.      pList->a
d910: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
d920: 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e  .zName = pColumn
d930: 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  s->a[i].zName;. 
d940: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61       pColumns->a
d950: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [i].zName = 0;. 
d960: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
d970: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
d980: 64 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  d && pExpr->op==
d990: 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 41 4c 57  TK_SELECT && ALW
d9a0: 41 59 53 28 70 4c 69 73 74 21 3d 30 29 20 29 7b  AYS(pList!=0) ){
d9b0: 0a 20 20 20 20 45 78 70 72 20 2a 70 46 69 72 73  .    Expr *pFirs
d9c0: 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69  t = pList->a[iFi
d9d0: 72 73 74 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  rst].pExpr;.    
d9e0: 61 73 73 65 72 74 28 20 70 46 69 72 73 74 21 3d  assert( pFirst!=
d9f0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
da00: 20 70 46 69 72 73 74 2d 3e 6f 70 3d 3d 54 4b 5f   pFirst->op==TK_
da10: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b  SELECT_COLUMN );
da20: 0a 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 74  .     .    /* St
da30: 6f 72 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ore the SELECT s
da40: 74 61 74 65 6d 65 6e 74 20 69 6e 20 70 52 69 67  tatement in pRig
da50: 68 74 20 73 6f 20 69 74 20 77 69 6c 6c 20 62 65  ht so it will be
da60: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 0a 20 20   deleted when.  
da70: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
da80: 4c 69 73 74 44 65 6c 65 74 65 28 29 20 69 73 20  ListDelete() is 
da90: 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 70 46  called */.    pF
daa0: 69 72 73 74 2d 3e 70 52 69 67 68 74 20 3d 20 70  irst->pRight = p
dab0: 45 78 70 72 3b 0a 20 20 20 20 70 45 78 70 72 20  Expr;.    pExpr 
dac0: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  = 0;..    /* Rem
dad0: 65 6d 62 65 72 20 74 68 65 20 73 69 7a 65 20 6f  ember the size o
dae0: 66 20 74 68 65 20 4c 48 53 20 69 6e 20 69 54 61  f the LHS in iTa
daf0: 62 6c 65 20 73 6f 20 74 68 61 74 20 77 65 20 63  ble so that we c
db00: 61 6e 20 63 68 65 63 6b 20 74 68 61 74 0a 20 20  an check that.  
db10: 20 20 2a 2a 20 74 68 65 20 52 48 53 20 61 6e 64    ** the RHS and
db20: 20 4c 48 53 20 73 69 7a 65 73 20 6d 61 74 63 68   LHS sizes match
db30: 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65 6e   during code gen
db40: 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  eration. */.    
db50: 70 46 69 72 73 74 2d 3e 69 54 61 62 6c 65 20 3d  pFirst->iTable =
db60: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a   pColumns->nId;.
db70: 20 20 7d 0a 0a 76 65 63 74 6f 72 5f 61 70 70 65    }..vector_appe
db80: 6e 64 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  nd_error:.  sqli
db90: 74 65 33 45 78 70 72 55 6e 6d 61 70 41 6e 64 44  te3ExprUnmapAndD
dba0: 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70 45  elete(pParse, pE
dbb0: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  xpr);.  sqlite3I
dbc0: 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
dbd0: 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74  pColumns);.  ret
dbe0: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
dbf0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74  .** Set the sort
dc00: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c   order for the l
dc10: 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74  ast element on t
dc20: 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73  he given ExprLis
dc30: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
dc40: 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72  e3ExprListSetSor
dc50: 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74 20  tOrder(ExprList 
dc60: 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64  *p, int iSortOrd
dc70: 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  er){.  if( p==0 
dc80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
dc90: 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e  rt( SQLITE_SO_UN
dca0: 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c  DEFINED<0 && SQL
dcb0: 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26  ITE_SO_ASC>=0 &&
dcc0: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e   SQLITE_SO_DESC>
dcd0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
dce0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69  ->nExpr>0 );.  i
dcf0: 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20  f( iSortOrder<0 
dd00: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
dd10: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
dd20: 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54  sortOrder==SQLIT
dd30: 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20  E_SO_ASC );.    
dd40: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d  return;.  }.  p-
dd50: 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73  >a[p->nExpr-1].s
dd60: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69  ortOrder = (u8)i
dd70: 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a  SortOrder;.}../*
dd80: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
dd90: 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65  List.a[].zName e
dda0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
ddb0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
ddc0: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
ddd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
dde0: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
ddf0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
de00: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
de10: 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73  or.  But pName s
de20: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
de30: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
de40: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
de50: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
de60: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
de70: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
de80: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
de90: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
dea0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
deb0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
dec0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
ded0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
dee0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
def0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
df00: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
df10: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
df20: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
df30: 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64  Name to be added
df40: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
df50: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
df60: 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74   True to cause t
df70: 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65  he name to be de
df80: 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  quoted */.){.  a
df90: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
dfa0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
dfb0: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
dfc0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
dfd0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
dfe0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
dff0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
e000: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
e010: 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69      pItem = &pLi
e020: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
e030: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
e040: 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d  t( pItem->zName=
e050: 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
e060: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
e070: 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65  DbStrNDup(pParse
e080: 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  ->db, pName->z, 
e090: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69  pName->n);.    i
e0a0: 66 28 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c  f( dequote ) sql
e0b0: 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65  ite3Dequote(pIte
e0c0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  m->zName);.    i
e0d0: 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
e0e0: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ECT ){.      sql
e0f0: 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d  ite3RenameTokenM
e100: 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64  ap(pParse, (void
e110: 2a 29 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  *)pItem->zName, 
e120: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pName);.    }.  
e130: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
e140: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
e150: 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  zSpan element of
e160: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e170: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
e180: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
e190: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
e1a0: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
e1b0: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
e1c0: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
e1d0: 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76  pSpan should nev
e1e0: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
e1f0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
e200: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
e210: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
e220: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
e230: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
e240: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
e250: 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72  stSetSpan(.  Par
e260: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e270: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e280: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
e290: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
e2a0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
e2b0: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
e2c0: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73   span. */.  cons
e2d0: 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c 20  t char *zStart, 
e2e0: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
e2f0: 74 68 65 20 73 70 61 6e 20 2a 2f 0a 20 20 63 6f  the span */.  co
e300: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20  nst char *zEnd  
e310: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
e320: 74 68 65 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a 20  the span */.){. 
e330: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
e340: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
e350: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
e360: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e370: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  d!=0 );.  if( pL
e380: 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ist ){.    struc
e390: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
e3a0: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
e3b0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
e3c0: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
e3d0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
e3e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
e3f0: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
e400: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
e410: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
e420: 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a  3DbSpanDup(db, z
e430: 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20  Start, zEnd);.  
e440: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
e450: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
e460: 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e  t pEList contain
e470: 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d  s more than iLim
e480: 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20  it elements,.** 
e490: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
e4a0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
e4b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e4c0: 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
e4d0: 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70  ngth(.  Parse *p
e4e0: 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
e4f0: 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e  t *pEList,.  con
e500: 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74  st char *zObject
e510: 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70  .){.  int mx = p
e520: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
e530: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
e540: 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61  OLUMN];.  testca
e550: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
e560: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20  List->nExpr==mx 
e570: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
e580: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
e590: 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a  >nExpr==mx+1 );.
e5a0: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
e5b0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78  pEList->nExpr>mx
e5c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
e5d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e5e0: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
e5f0: 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63  s in %s", zObjec
e600: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
e610: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
e620: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
e630: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  t..*/.static SQL
e640: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
e650: 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65  d exprListDelete
e660: 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  NN(sqlite3 *db, 
e670: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
e680: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73  {.  int i = pLis
e690: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 74 72 75  t->nExpr;.  stru
e6a0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
e6b0: 20 2a 70 49 74 65 6d 20 3d 20 20 70 4c 69 73 74   *pItem =  pList
e6c0: 2d 3e 61 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ->a;.  assert( p
e6d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
e6e0: 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
e6f0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
e700: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
e710: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e720: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  e(db, pItem->zNa
e730: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
e740: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
e750: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
e760: 74 65 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  tem++;.  }while(
e770: 20 2d 2d 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69   --i>0 );.  sqli
e780: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
e790: 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73  pList);.}.void s
e7a0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
e7b0: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
e7c0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
e7d0: 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20  t){.  if( pList 
e7e0: 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65  ) exprListDelete
e7f0: 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
e800: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
e810: 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f 66  he bitwise-OR of
e820: 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73 20   all Expr.flags 
e830: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67 69  fields in the gi
e840: 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e  ven.** ExprList.
e850: 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 45  .*/.u32 sqlite3E
e860: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e  xprListFlags(con
e870: 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  st ExprList *pLi
e880: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
e890: 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73  u32 m = 0;.  ass
e8a0: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
e8b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
e8c0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
e8d0: 7b 0a 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  {.     Expr *pEx
e8e0: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
e8f0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 61 73 73  .pExpr;.     ass
e900: 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
e910: 0a 20 20 20 20 20 6d 20 7c 3d 20 70 45 78 70 72  .     m |= pExpr
e920: 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72  ->flags;.  }.  r
e930: 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn m;.}../*.*
e940: 2a 20 54 68 69 73 20 69 73 20 61 20 53 45 4c 45  * This is a SELE
e950: 43 54 2d 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b  CT-node callback
e960: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
e970: 69 6f 6e 20 77 61 6c 6b 65 72 20 74 68 61 74 0a  ion walker that.
e980: 2a 2a 20 61 6c 77 61 79 73 20 22 66 61 69 6c 73  ** always "fails
e990: 22 2e 20 20 42 79 20 22 66 61 69 6c 22 20 69 6e  ".  By "fail" in
e9a0: 20 74 68 69 73 20 63 61 73 65 2c 20 77 65 20 6d   this case, we m
e9b0: 65 61 6e 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b  ean set.** pWalk
e9c0: 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72  er->eCode to zer
e9d0: 6f 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a  o and abort..**.
e9e0: 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b  ** This callback
e9f0: 20 69 73 20 75 73 65 64 20 62 79 20 6d 75 6c 74   is used by mult
ea00: 69 70 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20  iple expression 
ea10: 77 61 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20  walkers..*/.int 
ea20: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
ea30: 6b 46 61 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57  kFail(Walker *pW
ea40: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e  alker, Select *N
ea50: 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
ea60: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
ea70: 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  sed);.  pWalker-
ea80: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65  >eCode = 0;.  re
ea90: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
eaa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
eab0: 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e  input expression
eac0: 20 69 73 20 61 6e 20 49 44 20 77 69 74 68 20 74   is an ID with t
ead0: 68 65 20 6e 61 6d 65 20 22 74 72 75 65 22 20 6f  he name "true" o
eae0: 72 20 22 66 61 6c 73 65 22 0a 2a 2a 20 74 68 65  r "false".** the
eaf0: 6e 20 63 6f 6e 76 65 72 74 20 69 74 20 69 6e 74  n convert it int
eb00: 6f 20 61 6e 20 54 4b 5f 54 52 55 45 46 41 4c 53  o an TK_TRUEFALS
eb10: 45 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20  E term.  Return 
eb20: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20 74  non-zero if.** t
eb30: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 68 61  he conversion ha
eb40: 70 70 65 6e 65 64 2c 20 61 6e 64 20 7a 65 72 6f  ppened, and zero
eb50: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
eb60: 6f 6e 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e  on is unaltered.
eb70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
eb80: 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65  xprIdToTrueFalse
eb90: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
eba0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
ebb0: 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 78  op==TK_ID || pEx
ebc0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  pr->op==TK_STRIN
ebd0: 47 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72  G );.  if( !Expr
ebe0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
ebf0: 72 2c 20 45 50 5f 51 75 6f 74 65 64 29 0a 20 20  r, EP_Quoted).  
ec00: 20 26 26 20 28 73 71 6c 69 74 65 33 53 74 72 49   && (sqlite3StrI
ec10: 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Cmp(pExpr->u.zTo
ec20: 6b 65 6e 2c 20 22 74 72 75 65 22 29 3d 3d 30 0a  ken, "true")==0.
ec30: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
ec40: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
ec50: 75 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c 73 65  u.zToken, "false
ec60: 22 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  ")==0).  ){.    
ec70: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 54  pExpr->op = TK_T
ec80: 52 55 45 46 41 4c 53 45 3b 0a 20 20 20 20 45 78  RUEFALSE;.    Ex
ec90: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
eca0: 78 70 72 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  xpr, pExpr->u.zT
ecb0: 6f 6b 65 6e 5b 34 5d 3d 3d 30 20 3f 20 45 50 5f  oken[4]==0 ? EP_
ecc0: 49 73 54 72 75 65 20 3a 20 45 50 5f 49 73 46 61  IsTrue : EP_IsFa
ecd0: 6c 73 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  lse);.    return
ece0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
ecf0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   0;.}../*.** The
ed00: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
ed10: 65 20 61 20 54 4b 5f 54 52 55 45 46 41 4c 53 45  e a TK_TRUEFALSE
ed20: 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 52 65 74   Expr node.  Ret
ed30: 75 72 6e 20 31 20 69 66 20 69 74 20 69 73 20 54  urn 1 if it is T
ed40: 52 55 45 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  RUE.** and 0 if 
ed50: 69 74 20 69 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a  it is FALSE..*/.
ed60: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 54  int sqlite3ExprT
ed70: 72 75 74 68 56 61 6c 75 65 28 63 6f 6e 73 74 20  ruthValue(const 
ed80: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
ed90: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
eda0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 28  xprSkipCollate((
edb0: 45 78 70 72 2a 29 70 45 78 70 72 29 3b 0a 20 20  Expr*)pExpr);.  
edc0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
edd0: 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 20  p==TK_TRUEFALSE 
ede0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
edf0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
ee00: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 74 72 75  r->u.zToken,"tru
ee10: 65 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  e")==0.       ||
ee20: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
ee30: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
ee40: 22 66 61 6c 73 65 22 29 3d 3d 30 20 29 3b 0a 20  "false")==0 );. 
ee50: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 75   return pExpr->u
ee60: 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b 0a 7d  .zToken[4]==0;.}
ee70: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ../*.** If pExpr
ee80: 20 69 73 20 61 6e 20 41 4e 44 20 6f 72 20 4f 52   is an AND or OR
ee90: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 72 79   expression, try
eea0: 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 69 74 20   to simplify it 
eeb0: 62 79 20 65 6c 69 6d 69 6e 61 74 69 6e 67 0a 2a  by eliminating.*
eec0: 2a 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  * terms that are
eed0: 20 61 6c 77 61 79 73 20 74 72 75 65 20 6f 72 20   always true or 
eee0: 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 20 74  false.  Return t
eef0: 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 65 78  he simplified ex
ef00: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 4f 72 20  pression..** Or 
ef10: 72 65 74 75 72 6e 20 74 68 65 20 6f 72 69 67 69  return the origi
ef20: 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69  nal expression i
ef30: 66 20 6e 6f 20 73 69 6d 70 6c 69 66 69 63 61 74  f no simplificat
ef40: 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 2e  ion is possible.
ef50: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a  .**.** Examples:
ef60: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 78 3c 31 30  .**.**     (x<10
ef70: 29 20 41 4e 44 20 74 72 75 65 20 20 20 20 20 20  ) AND true      
ef80: 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 28            =>   (
ef90: 78 3c 31 30 29 0a 2a 2a 20 20 20 20 20 28 78 3c  x<10).**     (x<
efa0: 31 30 29 20 41 4e 44 20 66 61 6c 73 65 20 20 20  10) AND false   
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
efc0: 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 28 78   false.**     (x
efd0: 3c 31 30 29 20 41 4e 44 20 28 79 3d 32 32 20 4f  <10) AND (y=22 O
efe0: 52 20 66 61 6c 73 65 29 20 20 20 20 20 3d 3e 20  R false)     => 
eff0: 20 20 28 78 3c 31 30 29 20 41 4e 44 20 28 79 3d    (x<10) AND (y=
f000: 32 32 29 0a 2a 2a 20 20 20 20 20 28 78 3c 31 30  22).**     (x<10
f010: 29 20 41 4e 44 20 28 79 3d 32 32 20 4f 52 20 74  ) AND (y=22 OR t
f020: 72 75 65 29 20 20 20 20 20 20 3d 3e 20 20 20 28  rue)      =>   (
f030: 78 3c 31 30 29 0a 2a 2a 20 20 20 20 20 28 79 3d  x<10).**     (y=
f040: 32 32 29 20 4f 52 20 74 72 75 65 20 20 20 20 20  22) OR true     
f050: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
f060: 20 74 72 75 65 0a 2a 2f 0a 45 78 70 72 20 2a 73   true.*/.Expr *s
f070: 71 6c 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69  qlite3ExprSimpli
f080: 66 69 65 64 41 6e 64 4f 72 28 45 78 70 72 20 2a  fiedAndOr(Expr *
f090: 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74  pExpr){.  assert
f0a0: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
f0b0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
f0c0: 4b 5f 41 4e 44 20 7c 7c 20 70 45 78 70 72 2d 3e  K_AND || pExpr->
f0d0: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20  op==TK_OR ){.   
f0e0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
f0f0: 73 71 6c 69 74 65 33 45 78 70 72 53 69 6d 70 6c  sqlite3ExprSimpl
f100: 69 66 69 65 64 41 6e 64 4f 72 28 70 45 78 70 72  ifiedAndOr(pExpr
f110: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 45  ->pRight);.    E
f120: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c  xpr *pLeft = sql
f130: 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66 69  ite3ExprSimplifi
f140: 65 64 41 6e 64 4f 72 28 70 45 78 70 72 2d 3e 70  edAndOr(pExpr->p
f150: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 45  Left);.    if( E
f160: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 4c  xprAlwaysTrue(pL
f170: 65 66 74 29 20 7c 7c 20 45 78 70 72 41 6c 77 61  eft) || ExprAlwa
f180: 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20  ysFalse(pRight) 
f190: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  ){.      pExpr =
f1a0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
f1b0: 4e 44 20 3f 20 70 52 69 67 68 74 20 3a 20 70 4c  ND ? pRight : pL
f1c0: 65 66 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eft;.    }else i
f1d0: 66 28 20 45 78 70 72 41 6c 77 61 79 73 54 72 75  f( ExprAlwaysTru
f1e0: 65 28 70 52 69 67 68 74 29 20 7c 7c 20 45 78 70  e(pRight) || Exp
f1f0: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65  rAlwaysFalse(pLe
f200: 66 74 29 20 29 7b 0a 20 20 20 20 20 20 70 45 78  ft) ){.      pEx
f210: 70 72 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  pr = pExpr->op==
f220: 54 4b 5f 41 4e 44 20 3f 20 70 4c 65 66 74 20 3a  TK_AND ? pLeft :
f230: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20   pRight;.    }. 
f240: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
f250: 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  r;.}.../*.** The
f260: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
f270: 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73  Walker callbacks
f280: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65   used to check e
f290: 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a  xpressions to.**
f2a0: 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72 65   see if they are
f2b0: 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20   "constant" for 
f2c0: 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  some definition 
f2d0: 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68  of constant.  Th
f2e0: 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64  e.** Walker.eCod
f2f0: 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e  e value determin
f300: 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 22  es the type of "
f310: 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65  constant" we are
f320: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e   looking.** for.
f330: 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c  .**.** These cal
f340: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61  lback routines a
f350: 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  re used to imple
f360: 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ment the followi
f370: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71  ng:.**.**     sq
f380: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
f390: 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20  ant()           
f3a0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
f3b0: 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20  eCode==1.**     
f3c0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
f3d0: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20  stantNotJoin()  
f3e0: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
f3f0: 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20  ->eCode==2.**   
f400: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54    sqlite3ExprIsT
f410: 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20  ableConstant()  
f420: 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b             pWalk
f430: 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20  er->eCode==3.** 
f440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
f450: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
f460: 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57 61  ion()        pWa
f470: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f  lker->eCode==4 o
f480: 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c  r 5.**.** In all
f490: 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c   cases, the call
f4a0: 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72  backs set Walker
f4b0: 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f  .eCode=0 and abo
f4c0: 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  rt if the expres
f4d0: 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64  sion.** is found
f4e0: 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e   to not be a con
f4f0: 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stant..**.** The
f500: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
f510: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
f520: 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  () is used for e
f530: 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73  valuating expres
f540: 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52  sions.** in a CR
f550: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
f560: 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65  ment.  The Walke
f570: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73  r.eCode value is
f580: 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a   5 when parsing.
f590: 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  ** an existing s
f5a0: 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e  chema and 4 when
f5b0: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65   processing a ne
f5c0: 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  w statement.  A 
f5d0: 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74  bound.** paramet
f5e0: 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72 72  er raises an err
f5f0: 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65  or for new state
f600: 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69  ments, but is si
f610: 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64  lently converted
f620: 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20  .** to NULL for 
f630: 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73  existing schemas
f640: 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73  .  This allows s
f650: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
f660: 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e  les that .** con
f670: 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72  tain a bound par
f680: 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20 74  ameter because t
f690: 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61 74  hey were generat
f6a0: 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73  ed by older vers
f6b0: 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
f6c0: 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20 62  e to be parsed b
f6d0: 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  y newer versions
f6e0: 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f   of SQLite witho
f6f0: 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20  ut raising a.** 
f700: 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61  malformed schema
f710: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
f720: 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73  c int exprNodeIs
f730: 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20  Constant(Walker 
f740: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
f750: 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66  pExpr){..  /* If
f760: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
f770: 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65  is 2 then any te
f780: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
f790: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20  sion that comes 
f7a0: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e  from.  ** the ON
f7b0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
f7c0: 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e  s of a left join
f7d0: 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68   disqualifies th
f7e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  e expression.  *
f7f0: 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e  * from being con
f800: 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74  sidered constant
f810: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b  . */.  if( pWalk
f820: 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20  er->eCode==2 && 
f830: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f840: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
f850: 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b  in) ){.    pWalk
f860: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
f870: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
f880: 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  ort;.  }..  swit
f890: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
f8a0: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72  .    /* Consider
f8b0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65   functions to be
f8c0: 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c   constant if all
f8d0: 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73   their arguments
f8e0: 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20   are constant.  
f8f0: 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20    ** and either 
f900: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
f910: 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75  4 or 5 or the fu
f920: 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20  nction has the. 
f930: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e     ** SQLITE_FUN
f940: 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f  C_CONST flag. */
f950: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
f960: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
f970: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e   pWalker->eCode>
f980: 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =4 || ExprHasPro
f990: 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43  perty(pExpr,EP_C
f9a0: 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20  onstFunc) ){.   
f9b0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
f9c0: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  Continue;.      
f9d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
f9e0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
f9f0: 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
fa00: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
fa10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
fa20: 5f 49 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  _ID:.      /* Co
fa30: 6e 76 65 72 74 20 22 74 72 75 65 22 20 6f 72 20  nvert "true" or 
fa40: 22 66 61 6c 73 65 22 20 69 6e 20 61 20 44 45 46  "false" in a DEF
fa50: 41 55 4c 54 20 63 6c 61 75 73 65 20 69 6e 74 6f  AULT clause into
fa60: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 61 70   the.      ** ap
fa70: 70 72 6f 70 72 69 61 74 65 20 54 4b 5f 54 52 55  propriate TK_TRU
fa80: 45 46 41 4c 53 45 20 6f 70 65 72 61 74 6f 72 20  EFALSE operator 
fa90: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
faa0: 69 74 65 33 45 78 70 72 49 64 54 6f 54 72 75 65  ite3ExprIdToTrue
fab0: 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
fac0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
fad0: 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
fae0: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  }.      /* Fall 
faf0: 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65  thru */.    case
fb00: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
fb10: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
fb20: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
fb30: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
fb40: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
fb50: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
fb60: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
fb70: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
fb80: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
fb90: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
fba0: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
fbb0: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  TION );.      te
fbc0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
fbd0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
fbe0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
fbf0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
fc00: 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  xpr, EP_FixedCol
fc10: 29 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 65 43  ) && pWalker->eC
fc20: 6f 64 65 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  ode!=2 ){.      
fc30: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
fc40: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
fc50: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
fc60: 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45  ->eCode==3 && pE
fc70: 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61  xpr->iTable==pWa
fc80: 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a  lker->u.iCur ){.
fc90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
fca0: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
fcb0: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
fcc0: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
fcd0: 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c    case TK_IF_NUL
fce0: 4c 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20  L_ROW:.    case 
fcf0: 54 4b 5f 52 45 47 49 53 54 45 52 3a 0a 20 20 20  TK_REGISTER:.   
fd00: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
fd10: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
fd20: 54 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  TER );.      tes
fd30: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
fd40: 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  ==TK_IF_NULL_ROW
fd50: 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65   );.      pWalke
fd60: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
fd70: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
fd80: 62 6f 72 74 3b 0a 20 20 20 20 63 61 73 65 20 54  bort;.    case T
fd90: 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20  K_VARIABLE:.    
fda0: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65    if( pWalker->e
fdb0: 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20  Code==5 ){.     
fdc0: 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63     /* Silently c
fdd0: 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72  onvert bound par
fde0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70 70  ameters that app
fdf0: 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52  ear inside of CR
fe00: 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20  EATE.        ** 
fe10: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20  statements into 
fe20: 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73  a NULL when pars
fe30: 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20 73  ing the CREATE s
fe40: 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75  tatement text ou
fe50: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  t.        ** of 
fe60: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
fe70: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
fe80: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
fe90: 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65  K_NULL;.      }e
fea0: 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d  lse if( pWalker-
feb0: 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20  >eCode==4 ){.   
fec0: 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20       /* A bound 
fed0: 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43  parameter in a C
fee0: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
fef0: 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20  that originates 
ff00: 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20  from.        ** 
ff10: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
ff20: 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f  ) causes an erro
ff30: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61  r */.        pWa
ff40: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
ff50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ff60: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
ff70: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
ff80: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20   through */.    
ff90: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74  default:.      t
ffa0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
ffb0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
ffc0: 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63   /* sqlite3Selec
ffd0: 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61  tWalkFail() disa
ffe0: 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 74  llows */.      t
fff0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
10000 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
10010 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63   /* sqlite3Selec
10020 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61  tWalkFail() disa
10030 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 72  llows */.      r
10040 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
10050 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ue;.  }.}.static
10060 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74   int exprIsConst
10070 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e  (Expr *p, int in
10080 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72  itFlag, int iCur
10090 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
100a0 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46   w.eCode = initF
100b0 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
100c0 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
100d0 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
100e0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
100f0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
10100 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66  WalkFail;.#ifdef
10110 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
10120 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
10130 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  k2 = sqlite3Sele
10140 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23  ctWalkAssert2;.#
10150 65 6e 64 69 66 0a 20 20 77 2e 75 2e 69 43 75 72  endif.  w.u.iCur
10160 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74   = iCur;.  sqlit
10170 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
10180 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
10190 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  ode;.}../*.** Wa
101a0 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
101b0 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
101c0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
101d0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
101e0 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
101f0 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
10200 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
10210 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  ion calls..**.**
10220 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
10230 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
10240 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
10250 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
10260 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
10270 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
10280 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
10290 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
102a0 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
102b0 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
102c0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
102d0 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
102e0 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
102f0 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29  IsConst(p, 1, 0)
10300 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
10310 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
10320 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
10330 7a 65 72 6f 20 69 66 0a 2a 2a 0a 2a 2a 20 20 20  zero if.**.**   
10340 28 31 29 20 74 68 65 20 65 78 70 72 65 73 73 69  (1) the expressi
10350 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20  on is constant, 
10360 61 6e 64 0a 2a 2a 20 20 20 28 32 29 20 74 68 65  and.**   (2) the
10370 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
10380 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68   originate in th
10390 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
103a0 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  ause.**       of
103b0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e   a LEFT JOIN, an
103c0 64 0a 2a 2a 20 20 20 28 33 29 20 74 68 65 20 65  d.**   (3) the e
103d0 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
103e0 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 45  ot contain any E
103f0 50 5f 46 69 78 65 64 43 6f 6c 20 54 4b 5f 43 4f  P_FixedCol TK_CO
10400 4c 55 4d 4e 0a 2a 2a 20 20 20 20 20 20 20 6f 70  LUMN.**       op
10410 65 72 61 6e 64 73 20 63 72 65 61 74 65 64 20 62  erands created b
10420 79 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 70  y the constant p
10430 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d  ropagation optim
10440 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  ization..**.** W
10450 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10460 20 72 65 74 75 72 6e 73 20 74 72 75 65 2c 20 69   returns true, i
10470 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  t indicates that
10480 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
10490 2a 2a 20 63 61 6e 20 62 65 20 61 64 64 65 64 20  ** can be added 
104a0 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70  to the pParse->p
104b0 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 20 61  ConstExpr list a
104c0 6e 64 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63  nd evaluated onc
104d0 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 72  e when.** the pr
104e0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
104f0 20 73 74 61 72 74 73 20 75 70 2e 20 20 53 65 65   starts up.  See
10500 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10510 41 74 49 6e 69 74 28 29 2e 0a 2a 2f 0a 69 6e 74  AtInit()..*/.int
10520 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
10530 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78  nstantNotJoin(Ex
10540 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
10550 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
10560 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2, 0);.}../*.** 
10570 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
10580 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
10590 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
105a0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
105b0 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61  onstant.** for a
105c0 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66  ny single row of
105d0 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
105e0 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e  cursor iCur.  In
105f0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
10600 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
10610 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74  must not refer t
10620 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d  o any non-determ
10630 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e  inistic function
10640 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c   nor any.** tabl
10650 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75  e other than iCu
10660 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
10670 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
10680 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  tant(Expr *p, in
10690 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72  t iCur){.  retur
106a0 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
106b0 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f   3, iCur);.}.../
106c0 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b  *.** sqlite3Walk
106d0 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20  Expr() callback 
106e0 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 45  used by sqlite3E
106f0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47  xprIsConstantOrG
10700 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74 61  roupBy()..*/.sta
10710 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
10720 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75  IsConstantOrGrou
10730 70 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  pBy(Walker *pWal
10740 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
10750 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
10760 47 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b 65  GroupBy = pWalke
10770 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a 20  r->u.pGroupBy;. 
10780 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43 68   int i;..  /* Ch
10790 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20  eck if pExpr is 
107a0 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e 79  identical to any
107b0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e 20   GROUP BY term. 
107c0 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 0a  If so, consider.
107d0 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e 74    ** it constant
107e0 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
107f0 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
10800 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
10810 70 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42 79  pr *p = pGroupBy
10820 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
10830 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
10840 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70  rCompare(0, pExp
10850 72 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a 20  r, p, -1)<2 ){. 
10860 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
10870 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
10880 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c 6b  rNNCollSeq(pWalk
10890 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b 0a  er->pParse, p);.
108a0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
108b0 33 49 73 42 69 6e 61 72 79 28 70 43 6f 6c 6c 29  3IsBinary(pColl)
108c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
108d0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
108e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
108f0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70  .  /* Check if p
10900 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73 65  Expr is a sub-se
10910 6c 65 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f 6e  lect. If so, con
10920 73 69 64 65 72 20 69 74 20 76 61 72 69 61 62 6c  sider it variabl
10930 65 2e 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72  e. */.  if( Expr
10940 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
10950 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
10960 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
10970 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
10980 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
10990 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
109a0 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
109b0 6e 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70  nt(pWalker, pExp
109c0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  r);.}../*.** Wal
109d0 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  k the expression
109e0 20 74 72 65 65 20 70 61 73 73 65 64 20 61 73 20   tree passed as 
109f0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
10a00 6e 74 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  nt. Return non-z
10a10 65 72 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65 78  ero.** if the ex
10a20 70 72 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73 74  pression consist
10a30 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f  s entirely of co
10a40 6e 73 74 61 6e 74 73 20 6f 72 20 63 6f 70 69 65  nstants or copie
10a50 73 20 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20 69  s of terms .** i
10a60 6e 20 70 47 72 6f 75 70 42 79 20 74 68 61 74 20  n pGroupBy that 
10a70 73 6f 72 74 20 77 69 74 68 20 74 68 65 20 42 49  sort with the BI
10a80 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  NARY collation s
10a90 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
10aa0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
10ab0 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
10ac0 20 69 66 20 61 20 74 65 72 6d 20 6f 66 20 74 68   if a term of th
10ad0 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
10ae0 63 61 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f 74  can.** be promot
10af0 65 64 20 69 6e 74 6f 20 74 68 65 20 57 48 45 52  ed into the WHER
10b00 45 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72  E clause.  In or
10b10 64 65 72 20 66 6f 72 20 73 75 63 68 20 61 20 70  der for such a p
10b20 72 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72 6b  romotion to work
10b30 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
10b40 66 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  f the HAVING cla
10b50 75 73 65 20 74 65 72 6d 20 6d 75 73 74 20 62 65  use term must be
10b60 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 61 6c   the same for al
10b70 6c 20 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a 20  l members of.** 
10b80 61 20 22 67 72 6f 75 70 22 2e 20 20 54 68 65 20  a "group".  The 
10b90 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74  requirement that
10ba0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
10bb0 72 6d 20 6d 75 73 74 20 62 65 20 42 49 4e 41 52  rm must be BINAR
10bc0 59 0a 2a 2a 20 61 73 73 75 6d 65 73 20 74 68 61  Y.** assumes tha
10bd0 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c 61  t no other colla
10be0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69  ting sequence wi
10bf0 6c 6c 20 68 61 76 65 20 61 20 66 69 6e 65 72 2d  ll have a finer-
10c00 67 72 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75 70  grained.** group
10c10 69 6e 67 20 74 68 61 6e 20 62 69 6e 61 72 79 2e  ing than binary.
10c20 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
10c30 20 28 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62 69   (A=B COLLATE bi
10c40 6e 61 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a 2a  nary) implies.**
10c50 20 41 3d 42 20 69 6e 20 65 76 65 72 79 20 6f 74   A=B in every ot
10c60 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  her collating se
10c70 71 75 65 6e 63 65 2e 20 20 54 68 65 20 72 65 71  quence.  The req
10c80 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68  uirement that th
10c90 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 62 65  e.** GROUP BY be
10ca0 20 42 49 4e 41 52 59 20 69 73 20 73 74 72 69 63   BINARY is stric
10cb0 74 65 72 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ter than necessa
10cc0 72 79 2e 20 20 49 74 20 77 6f 75 6c 64 20 61 6c  ry.  It would al
10cd0 73 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72  so work.** to pr
10ce0 6f 6d 6f 74 65 20 48 41 56 49 4e 47 20 63 6c 61  omote HAVING cla
10cf0 75 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68  uses that use th
10d00 65 20 73 61 6d 65 20 61 6c 74 65 72 6e 61 74 69  e same alternati
10d10 76 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  ve collating.** 
10d20 73 65 71 75 65 6e 63 65 20 61 73 20 74 68 65 20  sequence as the 
10d30 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2c 20 62  GROUP BY term, b
10d40 75 74 20 74 68 61 74 20 69 73 20 6d 75 63 68 20  ut that is much 
10d50 68 61 72 64 65 72 20 74 6f 20 63 68 65 63 6b 2c  harder to check,
10d60 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20  .** alternative 
10d70 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
10d80 63 65 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e  ces are uncommon
10d90 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 6f 6e  , and this is on
10da0 6c 79 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a  ly an.** optimiz
10db0 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61 6b  ation, so we tak
10dc0 65 20 74 68 65 20 65 61 73 79 20 77 61 79 20 6f  e the easy way o
10dd0 75 74 20 61 6e 64 20 73 69 6d 70 6c 79 20 72 65  ut and simply re
10de0 71 75 69 72 65 20 74 68 65 0a 2a 2a 20 47 52 4f  quire the.** GRO
10df0 55 50 20 42 59 20 74 6f 20 75 73 65 20 74 68 65  UP BY to use the
10e00 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e   BINARY collatin
10e10 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69  g sequence..*/.i
10e20 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
10e30 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
10e40 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
10e50 20 45 78 70 72 20 2a 70 2c 20 45 78 70 72 4c 69   Expr *p, ExprLi
10e60 73 74 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a 20  st *pGroupBy){. 
10e70 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65   Walker w;.  w.e
10e80 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45  Code = 1;.  w.xE
10e90 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
10ea0 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
10eb0 4f 72 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 78  OrGroupBy;.  w.x
10ec0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
10ed0 20 30 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75 70   0;.  w.u.pGroup
10ee0 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
10ef0 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
10f00 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
10f10 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
10f20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a  return w.eCode;.
10f30 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
10f40 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
10f50 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
10f60 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
10f70 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
10f80 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f  .** or a functio
10f90 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73  n call with cons
10fa0 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
10fb0 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66   Return and 0 if
10fc0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e   there.** are an
10fd0 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  y variables..**.
10fe0 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
10ff0 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
11000 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
11010 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
11020 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
11030 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
11040 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
11050 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
11060 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
11070 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
11080 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
11090 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
110a0 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75 38  tion(Expr *p, u8
110b0 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73 65   isInit){.  asse
110c0 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  rt( isInit==0 ||
110d0 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20   isInit==1 );.  
110e0 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
110f0 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20  st(p, 4+isInit, 
11100 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  0);.}..#ifdef SQ
11110 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
11120 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57  OR_HINTS./*.** W
11130 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
11140 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
11150 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
11160 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ion contains a.*
11170 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20 73 6f  * subquery of so
11180 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e  me kind.  Return
11190 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20   0 if there are 
111a0 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  no subqueries..*
111b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
111c0 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72  rContainsSubquer
111d0 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61  y(Expr *p){.  Wa
111e0 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64  lker w;.  w.eCod
111f0 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72  e = 1;.  w.xExpr
11200 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
11210 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
11220 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
11230 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ack = sqlite3Sel
11240 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66  ectWalkFail;.#if
11250 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
11260 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
11270 62 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53  back2 = sqlite3S
11280 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32  electWalkAssert2
11290 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
112a0 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
112b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
112c0 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  ode==0;.}.#endif
112d0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
112e0 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
112f0 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
11300 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
11310 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
11320 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
11330 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
11340 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
11350 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
11360 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
11370 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
11380 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
11390 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
113a0 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
113b0 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
113c0 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
113d0 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
113e0 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
113f0 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
11400 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
11410 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
11420 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20  *pValue){.  int 
11430 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 4e 45  rc = 0;.  if( NE
11440 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75  VER(p==0) ) retu
11450 72 6e 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74  rn 0;  /* Used t
11460 6f 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f  o only happen fo
11470 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a  llowing on OOM *
11480 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78  /..  /* If an ex
11490 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69  pression is an i
114a0 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74  nteger literal t
114b0 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73 69  hat fits in a si
114c0 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a  gned 32-bit.  **
114d0 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
114e0 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
114f0 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  lag will have al
11500 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a  ready been set *
11510 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  /.  assert( p->o
11520 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
11530 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f   (p->flags & EP_
11540 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20  IntValue)!=0.   
11550 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
11560 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e  e3GetInt32(p->u.
11570 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20  zToken, &rc)==0 
11580 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61  );..  if( p->fla
11590 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
115a0 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20   ){.    *pValue 
115b0 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  = p->u.iValue;. 
115c0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
115d0 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
115e0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
115f0 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
11600 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  c = sqlite3ExprI
11610 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
11620 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  t, pValue);.    
11630 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11640 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
11650 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
11660 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
11670 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
11680 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29  (p->pLeft, &v) )
11690 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
116a0 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34  ( v!=(-214748364
116b0 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  7-1) );.        
116c0 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
116d0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
116e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
116f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
11700 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
11710 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11720 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  ./*.** Return FA
11730 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20  LSE if there is 
11740 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
11750 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
11760 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n be NULL..**.**
11770 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
11780 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  on might be NULL
11790 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
117a0 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d  ssion is too com
117b0 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20  plex.** to tell 
117c0 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a  return TRUE.  .*
117d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
117e0 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20  e is used as an 
117f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
11800 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20   skip OP_IsNull 
11810 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20  opcodes.** when 
11820 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76  we know that a v
11830 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  alue cannot be N
11840 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66  ULL.  Hence, a f
11850 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a  alse positive.**
11860 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45   (returning TRUE
11870 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68   when in fact th
11880 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
11890 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20   never be NULL) 
118a0 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d  might.** be a sm
118b0 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  all performance 
118c0 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72  hit but is other
118d0 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20  wise harmless.  
118e0 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  On the other.** 
118f0 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65  hand, a false ne
11900 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e  gative (returnin
11910 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65  g FALSE when the
11920 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65   result could be
11930 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c   NULL).** will l
11940 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
11950 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  an incorrect ans
11960 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e  wer.  So when in
11970 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a   doubt, return.*
11980 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73  * TRUE..*/.int s
11990 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
119a0 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  ull(const Expr *
119b0 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77  p){.  u8 op;.  w
119c0 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
119d0 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
119e0 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 0a 20 20 20  TK_UMINUS ){.   
119f0 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
11a00 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
11a10 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
11a20 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
11a30 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
11a40 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
11a50 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  K_INTEGER:.    c
11a60 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
11a70 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
11a80 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  :.    case TK_BL
11a90 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
11aa0 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   0;.    case TK_
11ab0 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 72 65  COLUMN:.      re
11ac0 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70  turn ExprHasProp
11ad0 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65  erty(p, EP_CanBe
11ae0 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20  Null) ||.       
11af0 20 20 20 20 20 20 70 2d 3e 79 2e 70 54 61 62 3d        p->y.pTab=
11b00 3d 30 20 7c 7c 20 20 2f 2a 20 52 65 66 65 72 65  =0 ||  /* Refere
11b10 6e 63 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 6f 66  nce to column of
11b20 20 69 6e 64 65 78 20 6f 6e 20 65 78 70 72 65 73   index on expres
11b30 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  sion */.        
11b40 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e       (p->iColumn
11b50 3e 3d 30 20 26 26 20 70 2d 3e 79 2e 70 54 61 62  >=0 && p->y.pTab
11b60 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d  ->aCol[p->iColum
11b70 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a  n].notNull==0);.
11b80 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
11b90 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
11ba0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11bb0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
11bc0 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
11bd0 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63   a constant whic
11be0 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e  h would be.** un
11bf0 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66  changed by OP_Af
11c00 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20  finity with the 
11c10 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69  affinity given i
11c20 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  n the second.** 
11c30 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
11c40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
11c50 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
11c60 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69  e if the OP_Affi
11c70 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  nity operation.*
11c80 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  * can be omitted
11c90 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  .  When in doubt
11ca0 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20   return FALSE.  
11cb0 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  A false negative
11cc0 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  .** is harmless.
11cd0 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69    A false positi
11ce0 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e  ve, however, can
11cf0 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77   result in the w
11d00 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a  rong.** answer..
11d10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
11d20 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
11d30 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78  yChange(const Ex
11d40 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29  pr *p, char aff)
11d50 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28  {.  u8 op;.  if(
11d60 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
11d70 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31  _BLOB ) return 1
11d80 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
11d90 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
11da0 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
11db0 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
11dc0 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
11dd0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
11de0 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
11df0 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
11e00 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
11e10 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
11e20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
11e30 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
11e40 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
11e50 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
11e60 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
11e70 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65  LOAT: {.      re
11e80 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
11e90 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66  _AFF_REAL || aff
11ea0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
11eb0 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERIC;.    }.    
11ec0 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
11ed0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
11ee0 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
11ef0 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  EXT;.    }.    c
11f00 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
11f10 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
11f20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
11f30 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
11f40 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62   assert( p->iTab
11f50 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63  le>=0 );  /* p c
11f60 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66  annot be part of
11f70 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61   a CHECK constra
11f80 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  int */.      ret
11f90 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  urn p->iColumn<0
11fa0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61  .          && (a
11fb0 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
11fc0 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
11fd0 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
11fe0 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  C);.    }.    de
11ff0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
12000 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
12010 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
12020 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
12030 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61  iven string is a
12040 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e   row-id column n
12050 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ame..*/.int sqli
12060 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74  te3IsRowid(const
12070 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28   char *z){.  if(
12080 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
12090 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
120a0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
120b0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
120c0 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30  p(z, "ROWID")==0
120d0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
120e0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
120f0 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29  p(z, "OID")==0 )
12100 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
12110 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
12120 70 58 20 69 73 20 74 68 65 20 52 48 53 20 6f 66  pX is the RHS of
12130 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e   an IN operator.
12140 20 20 49 66 20 70 58 20 69 73 20 61 20 53 45 4c    If pX is a SEL
12150 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a  ECT statement .*
12160 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 69  * that can be si
12170 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69  mplified to a di
12180 72 65 63 74 20 74 61 62 6c 65 20 61 63 63 65 73  rect table acces
12190 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a  s, then return.*
121a0 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
121b0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
121c0 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e  ent.  If pX is n
121d0 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ot a SELECT stat
121e0 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20  ement,.** or if 
121f0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
12200 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65  ment needs to be
12210 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f   manifested into
12220 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20   a transient.** 
12230 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75  table, then retu
12240 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e  rn NULL..*/.#ifn
12250 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12260 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20  SUBQUERY.static 
12270 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64  Select *isCandid
12280 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72  ateForInOpt(Expr
12290 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20   *pX){.  Select 
122a0 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  *p;.  SrcList *p
122b0 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Src;.  ExprList 
122c0 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65  *pEList;.  Table
122d0 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b   *pTab;.  int i;
122e0 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
122f0 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
12300 49 73 53 65 6c 65 63 74 29 20 29 20 72 65 74 75  IsSelect) ) retu
12310 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20  rn 0;  /* Not a 
12320 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  subquery */.  if
12330 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
12340 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65  y(pX, EP_VarSele
12350 63 74 29 20 20 29 20 72 65 74 75 72 6e 20 30 3b  ct)  ) return 0;
12360 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20    /* Correlated 
12370 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58  subq */.  p = pX
12380 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69  ->x.pSelect;.  i
12390 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72  f( p->pPrior ) r
123a0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
123b0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63        /* Not a c
123c0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
123d0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
123e0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
123f0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
12400 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
12410 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
12420 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
12430 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
12440 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
12450 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73   testcase( (p->s
12460 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
12470 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
12480 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
12490 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ate );.    retur
124a0 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49  n 0; /* No DISTI
124b0 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20  NCT keyword and 
124c0 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  no aggregate fun
124d0 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20  ctions */.  }.  
124e0 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
124f0 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  pBy==0 );       
12500 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
12510 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
12520 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
12530 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12550 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61  Has no LIMIT cla
12560 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
12570 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
12580 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12590 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20  /* Has no WHERE 
125a0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63  clause */.  pSrc
125b0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
125c0 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
125d0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
125e0 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
125f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
12600 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d  gle term in FROM
12610 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
12620 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
12630 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ect ) return 0; 
12640 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e      /* FROM is n
12650 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72  ot a subquery or
12660 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20   view */.  pTab 
12670 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
12680 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  b;.  assert( pTa
12690 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
126a0 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
126b0 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
126c0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
126d0 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f  is not a view */
126e0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
126f0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
12700 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f  0;        /* FRO
12710 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76  M clause not a v
12720 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
12730 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
12740 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
12750 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 2f  pEList!=0 );.  /
12760 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72 65 73  * All SELECT res
12770 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63 6f 6c  ults must be col
12780 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  umns. */.  for(i
12790 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
127a0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
127b0 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45 4c 69  xpr *pRes = pELi
127c0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
127d0 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 6f 70      if( pRes->op
127e0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
127f0 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73 73 65  turn 0;.    asse
12800 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65  rt( pRes->iTable
12810 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  ==pSrc->a[0].iCu
12820 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20  rsor );  /* Not 
12830 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
12840 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72  query */.  }.  r
12850 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69  eturn p;.}.#endi
12860 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12870 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
12880 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12890 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
128a0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
128b0 68 61 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c  hat checks the l
128c0 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
128d0 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69  of index table i
128e0 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a  Cur to see if.**
128f0 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79   it contains any
12900 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20   NULL entries.  
12910 43 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74  Cause the regist
12920 65 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c  er at regHasNull
12930 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f   to be set.** to
12940 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
12950 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69  e if iCur contai
12960 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61  ns no NULLs.  Ca
12970 75 73 65 20 72 65 67 69 73 74 65 72 20 72 65 67  use register reg
12980 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65  HasNull.** to be
12990 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20   set to NULL if 
129a0 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  iCur contains on
129b0 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76  e or more NULL v
129c0 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
129d0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74   void sqlite3Set
129e0 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65  HasNullFlag(Vdbe
129f0 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69   *v, int iCur, i
12a00 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a  nt regHasNull){.
12a10 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73    int addr1;.  s
12a20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12a30 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
12a40 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
12a50 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
12a60 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12a70 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b  P_Rewind, iCur);
12a80 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12a90 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12aa0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
12ab0 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67  mn, iCur, 0, reg
12ac0 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69  HasNull);.  sqli
12ad0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
12ae0 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  v, OPFLAG_TYPEOF
12af0 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ARG);.  VdbeComm
12b00 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65  ent((v, "first_e
12b10 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43  ntry_in(%d)", iC
12b20 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ur));.  sqlite3V
12b30 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
12b40 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ddr1);.}.#endif.
12b50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12b60 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
12b70 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
12b80 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  t is an IN opera
12b90 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74 20  tor with a list 
12ba0 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29  (not a subquery)
12bb0 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68   on the .** righ
12bc0 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65  t-hand side.  Re
12bd0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 61  turn TRUE if tha
12be0 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61  t list is consta
12bf0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
12c00 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  t sqlite3InRhsIs
12c10 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
12c20 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48  In){.  Expr *pLH
12c30 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  S;.  int res;.  
12c40 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
12c50 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50  Property(pIn, EP
12c60 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
12c70 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65   pLHS = pIn->pLe
12c80 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  ft;.  pIn->pLeft
12c90 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71   = 0;.  res = sq
12ca0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
12cb0 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d  ant(pIn);.  pIn-
12cc0 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20  >pLeft = pLHS;. 
12cd0 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23   return res;.}.#
12ce0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
12cf0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
12d00 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d  ed by the implem
12d10 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
12d20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f  IN (...) operato
12d30 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72  r..** The pX par
12d40 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78  ameter is the ex
12d50 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20  pression on the 
12d60 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
12d70 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a  erator, which.**
12d80 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72   might be either
12d90 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65   a list of expre
12da0 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71  ssions or a subq
12db0 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
12dc0 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
12dd0 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f  ine is to find o
12de0 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65  r create a b-tre
12df0 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61  e object that ca
12e00 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74  n.** be used eit
12e10 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
12e20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68  membership in th
12e30 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20  e RHS set or to 
12e40 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a  iterate through.
12e50 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f  ** all members o
12e60 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73  f the RHS set, s
12e70 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74  kipping duplicat
12e80 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73  es..**.** A curs
12e90 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  or is opened on 
12ea0 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
12eb0 74 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48  t that is the RH
12ec0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
12ed0 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e  ator.** and pX->
12ee0 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
12ef0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
12f00 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  at cursor..**.**
12f10 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
12f20 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
12f30 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74  tion indicates t
12f40 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20  he b-tree type, 
12f50 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
12f60 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  *   IN_INDEX_ROW
12f70 49 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75  ID      - The cu
12f80 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
12f90 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61  on a database ta
12fa0 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  ble..**   IN_IND
12fb0 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20  EX_INDEX_ASC  - 
12fc0 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
12fd0 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65  pened on an asce
12fe0 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20  nding index..** 
12ff0 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
13000 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73  _DESC - The curs
13010 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
13020 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
13030 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
13040 45 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20  EX_EPH        - 
13050 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
13060 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69  pened on a speci
13070 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  ally created and
13080 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13090 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75              popu
130a0 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20  lated epheremal 
130b0 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49  table..**   IN_I
130c0 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20  NDEX_NOOP       
130d0 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20  - No cursor was 
130e0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20  allocated.  The 
130f0 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  IN operator must
13100 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
13120 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
13130 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70  sequence of comp
13140 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41  arisons..**.** A
13150 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65  n existing b-tre
13160 65 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20  e might be used 
13170 69 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65  if the RHS expre
13180 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69  ssion pX is a si
13190 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79  mple.** subquery
131a0 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20   such as:.**.** 
131b0 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75      SELECT <colu
131c0 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e  mn1>, <column2>.
131d0 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  .. FROM <table>.
131e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53  **.** If the RHS
131f0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
13200 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72  tor is a list or
13210 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
13220 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  subquery, then.*
13230 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  * an ephemeral t
13240 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20  able might need 
13250 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
13260 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64  from the RHS and
13270 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61   then.** pX->iTa
13280 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e  ble made to poin
13290 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  t to the ephemer
132a0 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  al table instead
132b0 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69   of an.** existi
132c0 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ng table..**.** 
132d0 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61  The inFlags para
132e0 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61  meter must conta
132f0 69 6e 2c 20 61 74 20 61 20 6d 69 6e 69 6d 75 6d  in, at a minimum
13300 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74  , one of the bit
13310 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  s.** IN_INDEX_ME
13320 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49  MBERSHIP or IN_I
13330 4e 44 45 58 5f 4c 4f 4f 50 20 62 75 74 20 6e 6f  NDEX_LOOP but no
13340 74 20 62 6f 74 68 2e 20 20 49 66 20 69 6e 46 6c  t both.  If inFl
13350 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ags contains.** 
13360 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
13370 48 49 50 2c 20 74 68 65 6e 20 74 68 65 20 67 65  HIP, then the ge
13380 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20 77 69  nerated table wi
13390 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  ll be used for a
133a0 20 66 61 73 74 0a 2a 2a 20 6d 65 6d 62 65 72 73   fast.** members
133b0 68 69 70 20 74 65 73 74 2e 20 20 57 68 65 6e 20  hip test.  When 
133c0 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  the IN_INDEX_LOO
133d0 50 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68  P bit is set, th
133e0 65 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 0a  e IN index will.
133f0 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 6c 6f  ** be used to lo
13400 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  op over all valu
13410 65 73 20 6f 66 20 74 68 65 20 52 48 53 20 6f 66  es of the RHS of
13420 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
13430 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
13440 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73  INDEX_LOOP is us
13450 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72  ed (and the b-tr
13460 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
13470 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
13480 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
13490 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68 65 20  mbers) then the 
134a0 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20  b-tree must not 
134b0 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74  contain duplicat
134c0 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65  es..** An ephere
134d0 6d 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  mal table will b
134e0 65 20 63 72 65 61 74 65 64 20 75 6e 6c 65 73 73  e created unless
134f0 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f   the selected co
13500 6c 75 6d 6e 73 20 61 72 65 20 67 75 61 72 61 6e  lumns are guaran
13510 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e  teed.** to be un
13520 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65  ique - either be
13530 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49  cause it is an I
13540 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
13550 45 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a 2a 20  EY or due to.** 
13560 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  a UNIQUE constra
13570 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  int or index..**
13580 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
13590 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20  X_MEMBERSHIP is 
135a0 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d  used (and the b-
135b0 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
135c0 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73  d .** for fast s
135d0 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
135e0 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68  sts) then an eph
135f0 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
13600 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e  t .** be used un
13610 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69  less <columns> i
13620 73 20 61 20 73 69 6e 67 6c 65 20 49 4e 54 45 47  s a single INTEG
13630 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
13640 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20  olumn or an .** 
13650 69 6e 64 65 78 20 63 61 6e 20 62 65 20 66 6f 75  index can be fou
13660 6e 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  nd with the spec
13670 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20  ified <columns> 
13680 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74  as its left-most
13690 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49  ..**.** If the I
136a0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20  N_INDEX_NOOP_OK 
136b0 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  and IN_INDEX_MEM
136c0 42 45 52 53 48 49 50 20 61 72 65 20 62 6f 74 68  BERSHIP are both
136d0 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74   set and.** if t
136e0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
136f0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
13700 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75  ist (not a subqu
13710 65 72 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a  ery) then this.*
13720 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  * routine might 
13730 64 65 63 69 64 65 20 74 68 61 74 20 63 72 65 61  decide that crea
13740 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ting an ephemera
13750 6c 20 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d  l b-tree for mem
13760 62 65 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69  bership.** testi
13770 6e 67 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73  ng is too expens
13780 69 76 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49  ive and return I
13790 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49  N_INDEX_NOOP.  I
137a0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
137b0 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  .** calling rout
137c0 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65  ine should imple
137d0 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72  ment the IN oper
137e0 61 74 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71  ator using a seq
137f0 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f  uence.** of Eq o
13800 72 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20  r Ne comparison 
13810 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
13820 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65  * When the b-tre
13830 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  e is being used 
13840 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74  for membership t
13850 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ests, the callin
13860 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69  g function.** mi
13870 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77  ght need to know
13880 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
13890 74 68 65 20 52 48 53 20 73 69 64 65 20 6f 66 20  the RHS side of 
138a0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
138b0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55  ** contains a NU
138c0 4c 4c 2e 20 20 49 66 20 70 72 52 68 73 48 61 73  LL.  If prRhsHas
138d0 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55  Null is not a NU
138e0 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a  LL pointer and .
138f0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ** if there is a
13900 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  ny chance that t
13910 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63  he (...) might c
13920 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61  ontain a NULL va
13930 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d  lue at.** runtim
13940 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74  e, then a regist
13950 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
13960 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72  and the register
13970 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a   number written.
13980 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e  ** to *prRhsHasN
13990 75 6c 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73  ull. If there is
139a0 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
139b0 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69  the (...) contai
139c0 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  ns a.** NULL val
139d0 75 65 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48  ue, then *prRhsH
139e0 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75  asNull is left u
139f0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
13a00 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73  If a register is
13a10 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69   allocated and i
13a20 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72  ts location stor
13a30 65 64 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e  ed in *prRhsHasN
13a40 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ull, then.** the
13a50 20 76 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72   value in that r
13a60 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20  egister will be 
13a70 4e 55 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72  NULL if the b-tr
13a80 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  ee contains one 
13a90 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20  or more.** NULL 
13aa0 76 61 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77  values, and it w
13ab0 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d  ill be some non-
13ac0 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68  NULL value if th
13ad0 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
13ae0 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  s no.** NULL val
13af0 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ues..**.** If th
13b00 65 20 61 69 4d 61 70 20 70 61 72 61 6d 65 74 65  e aiMap paramete
13b10 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  r is not NULL, i
13b20 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  t must point to 
13b30 61 6e 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  an array contain
13b40 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65  ing.** one eleme
13b50 6e 74 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  nt for each colu
13b60 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  mn returned by t
13b70 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
13b80 65 6e 74 20 6f 6e 20 74 68 65 20 52 48 53 0a 2a  ent on the RHS.*
13b90 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29  * of the IN(...)
13ba0 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20 69   operator. The i
13bb0 27 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  'th entry of the
13bc0 20 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61   array is popula
13bd0 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ted with the.** 
13be0 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 69 6e  offset of the in
13bf0 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  dex column that 
13c00 6d 61 74 63 68 65 73 20 74 68 65 20 69 27 74 68  matches the i'th
13c10 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64   column returned
13c20 20 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   by the.** SELEC
13c30 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  T. For example, 
13c40 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
13c50 6e 20 61 6e 64 20 73 65 6c 65 63 74 65 64 20 69  n and selected i
13c60 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ndex are:.**.** 
13c70 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53 45    (?,?,?) IN (SE
13c80 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f  LECT a, b, c FRO
13c90 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52 45 41 54  M t1).**   CREAT
13ca0 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
13cb0 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a  (b, c, a);.**.**
13cc0 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20 69 73   then aiMap[] is
13cd0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
13ce0 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69  {2, 0, 1}..*/.#i
13cf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13d00 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
13d10 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
13d20 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
13d30 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
13d40 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
13d50 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58  xt */.  Expr *pX
13d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13d70 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
13d80 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20  hand side (RHS) 
13d90 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
13da0 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69 6e 46 6c  or */.  u32 inFl
13db0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
13dc0 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f 4c     /* IN_INDEX_L
13dd0 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53 48 49 50  OOP, _MEMBERSHIP
13de0 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f  , and/or _NOOP_O
13df0 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 72 52 68  K */.  int *prRh
13e00 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20 20 20 20  sHasNull,       
13e10 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
13e20 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74 61 74 75  lding NULL statu
13e30 73 2e 20 20 53 65 65 20 6e 6f 74 65 73 20 2a 2f  s.  See notes */
13e40 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 2c 20 20  .  int *aiMap,  
13e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13e60 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 49 6e   Mapping from In
13e70 64 65 78 20 66 69 65 6c 64 73 20 74 6f 20 52 48  dex fields to RH
13e80 53 20 66 69 65 6c 64 73 20 2a 2f 0a 20 20 69 6e  S fields */.  in
13e90 74 20 2a 70 69 54 61 62 20 20 20 20 20 20 20 20  t *piTab        
13ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
13eb0 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f   index to use */
13ec0 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  .){.  Select *p;
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
13ef0 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67  ELECT to the rig
13f00 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  ht of IN operato
13f10 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  r */.  int eType
13f20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f40 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c  Type of RHS tabl
13f50 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f  e. IN_INDEX_* */
13f60 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
13f70 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
13f80 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
13f90 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61  or of the RHS ta
13fa0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73  ble */.  int mus
13fb0 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20  tBeUnique;      
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13fd0 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75  * True if RHS mu
13fe0 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a  st be unique */.
13ff0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
14000 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
14010 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75  e);     /* Virtu
14020 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67  al machine being
14030 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73   coded */..  ass
14040 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
14050 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e  IN );.  mustBeUn
14060 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20  ique = (inFlags 
14070 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29  & IN_INDEX_LOOP)
14080 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  !=0;..  /* If th
14090 65 20 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e  e RHS of this IN
140a0 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69  (...) operator i
140b0 73 20 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20  s a SELECT, and 
140c0 69 66 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20  if it matters . 
140d0 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
140e0 6f 74 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  ot the SELECT re
140f0 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55  sult contains NU
14100 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b  LL values, check
14110 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72   whether.  ** or
14120 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74   not NULL is act
14130 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28  ually possible (
14140 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66  it may not be, f
14150 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20  or example, due 
14160 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c  .  ** to NOT NUL
14170 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  L constraints in
14180 20 74 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66   the schema). If
14190 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20   no NULL values 
141a0 61 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20  are possible,.  
141b0 2a 2a 20 73 65 74 20 70 72 52 68 73 48 61 73 4e  ** set prRhsHasN
141c0 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20  ull to 0 before 
141d0 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a  continuing.  */.
141e0 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75    if( prRhsHasNu
141f0 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73  ll && (pX->flags
14200 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
14210 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
14220 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
14230 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c  ist = pX->x.pSel
14240 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
14250 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
14260 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
14270 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
14280 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
14290 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
142a0 70 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  pr) ) break;.   
142b0 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45   }.    if( i==pE
142c0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
142d0 20 20 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c       prRhsHasNul
142e0 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 0;.    }.  }
142f0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
14300 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69  see if an existi
14310 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
14320 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
14330 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68  .  ** satisfy th
14340 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69  e query.  This i
14350 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20  s preferable to 
14360 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77  generating a new
14370 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c   .  ** ephemeral
14380 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66   table.  */.  if
14390 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
143a0 30 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64  0 && (p = isCand
143b0 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58  idateForInOpt(pX
143c0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
143d0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
143e0 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  e->db;          
143f0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
14400 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
14410 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
14420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14430 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
14440 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  e <table>. */.  
14450 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20    i16 iDb;      
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14470 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
14480 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61  base idx for pTa
14490 62 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73  b */.    ExprLis
144a0 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  t *pEList = p->p
144b0 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e  EList;.    int n
144c0 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
144d0 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  Expr;..    asser
144e0 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
144f0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
14500 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
14510 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
14520 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
14530 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  t( p->pEList->a[
14540 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f  0].pExpr!=0 ); /
14550 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
14560 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
14570 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
14580 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b  t( p->pSrc!=0 );
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
145a0 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
145b0 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
145c0 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20  (p) */.    pTab 
145d0 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
145e0 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  pTab;..    /* Co
145f0 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63  de an OP_Transac
14600 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c  tion and OP_Tabl
14610 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65  eLock for <table
14620 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  >. */.    iDb = 
14630 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
14640 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
14650 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c  Schema);.    sql
14660 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
14670 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
14680 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61  );.    sqlite3Ta
14690 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
146a0 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
146b0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
146c0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 76 29  ;..    assert(v)
146d0 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 74  ;  /* sqlite3Get
146e0 56 64 62 65 28 29 20 68 61 73 20 61 6c 77 61 79  Vdbe() has alway
146f0 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  s been previousl
14700 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  y called */.    
14710 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20  if( nExpr==1 && 
14720 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
14730 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
14740 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78  .      /* The "x
14750 20 49 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69   IN (SELECT rowi
14760 64 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 20 63  d FROM table)" c
14770 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ase */.      int
14780 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33   iAddr = sqlite3
14790 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
147a0 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 56 64  _Once);.      Vd
147b0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
147c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
147d0 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
147e0 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
147f0 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
14800 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
14810 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20  NDEX_ROWID;.    
14820 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
14830 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 0a 20  an((pParse, 0,. 
14840 20 20 20 20 20 20 20 20 20 20 20 22 55 53 49 4e             "USIN
14850 47 20 52 4f 57 49 44 20 53 45 41 52 43 48 20 4f  G ROWID SEARCH O
14860 4e 20 54 41 42 4c 45 20 25 73 20 46 4f 52 20 49  N TABLE %s FOR I
14870 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70 54 61 62  N-OPERATOR",pTab
14880 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
14890 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
148a0 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
148b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
148c0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
148f0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
14900 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79      int affinity
14910 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  _ok = 1;.      i
14920 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  nt i;..      /* 
14930 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  Check that the a
14940 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c  ffinity that wil
14950 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72  l be used to per
14960 66 6f 72 6d 20 65 61 63 68 20 0a 20 20 20 20 20  form each .     
14970 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   ** comparison i
14980 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
14990 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 65 61  e affinity of ea
149a0 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62  ch column in tab
149b0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
149c0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
149d0 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 69   operator.  If i
149e0 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  t not, it is not
149f0 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a 20 20 20   possible to.   
14a00 20 20 20 2a 2a 20 75 73 65 20 61 6e 79 20 69 6e     ** use any in
14a10 64 65 78 20 6f 66 20 74 68 65 20 52 48 53 20 74  dex of the RHS t
14a20 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  able.  */.      
14a30 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
14a40 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b   && affinity_ok;
14a50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
14a60 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69  xpr *pLhs = sqli
14a70 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
14a80 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c  bexpr(pX->pLeft,
14a90 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74   i);.        int
14aa0 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e   iCol = pEList->
14ab0 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[i].pExpr->iCol
14ac0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61  umn;.        cha
14ad0 72 20 69 64 78 61 66 66 20 3d 20 73 71 6c 69 74  r idxaff = sqlit
14ae0 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66  e3TableColumnAff
14af0 69 6e 69 74 79 28 70 54 61 62 2c 69 43 6f 6c 29  inity(pTab,iCol)
14b00 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c 65 20 2a  ; /* RHS table *
14b10 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  /.        char c
14b20 6d 70 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43  mpaff = sqlite3C
14b30 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
14b40 4c 68 73 2c 20 69 64 78 61 66 66 29 3b 0a 20 20  Lhs, idxaff);.  
14b50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14b60 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  cmpaff==SQLITE_A
14b70 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20  FF_BLOB );.     
14b80 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d 70     testcase( cmp
14b90 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
14ba0 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20  TEXT );.        
14bb0 73 77 69 74 63 68 28 20 63 6d 70 61 66 66 20 29  switch( cmpaff )
14bc0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  {.          case
14bd0 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
14be0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  :.            br
14bf0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  eak;.          c
14c00 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
14c10 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20  EXT:.           
14c20 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f 6d 70 61   /* sqlite3Compa
14c30 72 65 41 66 66 69 6e 69 74 79 28 29 20 6f 6e 6c  reAffinity() onl
14c40 79 20 72 65 74 75 72 6e 73 20 54 45 58 54 20 69  y returns TEXT i
14c50 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68  f one side or th
14c60 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
14c70 20 6f 74 68 65 72 20 68 61 73 20 6e 6f 20 61 66   other has no af
14c80 66 69 6e 69 74 79 20 61 6e 64 20 74 68 65 20 6f  finity and the o
14c90 74 68 65 72 20 73 69 64 65 20 69 73 20 54 45 58  ther side is TEX
14ca0 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20 20 20 20  T.  Hence,.     
14cb0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e         ** the on
14cc0 6c 79 20 77 61 79 20 66 6f 72 20 63 6d 70 61 66  ly way for cmpaf
14cd0 66 20 74 6f 20 62 65 20 54 45 58 54 20 69 73 20  f to be TEXT is 
14ce0 66 6f 72 20 69 64 78 61 66 66 20 74 6f 20 62 65  for idxaff to be
14cf0 20 54 45 58 54 0a 20 20 20 20 20 20 20 20 20 20   TEXT.          
14d00 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20 74 68 65    ** and for the
14d10 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 4c 48 53   term on the LHS
14d20 20 6f 66 20 74 68 65 20 49 4e 20 74 6f 20 68 61   of the IN to ha
14d30 76 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 20  ve no affinity. 
14d40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  */.            a
14d50 73 73 65 72 74 28 20 69 64 78 61 66 66 3d 3d 53  ssert( idxaff==S
14d60 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
14d70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
14d80 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64  eak;.          d
14d90 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
14da0 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20      affinity_ok 
14db0 3d 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  = sqlite3IsNumer
14dc0 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 61 66  icAffinity(idxaf
14dd0 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  f);.        }.  
14de0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
14df0 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a   affinity_ok ){.
14e00 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
14e10 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
14e20 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 69 6c  g index that wil
14e30 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68 69 73 20  l work for this 
14e40 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
14e50 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
14e60 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
14e70 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 3b 20  dx && eType==0; 
14e80 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
14e90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42 69 74  ){.          Bit
14ea0 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b 20 20 20  mask colUsed;   
14eb0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66     /* Columns of
14ec0 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20   the index used 
14ed0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 42 69 74  */.          Bit
14ee0 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20 20 20 20  mask mCol;      
14ef0 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 74     /* Mask for t
14f00 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d  he current colum
14f10 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  n */.          i
14f20 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
14f30 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74 69 6e 75  <nExpr ) continu
14f40 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
14f50 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
14f60 68 65 72 65 21 3d 30 20 29 20 63 6f 6e 74 69 6e  here!=0 ) contin
14f70 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ue;.          /*
14f80 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e   Maximum nColumn
14f90 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74 20 42   is BMS-2, not B
14fa0 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74 20 77 65  MS-1, so that we
14fb0 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20 20 20   can compute.   
14fc0 20 20 20 20 20 20 20 2a 2a 20 42 49 54 4d 41 53         ** BITMAS
14fd0 4b 28 6e 45 78 70 72 29 20 77 69 74 68 6f 75 74  K(nExpr) without
14fe0 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a   overflowing */.
14ff0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
15000 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  se( pIdx->nColum
15010 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20  n==BMS-2 );.    
15020 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15030 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42  pIdx->nColumn==B
15040 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  MS-1 );.        
15050 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
15060 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63 6f 6e  umn>=BMS-1 ) con
15070 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
15080 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71 75   if( mustBeUniqu
15090 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
150a0 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43   if( pIdx->nKeyC
150b0 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20  ol>nExpr.       
150c0 20 20 20 20 20 20 7c 7c 28 70 49 64 78 2d 3e 6e        ||(pIdx->n
150d0 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26 26 20  Column>nExpr && 
150e0 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70  !IsUniqueIndex(p
150f0 49 64 78 29 29 0a 20 20 20 20 20 20 20 20 20 20  Idx)).          
15100 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
15110 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
15120 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e   This index is n
15130 6f 74 20 75 6e 69 71 75 65 20 6f 76 65 72 20 74  ot unique over t
15140 68 65 20 49 4e 20 52 48 53 20 63 6f 6c 75 6d 6e  he IN RHS column
15150 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
15160 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
15170 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55   .          colU
15180 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  sed = 0;   /* Co
15190 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 20 75  lumns of index u
151a0 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  sed so far */.  
151b0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
151c0 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a   i<nExpr; i++){.
151d0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
151e0 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33   *pLhs = sqlite3
151f0 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
15200 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29  pr(pX->pLeft, i)
15210 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  ;.            Ex
15220 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69 73  pr *pRhs = pELis
15230 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
15240 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53             CollS
15250 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74  eq *pReq = sqlit
15260 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
15270 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
15280 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20  Lhs, pRhs);.    
15290 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
152a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73   .            as
152b0 73 65 72 74 28 20 70 52 65 71 21 3d 30 20 7c 7c  sert( pReq!=0 ||
152c0 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   pRhs->iColumn==
152d0 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 61 72  XN_ROWID || pPar
152e0 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 20 20  se->nErr );.    
152f0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
15300 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a   j<nExpr; j++){.
15310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
15320 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
15330 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75  [j]!=pRhs->iColu
15340 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
15360 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ert( pIdx->azCol
15370 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  l[j] );.        
15380 20 20 20 20 20 20 69 66 28 20 70 52 65 71 21 3d        if( pReq!=
15390 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
153a0 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c  Cmp(pReq->zName,
153b0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
153c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
153d0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
153e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
153f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
15400 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
15410 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
15420 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20   if( j==nExpr ) 
15430 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
15440 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42 49     mCol = MASKBI
15450 54 28 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  T(j);.          
15460 20 20 69 66 28 20 6d 43 6f 6c 20 26 20 63 6f 6c    if( mCol & col
15470 55 73 65 64 20 29 20 62 72 65 61 6b 3b 20 2f 2a  Used ) break; /*
15480 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75 73 65   Each column use
15490 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20  d only once */. 
154a0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73             colUs
154b0 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20  ed |= mCol;.    
154c0 20 20 20 20 20 20 20 20 69 66 28 20 61 69 4d 61          if( aiMa
154d0 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 6a  p ) aiMap[i] = j
154e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
154f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
15500 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c 20 63  t( i==nExpr || c
15510 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42 49 54  olUsed!=(MASKBIT
15520 28 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a 20 20  (nExpr)-1) );.  
15530 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 55          if( colU
15540 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28 6e 45  sed==(MASKBIT(nE
15550 78 70 72 29 2d 31 29 20 29 7b 0a 20 20 20 20 20  xpr)-1) ){.     
15560 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
15570 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
15580 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
15590 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20 75   index pIdx is u
155a0 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  sable */.       
155b0 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d       int iAddr =
155c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
155d0 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
155e0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
155f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
15600 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
15610 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20  Parse, 0,.      
15620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15630 20 20 20 20 20 20 20 20 22 55 53 49 4e 47 20 49          "USING I
15640 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f  NDEX %s FOR IN-O
15650 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a  PERATOR",pIdx->z
15660 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
15670 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15680 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
15690 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78  Read, iTab, pIdx
156a0 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
156b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
156c0 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
156d0 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
156e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
156f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
15700 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
15710 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
15720 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49  sert( IN_INDEX_I
15730 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f  NDEX_DESC == IN_
15740 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b  INDEX_INDEX_ASC+
15750 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1 );.           
15760 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
15770 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49  X_INDEX_ASC + pI
15780 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  dx->aSortOrder[0
15790 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  ];.  .          
157a0 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75    if( prRhsHasNu
157b0 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ll ){.#ifdef SQL
157c0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
157d0 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20  N_USED_MASK.    
157e0 20 20 20 20 20 20 20 20 20 20 69 36 34 20 6d 61            i64 ma
157f0 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d  sk = (1<<nExpr)-
15800 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
15810 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15820 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
15830 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20  umnsUsed, .     
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61               iTa
15850 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d  b, 0, 0, (u8*)&m
15860 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  ask, P4_INT64);.
15870 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
15880 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75       *prRhsHasNu
15890 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
158a0 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
158b0 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20     if( nExpr==1 
158c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
158d0 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73     sqlite3SetHas
158e0 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62  NullFlag(v, iTab
158f0 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29  , *prRhsHasNull)
15900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15910 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
15920 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15930 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
15940 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20  v, iAddr);.     
15950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
15960 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* End loop ove
15970 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20  r indexes */.   
15980 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20     } /* End if( 
15990 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f  affinity_ok ) */
159a0 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66  .    } /* End if
159b0 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69 6e   not an rowid in
159c0 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e  dex */.  } /* En
159d0 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 74  d attempt to opt
159e0 69 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20 69  imize using an i
159f0 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  ndex */..  /* If
15a00 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20   no preexisting 
15a10 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62  index is availab
15a20 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c  le for the IN cl
15a30 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e  ause.  ** and IN
15a40 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61  _INDEX_NOOP is a
15a50 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a  n allowed reply.
15a60 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53    ** and the RHS
15a70 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
15a80 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e  tor is a list, n
15a90 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20  ot a subquery.  
15aa0 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69  ** and the RHS i
15ab0 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f  s not constant o
15ac0 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77  r has two or few
15ad0 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74  er terms,.  ** t
15ae0 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f  hen it is not wo
15af0 72 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20  rth creating an 
15b00 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
15b10 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a  to evaluate.  **
15b20 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
15b30 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e   so return IN_IN
15b40 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20  DEX_NOOP..  */. 
15b50 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20   if( eType==0.  
15b60 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49   && (inFlags & I
15b70 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29  N_INDEX_NOOP_OK)
15b80 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50  .   && !ExprHasP
15b90 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
15ba0 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20  IsSelect).   && 
15bb0 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  (!sqlite3InRhsIs
15bc0 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20  Constant(pX) || 
15bd0 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pX->x.pList->nEx
15be0 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20  pr<=2).  ){.    
15bf0 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
15c00 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
15c10 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ( eType==0 ){.  
15c20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66    /* Could not f
15c30 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ind an existing 
15c40 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
15c50 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53  o use as the RHS
15c60 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20   b-tree..    ** 
15c70 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  We will have to 
15c80 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65  generate an ephe
15c90 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64  meral table to d
15ca0 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a  o the job..    *
15cb0 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 4e  /.    u32 savedN
15cc0 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
15cd0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
15ce0 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65      int rMayHave
15cf0 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54  Null = 0;.    eT
15d00 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45  ype = IN_INDEX_E
15d10 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c  PH;.    if( inFl
15d20 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c  ags & IN_INDEX_L
15d30 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OOP ){.      pPa
15d40 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
15d50 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
15d60 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
15d70 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48  ){.      *prRhsH
15d80 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76  asNull = rMayHav
15d90 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  eNull = ++pParse
15da0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  ->nMem;.    }.  
15db0 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
15dc0 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 73  ==TK_IN );.    s
15dd0 71 6c 69 74 65 33 43 6f 64 65 52 68 73 4f 66 49  qlite3CodeRhsOfI
15de0 4e 28 70 50 61 72 73 65 2c 20 70 58 2c 20 69 54  N(pParse, pX, iT
15df0 61 62 29 3b 0a 20 20 20 20 69 66 28 20 72 4d 61  ab);.    if( rMa
15e00 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20  yHaveNull ){.   
15e10 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73     sqlite3SetHas
15e20 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62  NullFlag(v, iTab
15e30 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b  , rMayHaveNull);
15e40 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
15e50 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
15e60 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
15e70 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61  .  }..  if( aiMa
15e80 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49  p && eType!=IN_I
15e90 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 26  NDEX_INDEX_ASC &
15ea0 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45  & eType!=IN_INDE
15eb0 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a  X_INDEX_DESC ){.
15ec0 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20      int i, n;.  
15ed0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70    n = sqlite3Exp
15ee0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e  rVectorSize(pX->
15ef0 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72 28  pLeft);.    for(
15f00 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61  i=0; i<n; i++) a
15f10 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d  iMap[i] = i;.  }
15f20 0a 20 20 2a 70 69 54 61 62 20 3d 20 69 54 61 62  .  *piTab = iTab
15f30 3b 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  ;.  return eType
15f40 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
15f50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15f60 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41  SUBQUERY./*.** A
15f70 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73  rgument pExpr is
15f80 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e   an (?, ?...) IN
15f90 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
15fa0 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
15fb0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ion allocates an
15fc0 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d  d returns a nul-
15fd0 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
15fe0 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a  g containing .**
15ff0 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 20   the affinities 
16000 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
16010 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ach column of th
16020 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a  e comparison..**
16030 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
16040 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
16050 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e  the caller to en
16060 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
16070 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67  turned.** string
16080 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   is eventually f
16090 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  reed using sqlit
160a0 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  e3DbFree()..*/.s
160b0 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 72  tatic char *expr
160c0 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73 65  INAffinity(Parse
160d0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
160e0 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a  pExpr){.  Expr *
160f0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
16100 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  Left;.  int nVal
16110 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
16120 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
16130 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
16140 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61  ct = (pExpr->fla
16150 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
16160 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53  t) ? pExpr->x.pS
16170 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68 61  elect : 0;.  cha
16180 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65  r *zRet;..  asse
16190 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
161a0 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d  K_IN );.  zRet =
161b0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
161c0 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Raw(pParse->db, 
161d0 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a  nVal+1);.  if( z
161e0 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Ret ){.    int i
161f0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
16200 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
16210 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73 71     Expr *pA = sq
16220 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
16230 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69  Subexpr(pLeft, i
16240 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 20  );.      char a 
16250 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
16260 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20 20  inity(pA);.     
16270 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
16280 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20          zRet[i] 
16290 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
162a0 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63 74  Affinity(pSelect
162b0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
162c0 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20 20  Expr, a);.      
162d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
162e0 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20  Ret[i] = a;.    
162f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52    }.    }.    zR
16300 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b  et[nVal] = '\0';
16310 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
16320 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  et;.}.#endif..#i
16330 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16340 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
16350 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65 20   Load the Parse 
16360 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
16370 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
16380 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ent with an erro
16390 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66  r .** message of
163a0 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
163b0 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72     "sub-select r
163c0 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73  eturns N columns
163d0 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a 2a   - expected M".*
163e0 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  /   .void sqlite
163f0 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
16400 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
16410 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20  nt nActual, int 
16420 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73  nExpect){.  cons
16430 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22  t char *zFmt = "
16440 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
16450 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20  ns %d columns - 
16460 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20 20  expected %d";.  
16470 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16480 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41  pParse, zFmt, nA
16490 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b  ctual, nExpect);
164a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
164b0 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   Expression pExp
164c0 72 20 69 73 20 61 20 76 65 63 74 6f 72 20 74 68  r is a vector th
164d0 61 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64  at has been used
164e0 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20 77 68   in a context wh
164f0 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  ere.** it is not
16500 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66 20 70   permitted. If p
16510 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73 65  Expr is a sub-se
16520 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74 68 69  lect vector, thi
16530 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f  s routine .** lo
16540 61 64 73 20 74 68 65 20 50 61 72 73 65 20 6f 62  ads the Parse ob
16550 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65 73 73  ject with a mess
16560 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  age of the form:
16570 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65  .**.**   "sub-se
16580 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63  lect returns N c
16590 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
165a0 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  d 1".**.** Or, i
165b0 66 20 69 74 20 69 73 20 61 20 72 65 67 75 6c 61  f it is a regula
165c0 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f 72 3a  r scalar vector:
165d0 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61  .**.**   "row va
165e0 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20  lue misused".*/ 
165f0 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56    .void sqlite3V
16600 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 50 61  ectorErrorMsg(Pa
16610 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
16620 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e 64  r *pExpr){.#ifnd
16630 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16640 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 70 45  UBQUERY.  if( pE
16650 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
16660 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  xIsSelect ){.   
16670 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
16680 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
16690 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
166a0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
166b0 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  1);.  }else.#end
166c0 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  if.  {.    sqlit
166d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
166e0 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
166f0 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  sused");.  }.}..
16700 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16710 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
16720 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
16730 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 73 74   that will const
16740 72 75 63 74 20 61 6e 20 65 70 68 65 6d 65 72 61  ruct an ephemera
16750 6c 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  l table containi
16760 6e 67 20 61 6c 6c 20 74 65 72 6d 73 0a 2a 2a 20  ng all terms.** 
16770 69 6e 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e  in the RHS of an
16780 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 54   IN operator.  T
16790 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 63  he IN operator c
167a0 61 6e 20 62 65 20 69 6e 20 65 69 74 68 65 72 20  an be in either 
167b0 6f 66 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a  of two.** forms:
167c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  .**.**     x IN 
167d0 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20  (4,5,11)        
167e0 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72        -- IN oper
167f0 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f  ator with list o
16800 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
16810 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53  e.**     x IN (S
16820 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
16830 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
16840 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79  or with subquery
16850 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a   on the right.**
16860 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
16870 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 49  rameter is the I
16880 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65  N operator.  The
16890 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
168a0 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 74 72  or the.** constr
168b0 75 63 74 65 64 20 65 70 68 65 72 6d 65 72 61 6c  ucted ephermeral
168c0 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e   table is return
168d0 65 64 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  ed.  The first t
168e0 69 6d 65 20 74 68 65 20 65 70 68 65 6d 65 72 61  ime the ephemera
168f0 6c 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 63 6f  l.** table is co
16900 6d 70 75 74 65 64 2c 20 74 68 65 20 63 75 72 73  mputed, the curs
16910 6f 72 20 6e 75 6d 62 65 72 20 69 73 20 61 6c 73  or number is als
16920 6f 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  o stored in pExp
16930 72 2d 3e 69 54 61 62 6c 65 2c 0a 2a 2a 20 68 6f  r->iTable,.** ho
16940 77 65 76 65 72 20 74 68 65 20 63 75 72 73 6f 72  wever the cursor
16950 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
16960 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74 68   might not be th
16970 65 20 73 61 6d 65 2c 20 61 73 20 69 74 20 6d 69  e same, as it mi
16980 67 68 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  ght.** have been
16990 20 64 75 70 6c 69 63 61 74 65 64 20 75 73 69 6e   duplicated usin
169a0 67 20 4f 50 5f 4f 70 65 6e 44 75 70 2e 0a 2a 2a  g OP_OpenDup..**
169b0 0a 2a 2a 20 49 66 20 74 68 65 20 4c 48 53 20 65  .** If the LHS e
169c0 78 70 72 65 73 73 69 6f 6e 20 28 22 78 22 20 69  xpression ("x" i
169d0 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 73 29 20  n the examples) 
169e0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
169f0 65 2c 20 6f 72 0a 2a 2a 20 74 68 65 20 53 45 4c  e, or.** the SEL
16a00 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72 65  ECT statement re
16a10 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76  turns a column v
16a20 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61  alue, then the a
16a30 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a  ffinity of that.
16a40 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
16a50 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
16a60 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
16a70 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 2a  th 'x' and the.*
16a80 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
16a90 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
16aa0 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
16ab0 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
16ac0 0a 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f  .** if either co
16ad0 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43  lumn has NUMERIC
16ae0 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69   or INTEGER affi
16af0 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72  nity. If neither
16b00 0a 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20  .** 'x' nor the 
16b10 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
16b20 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
16b30 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
16b40 66 69 6e 69 74 79 0a 2a 2a 20 69 73 20 75 73 65  finity.** is use
16b50 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
16b60 65 33 43 6f 64 65 52 68 73 4f 66 49 4e 28 0a 20  e3CodeRhsOfIN(. 
16b70 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
16b80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
16b90 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
16ba0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
16bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16bc0 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
16bd0 20 69 6e 74 20 69 54 61 62 20 20 20 20 20 20 20   int iTab       
16be0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
16bf0 74 68 69 73 20 63 75 72 73 6f 72 20 6e 75 6d 62  this cursor numb
16c00 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  er */.){.  int a
16c10 64 64 72 4f 6e 63 65 20 3d 20 30 3b 20 20 20 20  ddrOnce = 0;    
16c20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
16c30 73 20 6f 66 20 74 68 65 20 4f 50 5f 4f 6e 63 65  s of the OP_Once
16c40 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20   instruction at 
16c50 74 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  top */.  int add
16c60 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
16c70 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
16c80 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  of OP_OpenEpheme
16c90 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
16ca0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
16cb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16cc0 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74   /* the LHS of t
16cd0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
16ce0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
16cf0 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20  yInfo = 0;      
16d00 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69  /* Key informati
16d10 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c  on */.  int nVal
16d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16d30 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76      /* Size of v
16d40 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20  ector pLeft */. 
16d50 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
16d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16d70 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
16d80 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
16d90 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  struction */..  
16da0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
16db0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
16dc0 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65  0 );..  /* The e
16dd0 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  valuation of the
16de0 20 49 4e 20 6d 75 73 74 20 62 65 20 72 65 70 65   IN must be repe
16df0 61 74 65 64 20 65 76 65 72 79 20 74 69 6d 65 20  ated every time 
16e00 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75  it.  ** is encou
16e10 6e 74 65 72 65 64 20 69 66 20 61 6e 79 20 6f 66  ntered if any of
16e20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
16e30 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a  s true:.  **.  *
16e40 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
16e50 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
16e60 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
16e70 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20  uery.  **    *  
16e80 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
16e90 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73  ide is an expres
16ea0 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69  sion list contai
16eb0 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20  ning variables. 
16ec0 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65   **    *  We are
16ed0 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65   inside a trigge
16ee0 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61  r.  **.  ** If a
16ef0 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
16f00 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20  are false, then 
16f10 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  we can compute t
16f20 68 65 20 52 48 53 20 6a 75 73 74 20 6f 6e 63 65  he RHS just once
16f30 0a 20 20 2a 2a 20 61 6e 64 20 72 65 75 73 65 20  .  ** and reuse 
16f40 69 74 20 6d 61 6e 79 20 6e 61 6d 65 73 2e 0a 20  it many names.. 
16f50 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
16f60 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16f70 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20  , EP_VarSelect) 
16f80 26 26 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66  && pParse->iSelf
16f90 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Tab==0 ){.    /*
16fa0 20 52 65 75 73 65 20 6f 66 20 74 68 65 20 52 48   Reuse of the RH
16fb0 53 20 69 73 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  S is allowed */.
16fc0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 72      /* If this r
16fd0 6f 75 74 69 6e 65 20 68 61 73 20 61 6c 72 65 61  outine has alrea
16fe0 64 79 20 62 65 65 6e 20 63 6f 64 65 64 2c 20 62  dy been coded, b
16ff0 75 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ut the previous 
17000 63 6f 64 65 0a 20 20 20 20 2a 2a 20 6d 69 67 68  code.    ** migh
17010 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
17020 69 6e 76 6f 6b 65 64 20 79 65 74 2c 20 73 6f 20  invoked yet, so 
17030 69 6e 76 6f 6b 65 20 69 74 20 6e 6f 77 20 61 73  invoke it now as
17040 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 0a   a subroutine. .
17050 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 45      */.    if( E
17060 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
17070 45 78 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29  Expr, EP_Subrtn)
17080 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
17090 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
170a0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
170b0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
170c0 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  (v);.      if( E
170d0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
170e0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
170f0 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ct) ){.        E
17100 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
17110 28 70 50 61 72 73 65 2c 20 30 2c 20 22 52 45 55  (pParse, 0, "REU
17120 53 45 20 4c 49 53 54 20 53 55 42 51 55 45 52 59  SE LIST SUBQUERY
17130 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
17140 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65      pExpr->x.pSe
17150 6c 65 63 74 2d 3e 73 65 6c 49 64 29 29 3b 0a 20  lect->selId));. 
17160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
17170 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17180 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 45 78 70  , OP_Gosub, pExp
17190 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75  r->y.sub.regRetu
171a0 72 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rn,.            
171b0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
171c0 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 29 3b  r->y.sub.iAddr);
171d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
171e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
171f0 70 65 6e 44 75 70 2c 20 69 54 61 62 2c 20 70 45  penDup, iTab, pE
17200 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
17210 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
17220 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f  umpHere(v, addrO
17230 6e 63 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  nce);.      retu
17240 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rn;.    }..    /
17250 2a 20 42 65 67 69 6e 20 63 6f 64 69 6e 67 20 74  * Begin coding t
17260 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  he subroutine */
17270 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
17280 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
17290 75 62 72 74 6e 29 3b 0a 20 20 20 20 70 45 78 70  ubrtn);.    pExp
172a0 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75  r->y.sub.regRetu
172b0 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
172c0 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  Mem;.    pExpr->
172d0 79 2e 73 75 62 2e 69 41 64 64 72 20 3d 0a 20 20  y.sub.iAddr =.  
172e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
172f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
17300 67 65 72 2c 20 30 2c 20 70 45 78 70 72 2d 3e 79  ger, 0, pExpr->y
17310 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29 20  .sub.regReturn) 
17320 2b 20 31 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  + 1;.    VdbeCom
17330 6d 65 6e 74 28 28 76 2c 20 22 72 65 74 75 72 6e  ment((v, "return
17340 20 61 64 64 72 65 73 73 22 29 29 3b 0a 0a 20 20   address"));..  
17350 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c    addrOnce = sql
17360 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
17370 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
17380 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
17390 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
173a0 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20 61  see if this is a
173b0 20 76 65 63 74 6f 72 20 49 4e 20 6f 70 65 72 61   vector IN opera
173c0 74 6f 72 20 2a 2f 0a 20 20 70 4c 65 66 74 20 3d  tor */.  pLeft =
173d0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
173e0 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45   nVal = sqlite3E
173f0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
17400 65 66 74 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73  eft);..  /* Cons
17410 74 72 75 63 74 20 74 68 65 20 65 70 68 65 6d 65  truct the epheme
17420 72 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 77  ral table that w
17430 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ill contain the 
17440 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 2a 2a 20  content of.  ** 
17450 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
17460 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 70  erator..  */.  p
17470 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
17480 54 61 62 3b 0a 20 20 61 64 64 72 20 3d 20 73 71  Tab;.  addr = sq
17490 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
174a0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
174b0 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ral, pExpr->iTab
174c0 6c 65 2c 20 6e 56 61 6c 29 3b 0a 23 69 66 64 65  le, nVal);.#ifde
174d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
174e0 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
174f0 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
17500 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
17510 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
17520 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
17530 76 2c 20 22 52 65 73 75 6c 74 20 6f 66 20 53 45  v, "Result of SE
17540 4c 45 43 54 20 25 75 22 2c 20 70 45 78 70 72 2d  LECT %u", pExpr-
17550 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49  >x.pSelect->selI
17560 64 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d));.  }else{.  
17570 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
17580 2c 20 22 52 48 53 20 6f 66 20 49 4e 20 6f 70 65  , "RHS of IN ope
17590 72 61 74 6f 72 22 29 29 3b 0a 20 20 7d 0a 23 65  rator"));.  }.#e
175a0 6e 64 69 66 0a 20 20 70 4b 65 79 49 6e 66 6f 20  ndif.  pKeyInfo 
175b0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
175c0 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
175d0 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 69  , nVal, 1);..  i
175e0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
175f0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
17600 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 2f  Select) ){.    /
17610 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
17620 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
17630 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  .).    **.    **
17640 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
17650 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
17660 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
17670 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
17680 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
17690 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
176a0 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
176b0 20 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20    */.    Select 
176c0 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72  *pSelect = pExpr
176d0 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
176e0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
176f0 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
17700 69 73 74 3b 0a 0a 20 20 20 20 45 78 70 6c 61 69  ist;..    Explai
17710 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
17720 73 65 2c 20 31 2c 20 22 25 73 4c 49 53 54 20 53  se, 1, "%sLIST S
17730 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20  UBQUERY %d",.   
17740 20 20 20 20 20 61 64 64 72 4f 6e 63 65 3f 22 22       addrOnce?""
17750 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 20  :"CORRELATED ", 
17760 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64 0a 20  pSelect->selId. 
17770 20 20 20 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66     ));.    /* If
17780 20 74 68 65 20 4c 48 53 20 61 6e 64 20 52 48 53   the LHS and RHS
17790 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
177a0 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  tor do not match
177b0 2c 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 65 72  , that.    ** er
177c0 72 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65  ror will have be
177d0 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 62  en caught long b
177e0 65 66 6f 72 65 20 77 65 20 72 65 61 63 68 20 74  efore we reach t
177f0 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
17800 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c    if( ALWAYS(pEL
17810 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c  ist->nExpr==nVal
17820 29 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  ) ){.      Selec
17830 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
17840 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
17850 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
17860 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
17870 53 65 74 2c 20 69 54 61 62 29 3b 0a 20 20 20 20  Set, iTab);.    
17880 20 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 20    dest.zAffSdst 
17890 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79  = exprINAffinity
178a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
178b0 0a 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e  .      pSelect->
178c0 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
178d0 20 20 74 65 73 74 63 61 73 65 28 20 70 53 65 6c    testcase( pSel
178e0 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
178f0 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
17900 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
17910 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a  KeyInfo==0 ); /*
17920 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69   Caused by OOM i
17930 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  n sqlite3KeyInfo
17940 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20  Alloc() */.     
17950 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
17960 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
17970 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  ct, &dest) ){.  
17980 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
17990 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
179a0 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a  dest.zAffSdst);.
179b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b          sqlite3K
179c0 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
179d0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 72  Info);.        r
179e0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
179f0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
17a00 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64  ee(pParse->db, d
17a10 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20  est.zAffSdst);. 
17a20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65       assert( pKe
17a30 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f  yInfo!=0 ); /* O
17a40 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78  OM will cause ex
17a50 69 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33  it after sqlite3
17a60 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20  Select() */.    
17a70 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
17a80 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
17a90 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ert( pEList->nEx
17aa0 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  pr>0 );.      as
17ab0 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
17ac0 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
17ad0 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20  pKeyInfo) );.   
17ae0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
17af0 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
17b00 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
17b10 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
17b20 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b  bexpr(pLeft, i);
17b30 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66  .        pKeyInf
17b40 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  o->aColl[i] = sq
17b50 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
17b60 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20  reCollSeq(.     
17b70 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
17b80 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
17b90 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  Expr.        );.
17ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17bb0 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
17bc0 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21  (pExpr->x.pList!
17bd0 3d 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  =0) ){.    /* Ca
17be0 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49  se 2:     expr I
17bf0 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20  N (exprlist).   
17c00 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 65   **.    ** For e
17c10 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
17c20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
17c30 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
17c40 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 2a  uation and.    *
17c50 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
17c60 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
17c70 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
17c80 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
17c90 73 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63  se.    ** that c
17ca0 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
17cb0 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
17cc0 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
17cd0 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  pr> is not.    *
17ce0 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20  * a column, use 
17cf0 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
17d00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61  ..    */.    cha
17d10 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20  r affinity;     
17d20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
17d30 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66  ty of the LHS of
17d40 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 69   the IN */.    i
17d50 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69  nt i;.    ExprLi
17d60 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
17d70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
17d80 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
17d90 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
17da0 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
17db0 0a 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20  .    affinity = 
17dc0 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
17dd0 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ity(pLeft);.    
17de0 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b  if( !affinity ){
17df0 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20  .      affinity 
17e00 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
17e10 42 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  B;.    }.    if(
17e20 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
17e30 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
17e40 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
17e50 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29  able(pKeyInfo) )
17e60 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
17e70 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c  ->aColl[0] = sql
17e80 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
17e90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
17ea0 4c 65 66 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Left);.    }..  
17eb0 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
17ec0 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
17ed0 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e  n in <exprlist>.
17ee0 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c   */.    r1 = sql
17ef0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
17f00 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d  Parse);.    r2 =
17f10 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17f20 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
17f30 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
17f40 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
17f50 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
17f60 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  tem++){.      Ex
17f70 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d  pr *pE2 = pItem-
17f80 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 2f  >pExpr;..      /
17f90 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
17fa0 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  ion is not const
17fb0 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ant then we will
17fc0 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a   need to.      *
17fd0 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
17fe0 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
17ff0 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
18000 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
18010 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f    ** this code o
18020 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63  nly executes onc
18030 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20  e.  Because for 
18040 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20  a non-constant. 
18050 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
18060 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  on we need to re
18070 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61  run this code ea
18080 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 2a  ch time..      *
18090 2f 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  /.      if( addr
180a0 4f 6e 63 65 20 26 26 20 21 73 71 6c 69 74 65 33  Once && !sqlite3
180b0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
180c0 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  E2) ){.        s
180d0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
180e0 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 4f 6e  ToNoop(v, addrOn
180f0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  ce);.        Exp
18100 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70  rClearProperty(p
18110 45 78 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29  Expr, EP_Subrtn)
18120 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f 6e  ;.        addrOn
18130 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ce = 0;.      }.
18140 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61  .      /* Evalua
18150 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  te the expressio
18160 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  n and insert it 
18170 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
18180 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 72 33 20  ble */.      r3 
18190 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
181a0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
181b0 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  pE2, r1);.      
181c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
181d0 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
181e0 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26  rd, r3, 1, r2, &
181f0 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
18200 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18210 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
18220 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20  dxInsert, iTab, 
18230 72 32 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20  r2, r3, 1);.    
18240 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  }.    sqlite3Rel
18250 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18260 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c  se, r1);.    sql
18270 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
18280 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
18290 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 49 6e    }.  if( pKeyIn
182a0 66 6f 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  fo ){.    sqlite
182b0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
182c0 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70   addr, (void *)p
182d0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
182e0 4e 46 4f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NFO);.  }.  if( 
182f0 61 64 64 72 4f 6e 63 65 20 29 7b 0a 20 20 20 20  addrOnce ){.    
18300 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
18310 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29  ere(v, addrOnce)
18320 3b 0a 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74  ;.    /* Subrout
18330 69 6e 65 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  ine return */.  
18340 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18350 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
18360 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72  , pExpr->y.sub.r
18370 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 73  egReturn);.    s
18380 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
18390 50 31 28 76 2c 20 70 45 78 70 72 2d 3e 79 2e 73  P1(v, pExpr->y.s
183a0 75 62 2e 69 41 64 64 72 2d 31 2c 20 73 71 6c 69  ub.iAddr-1, sqli
183b0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
183c0 64 72 28 76 29 2d 31 29 3b 0a 20 20 7d 0a 7d 0a  dr(v)-1);.  }.}.
183d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
183e0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
183f0 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  /../*.** Generat
18400 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
18410 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
18420 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20  d as a subquery 
18430 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6f 72  expression.** or
18440 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
18450 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c  :.**.**     (SEL
18460 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
18470 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65         -- subque
18480 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53  ry.**     EXISTS
18490 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
184a0 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73  b)   -- EXISTS s
184b0 75 62 71 75 65 72 79 0a 2a 2a 0a 2a 2a 20 54 68  ubquery.**.** Th
184c0 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65  e pExpr paramete
184d0 72 20 69 73 20 74 68 65 20 53 45 4c 45 43 54 20  r is the SELECT 
184e0 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
184f0 6f 72 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  or to be coded..
18500 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74  **.** The regist
18510 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  er that holds th
18520 65 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 61  e result.  For a
18530 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 53 45   multi-column SE
18540 4c 45 43 54 2c 20 0a 2a 2a 20 74 68 65 20 72 65  LECT, .** the re
18550 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69  sult is stored i
18560 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 61  n a contiguous a
18570 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
18580 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65 74  s and the.** ret
18590 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
185a0 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65   register of the
185b0 20 6c 65 66 74 2d 6d 6f 73 74 20 72 65 73 75 6c   left-most resul
185c0 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 52 65 74  t column..** Ret
185d0 75 72 6e 20 30 20 69 66 20 61 6e 20 65 72 72 6f  urn 0 if an erro
185e0 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23 69 66  r occurs..*/.#if
185f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18600 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
18610 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
18620 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
18630 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
18640 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d    int addrOnce =
18650 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
18660 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
18670 6e 63 65 20 61 74 20 74 6f 70 20 6f 66 20 73 75  nce at top of su
18680 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
18690 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20  t rReg = 0;     
186a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
186b0 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65  ister storing re
186c0 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 53 65 6c  sulting */.  Sel
186d0 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20  ect *pSel;      
186e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
186f0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
18700 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 53 65 6c 65  encode */.  Sele
18710 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
18720 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
18730 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45  o deal with SELE
18740 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69  CT result */.  i
18750 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20  nt nReg;        
18760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18770 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
18780 61 74 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ate */.  Expr *p
18790 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20  Limit;          
187a0 20 20 20 20 20 2f 2a 20 4e 65 77 20 6c 69 6d 69       /* New limi
187b0 74 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  t expression */.
187c0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
187d0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
187e0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
187f0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
18800 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
18810 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
18820 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
18830 43 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CT );.  assert( 
18840 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
18850 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  ISTS || pExpr->o
18860 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
18870 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
18880 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
18890 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
188a0 3b 0a 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72  ;.  pSel = pExpr
188b0 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 0a 20 20  ->x.pSelect;..  
188c0 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f  /* The evaluatio
188d0 6e 20 6f 66 20 74 68 65 20 45 58 49 53 54 53 2f  n of the EXISTS/
188e0 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 72  SELECT must be r
188f0 65 70 65 61 74 65 64 20 65 76 65 72 79 20 74 69  epeated every ti
18900 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e  me it.  ** is en
18910 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61 6e 79  countered if any
18920 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
18930 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a  g is true:.  **.
18940 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
18950 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
18960 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
18970 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20  ubquery.  **    
18980 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
18990 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70  d side is an exp
189a0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  ression list con
189b0 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65  taining variable
189c0 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20  s.  **    *  We 
189d0 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69  are inside a tri
189e0 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gger.  **.  ** I
189f0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f  f all of the abo
18a00 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68  ve are false, th
18a10 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68  en we can run th
18a20 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63  is code just onc
18a30 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20  e.  ** save the 
18a40 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75  results, and reu
18a50 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  se the same resu
18a60 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74  lt on subsequent
18a70 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20   invocations..  
18a80 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  */.  if( !ExprHa
18a90 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
18aa0 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29   EP_VarSelect) )
18ab0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
18ac0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 61 6c 72   routine has alr
18ad0 65 61 64 79 20 62 65 65 6e 20 63 6f 64 65 64 2c  eady been coded,
18ae0 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 69 74 20   then invoke it 
18af0 61 73 20 61 0a 20 20 20 20 2a 2a 20 73 75 62 72  as a.    ** subr
18b00 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 69  outine. */.    i
18b10 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
18b20 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 75 62  ty(pExpr, EP_Sub
18b30 72 74 6e 29 20 29 7b 0a 20 20 20 20 20 20 45 78  rtn) ){.      Ex
18b40 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
18b50 70 50 61 72 73 65 2c 20 30 2c 20 22 52 45 55 53  pParse, 0, "REUS
18b60 45 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20  E SUBQUERY %d", 
18b70 70 53 65 6c 2d 3e 73 65 6c 49 64 29 29 3b 0a 20  pSel->selId));. 
18b80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18b90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
18ba0 75 62 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62  ub, pExpr->y.sub
18bb0 2e 72 65 67 52 65 74 75 72 6e 2c 0a 20 20 20 20  .regReturn,.    
18bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bd0 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62      pExpr->y.sub
18be0 2e 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72  .iAddr);.      r
18bf0 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 54 61  eturn pExpr->iTa
18c00 62 6c 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ble;.    }..    
18c10 2f 2a 20 42 65 67 69 6e 20 63 6f 64 69 6e 67 20  /* Begin coding 
18c20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  the subroutine *
18c30 2f 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  /.    ExprSetPro
18c40 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
18c50 53 75 62 72 74 6e 29 3b 0a 20 20 20 20 70 45 78  Subrtn);.    pEx
18c60 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74  pr->y.sub.regRet
18c70 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
18c80 6e 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d  nMem;.    pExpr-
18c90 3e 79 2e 73 75 62 2e 69 41 64 64 72 20 3d 0a 20  >y.sub.iAddr =. 
18ca0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18cb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
18cc0 65 67 65 72 2c 20 30 2c 20 70 45 78 70 72 2d 3e  eger, 0, pExpr->
18cd0 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29  y.sub.regReturn)
18ce0 20 2b 20 31 3b 0a 20 20 20 20 56 64 62 65 43 6f   + 1;.    VdbeCo
18cf0 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 74 75 72  mment((v, "retur
18d00 6e 20 61 64 64 72 65 73 73 22 29 29 3b 0a 0a 20  n address"));.. 
18d10 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
18d20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
18d30 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
18d40 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18d50 7d 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 20 61 20  }.  .  /* For a 
18d60 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74 65  SELECT, generate
18d70 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65   code to put the
18d80 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20   values for all 
18d90 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20  columns of.  ** 
18da0 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e  the first row in
18db0 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  to an array of r
18dc0 65 67 69 73 74 65 72 73 20 61 6e 64 20 72 65 74  egisters and ret
18dd0 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
18de0 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
18df0 72 65 67 69 73 74 65 72 2e 0a 20 20 2a 2a 0a 20  register..  **. 
18e00 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
18e10 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65 20  n EXISTS, write 
18e20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f  an integer 0 (no
18e30 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20 28  t exists) or 1 (
18e40 65 78 69 73 74 73 29 0a 20 20 2a 2a 20 69 6e 74  exists).  ** int
18e50 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e 64  o a register and
18e60 20 72 65 74 75 72 6e 20 74 68 61 74 20 72 65 67   return that reg
18e70 69 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20  ister number..  
18e80 2a 2a 0a 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20  **.  ** In both 
18e90 63 61 73 65 73 2c 20 74 68 65 20 71 75 65 72 79  cases, the query
18ea0 20 69 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69   is augmented wi
18eb0 74 68 20 22 4c 49 4d 49 54 20 31 22 2e 20 20 41  th "LIMIT 1".  A
18ec0 6e 79 20 0a 20 20 2a 2a 20 70 72 65 65 78 69 73  ny .  ** preexis
18ed0 74 69 6e 67 20 6c 69 6d 69 74 20 69 73 20 64 69  ting limit is di
18ee0 73 63 61 72 64 65 64 20 69 6e 20 70 6c 61 63 65  scarded in place
18ef0 20 6f 66 20 74 68 65 20 6e 65 77 20 4c 49 4d 49   of the new LIMI
18f00 54 20 31 2e 0a 20 20 2a 2f 0a 20 20 45 78 70 6c  T 1..  */.  Expl
18f10 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
18f20 61 72 73 65 2c 20 31 2c 20 22 25 73 53 43 41 4c  arse, 1, "%sSCAL
18f30 41 52 20 53 55 42 51 55 45 52 59 20 25 64 22 2c  AR SUBQUERY %d",
18f40 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f 6e 63  .        addrOnc
18f50 65 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44  e?"":"CORRELATED
18f60 20 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64 29   ", pSel->selId)
18f70 29 3b 0a 20 20 6e 52 65 67 20 3d 20 70 45 78 70  );.  nReg = pExp
18f80 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
18f90 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d   ? pSel->pEList-
18fa0 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20 20 73 71  >nExpr : 1;.  sq
18fb0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
18fc0 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 70 50  nit(&dest, 0, pP
18fd0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20  arse->nMem+1);. 
18fe0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
18ff0 20 6e 52 65 67 3b 0a 20 20 69 66 28 20 70 45 78   nReg;.  if( pEx
19000 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
19010 54 20 29 7b 0a 20 20 20 20 64 65 73 74 2e 65 44  T ){.    dest.eD
19020 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20  est = SRT_Mem;. 
19030 20 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20     dest.iSdst = 
19040 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
19050 20 20 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e    dest.nSdst = n
19060 52 65 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Reg;.    sqlite3
19070 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19080 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69  _Null, 0, dest.i
19090 53 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44  SDParm, dest.iSD
190a0 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20  Parm+nReg-1);.  
190b0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
190c0 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79  , "Init subquery
190d0 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 7d 65   result"));.  }e
190e0 6c 73 65 7b 0a 20 20 20 20 64 65 73 74 2e 65 44  lse{.    dest.eD
190f0 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73  est = SRT_Exists
19100 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19110 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
19120 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69  teger, 0, dest.i
19130 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 56 64 62  SDParm);.    Vdb
19140 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e  eComment((v, "In
19150 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74  it EXISTS result
19160 22 29 29 3b 0a 20 20 7d 0a 20 20 70 4c 69 6d 69  "));.  }.  pLimi
19170 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
19180 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
19190 20 54 4b 5f 49 4e 54 45 47 45 52 2c 26 73 71 6c   TK_INTEGER,&sql
191a0 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d  ite3IntTokens[1]
191b0 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  , 0);.  if( pSel
191c0 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
191d0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
191e0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
191f0 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  el->pLimit->pLef
19200 74 29 3b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 4c  t);.    pSel->pL
19210 69 6d 69 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  imit->pLeft = pL
19220 69 6d 69 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  imit;.  }else{. 
19230 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20     pSel->pLimit 
19240 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
19250 50 61 72 73 65 2c 20 54 4b 5f 4c 49 4d 49 54 2c  Parse, TK_LIMIT,
19260 20 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 7d   pLimit, 0);.  }
19270 0a 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20  .  pSel->iLimit 
19280 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
19290 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
192a0 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b   pSel, &dest) ){
192b0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
192c0 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62   }.  pExpr->iTab
192d0 6c 65 20 3d 20 72 52 65 67 20 3d 20 64 65 73 74  le = rReg = dest
192e0 2e 69 53 44 50 61 72 6d 3b 0a 20 20 45 78 70 72  .iSDParm;.  Expr
192f0 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
19300 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
19310 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 4f 6e  e);.  if( addrOn
19320 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ce ){.    sqlite
19330 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
19340 20 61 64 64 72 4f 6e 63 65 29 3b 0a 0a 20 20 20   addrOnce);..   
19350 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72   /* Subroutine r
19360 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 73 71 6c  eturn */.    sql
19370 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
19380 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 45 78  , OP_Return, pEx
19390 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74  pr->y.sub.regRet
193a0 75 72 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  urn);.    sqlite
193b0 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
193c0 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41   pExpr->y.sub.iA
193d0 64 64 72 2d 31 2c 20 73 71 6c 69 74 65 33 56 64  ddr-1, sqlite3Vd
193e0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
193f0 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  -1);.  }..  retu
19400 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69  rn rReg;.}.#endi
19410 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
19420 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
19430 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19440 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
19450 20 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20   Expr pIn is an 
19460 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  IN(...) expressi
19470 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
19480 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  n checks that th
19490 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74  e .** sub-select
194a0 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
194b0 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72  he IN() operator
194c0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75   has the same nu
194d0 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75  mber of .** colu
194e0 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63 74 6f  mns as the vecto
194f0 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72  r on the LHS. Or
19500 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  , if the RHS of 
19510 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20  the IN() is not 
19520 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c  .** a sub-query,
19530 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 69 73   that the LHS is
19540 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a   a vector of siz
19550 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 1..*/.int sqli
19560 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50  te3ExprCheckIN(P
19570 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
19580 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20  pr *pIn){.  int 
19590 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
195a0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
195b0 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  pIn->pLeft);.  i
195c0 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26  f( (pIn->flags &
195d0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
195e0 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f  {.    if( nVecto
195f0 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63  r!=pIn->x.pSelec
19600 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
19610 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19620 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
19630 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70  pParse, pIn->x.p
19640 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
19650 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b  nExpr, nVector);
19660 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
19670 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
19680 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b  f( nVector!=1 ){
19690 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65 63 74  .    sqlite3Vect
196a0 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  orErrorMsg(pPars
196b0 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a  e, pIn->pLeft);.
196c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
196d0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
196e0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
196f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
19700 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
19710 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
19720 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  IN expression..*
19730 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
19740 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20  SELECT ...).**  
19750 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c      x IN (value,
19760 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a   value, ...).**.
19770 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  ** The left-hand
19780 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61   side (LHS) is a
19790 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f   scalar or vecto
197a0 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  r expression.  T
197b0 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e  he .** right-han
197c0 64 20 73 69 64 65 20 28 52 48 53 29 20 69 73 20  d side (RHS) is 
197d0 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
197e0 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20   or more scalar 
197f0 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20  values, or a.** 
19800 73 75 62 71 75 65 72 79 2e 20 20 49 66 20 74 68  subquery.  If th
19810 65 20 52 48 53 20 69 73 20 61 20 73 75 62 71 75  e RHS is a subqu
19820 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  ery, the number 
19830 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
19840 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20  s must.** match 
19850 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
19860 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63  lumns in the vec
19870 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
19880 20 49 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a   If the RHS is.*
19890 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  * a list of valu
198a0 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74  es, the LHS must
198b0 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a   be a scalar. .*
198c0 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72  *.** The IN oper
198d0 61 74 6f 72 20 69 73 20 74 72 75 65 20 69 66 20  ator is true if 
198e0 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73  the LHS value is
198f0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
19900 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68  n the RHS..** Th
19910 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73  e result is fals
19920 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
19930 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69  definitely not i
19940 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20  n the RHS.  The 
19950 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55  .** result is NU
19960 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73 65 6e  LL if the presen
19970 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e  ce of the LHS in
19980 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20   the RHS cannot 
19990 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  be .** determine
199a0 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a  d due to NULLs..
199b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
199c0 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
199d0 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20  e that jumps to 
199e0 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74  destIfFalse if t
199f0 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a  he LHS is not .*
19a00 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
19a10 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
19a20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20  due to NULLs we 
19a30 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
19a40 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69   if the LHS.** i
19a50 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
19a60 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70  he RHS then jump
19a70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20   to destIfNull. 
19a80 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   If the LHS is c
19a90 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68  ontained.** with
19aa0 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
19ab0 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a  fall through..**
19ac0 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70 61  .** See the sepa
19ad0 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72  rate in-operator
19ae0 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .md documentatio
19af0 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61  n file in the ca
19b00 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74  nonical.** SQLit
19b10 65 20 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f  e source tree fo
19b20 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
19b30 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
19b40 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
19b50 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61  ExprCodeIN(.  Pa
19b60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
19b70 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
19b80 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
19b90 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
19ba0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
19bb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
19bc0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
19bd0 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c  int destIfFalse,
19be0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
19bf0 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74  re if LHS is not
19c00 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
19c10 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64  e RHS */.  int d
19c20 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20  estIfNull       
19c30 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
19c40 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
19c50 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20   unknown due to 
19c60 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  NULLs */.){.  in
19c70 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  t rRhsHasNull = 
19c80 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  0;  /* Register 
19c90 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20  that is true if 
19ca0 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
19cb0 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  L values */.  in
19cc0 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
19cd0 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
19ce0 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
19cf0 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  rLhs;           
19d00 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29    /* Register(s)
19d10 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53   holding the LHS
19d20 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
19d30 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20   rLhsOrig;      
19d40 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73     /* LHS values
19d50 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65   prior to reorde
19d60 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20  ring by aiMap[] 
19d70 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
19d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
19d90 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
19da0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
19db0 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20  int *aiMap = 0; 
19dc0 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f        /* Map fro
19dd0 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74  m vector field t
19de0 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a  o index column *
19df0 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d  /.  char *zAff =
19e00 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66   0;       /* Aff
19e10 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72  inity string for
19e20 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a   comparisons */.
19e30 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20    int nVector;  
19e40 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
19e50 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74  of vectors for t
19e60 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  his IN operator 
19e70 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b  */.  int iDummy;
19e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75             /* Du
19e90 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f  mmy parameter to
19ea0 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
19eb0 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  ) */.  Expr *pLe
19ec0 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ft;          /* 
19ed0 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
19ee0 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
19ef0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
19f00 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f        /* loop co
19f10 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64  unter */.  int d
19f20 65 73 74 53 74 65 70 32 3b 20 20 20 20 20 20 20  estStep2;       
19f30 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d   /* Where to jum
19f40 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65  p when NULLs see
19f50 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20  n in step 2 */. 
19f60 20 69 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d   int destStep6 =
19f70 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20   0;    /* Start 
19f80 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70  of code for Step
19f90 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72   6 */.  int addr
19fa0 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a  TruthOp;      /*
19fb0 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f   Address of opco
19fc0 64 65 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  de that determin
19fd0 65 73 20 74 68 65 20 49 4e 20 69 73 20 74 72 75  es the IN is tru
19fe0 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e  e */.  int destN
19ff0 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20  otNull;      /* 
1a000 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 20 63  Jump here if a c
1a010 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74  omparison is not
1a020 20 74 72 75 65 20 69 6e 20 73 74 65 70 20 36 20   true in step 6 
1a030 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
1a040 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
1a050 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20  p of the step-6 
1a060 6c 6f 6f 70 20 2a 2f 20 0a 20 20 69 6e 74 20 69  loop */ .  int i
1a070 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
1a080 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 75 73 65   /* Index to use
1a090 20 2a 2f 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70   */..  pLeft = p
1a0a0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
1a0b0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  f( sqlite3ExprCh
1a0c0 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70 45  eckIN(pParse, pE
1a0d0 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  xpr) ) return;. 
1a0e0 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41 66   zAff = exprINAf
1a0f0 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
1a100 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72  Expr);.  nVector
1a110 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
1a120 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
1a130 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20  pLeft);.  aiMap 
1a140 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44  = (int*)sqlite3D
1a150 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  bMallocZero(.   
1a160 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e     pParse->db, n
1a170 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69  Vector*(sizeof(i
1a180 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  nt) + sizeof(cha
1a190 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69  r)) + 1.  );.  i
1a1a0 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
1a1b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
1a1c0 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  to sqlite3ExprCo
1a1d0 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a  deIN_oom_error;.
1a1e0 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
1a1f0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   compute the RHS
1a200 2e 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65  . After this ste
1a210 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67 20 6f  p, if anything o
1a220 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49  ther than.  ** I
1a230 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
1a240 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 74 61  returned, the ta
1a250 62 6c 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20  ble opened with 
1a260 63 75 72 73 6f 72 20 69 54 61 62 0a 20 20 2a 2a  cursor iTab.  **
1a270 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
1a280 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
1a290 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e  p the RHS. If IN
1a2a0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72  _INDEX_NOOP is r
1a2b0 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68  eturned,.  ** th
1a2c0 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65  e RHS has not ye
1a2d0 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a  t been coded.  *
1a2e0 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
1a2f0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
1a300 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
1a310 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
1a320 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
1a330 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
1a340 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
1a350 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
1a360 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
1a370 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
1a380 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20  arse, pExpr,.   
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3a0 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44            IN_IND
1a3b0 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20  EX_MEMBERSHIP | 
1a3c0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
1a3d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1a3f0 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
1a400 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52  IfNull ? 0 : &rR
1a410 68 73 48 61 73 4e 75 6c 6c 2c 0a 20 20 20 20 20  hsHasNull,.     
1a420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a430 20 20 20 20 20 20 20 20 61 69 4d 61 70 2c 20 26          aiMap, &
1a440 69 54 61 62 29 3b 0a 0a 20 20 61 73 73 65 72 74  iTab);..  assert
1a450 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1a460 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20  | nVector==1 || 
1a470 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
1a480 45 50 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  EPH.       || eT
1a490 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
1a4a0 44 45 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65  DEX_ASC || eType
1a4b0 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
1a4c0 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23 69 66 64  _DESC .  );.#ifd
1a4d0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1a4e0 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61    /* Confirm tha
1a4f0 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69  t aiMap[] contai
1a500 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e 74 65 67  ns nVector integ
1a510 65 72 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  er values betwee
1a520 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65  n 0 and.  ** nVe
1a530 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72  ctor-1. */.  for
1a540 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
1a550 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
1a560 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63  , cnt;.    for(c
1a570 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f  nt=j=0; j<nVecto
1a580 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61  r; j++) if( aiMa
1a590 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b  p[j]==i ) cnt++;
1a5a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6e 74  .    assert( cnt
1a5b0 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ==1 );.  }.#endi
1a5c0 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  f..  /* Code the
1a5d0 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e   LHS, the <expr>
1a5e0 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
1a5f0 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20   (...)". If the 
1a600 4c 48 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76  LHS is a .  ** v
1a610 65 63 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69  ector, then it i
1a620 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  s stored in an a
1a630 72 72 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20  rray of nVector 
1a640 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
1a650 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a  ng .  ** at r1..
1a660 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65    **.  ** sqlite
1a670 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d  3FindInIndex() m
1a680 69 67 68 74 20 68 61 76 65 20 72 65 6f 72 64 65  ight have reorde
1a690 72 65 64 20 74 68 65 20 66 69 65 6c 64 73 20 6f  red the fields o
1a6a0 66 20 74 68 65 20 4c 48 53 20 76 65 63 74 6f 72  f the LHS vector
1a6b0 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  .  ** so that th
1a6c0 65 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 20  e fields are in 
1a6d0 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61  the same order a
1a6e0 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e  s an existing in
1a6f0 64 65 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20  dex.   The.  ** 
1a700 61 69 4d 61 70 5b 5d 20 61 72 72 61 79 20 63 6f  aiMap[] array co
1a710 6e 74 61 69 6e 73 20 61 20 6d 61 70 70 69 6e 67  ntains a mapping
1a720 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
1a730 61 6c 20 4c 48 53 20 66 69 65 6c 64 20 6f 72 64  al LHS field ord
1a740 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66  er to.  ** the f
1a750 69 65 6c 64 20 6f 72 64 65 72 20 74 68 61 74 20  ield order that 
1a760 6d 61 74 63 68 65 73 20 74 68 65 20 52 48 53 20  matches the RHS 
1a770 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 72 4c  index..  */.  rL
1a780 68 73 4f 72 69 67 20 3d 20 65 78 70 72 43 6f 64  hsOrig = exprCod
1a790 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20  eVector(pParse, 
1a7a0 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b  pLeft, &iDummy);
1a7b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
1a7c0 65 63 74 6f 72 20 26 26 20 61 69 4d 61 70 5b 69  ector && aiMap[i
1a7d0 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20  ]==i; i++){} /* 
1a7e0 41 72 65 20 4c 48 53 20 66 69 65 6c 64 73 20 72  Are LHS fields r
1a7f0 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69  eordered? */.  i
1a800 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b  f( i==nVector ){
1a810 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c  .    /* LHS fiel
1a820 64 73 20 61 72 65 20 6e 6f 74 20 72 65 6f 72 64  ds are not reord
1a830 65 72 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73  ered */.    rLhs
1a840 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d   = rLhsOrig;.  }
1a850 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  else{.    /* Nee
1a860 64 20 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65  d to reorder the
1a870 20 4c 48 53 20 66 69 65 6c 64 73 20 61 63 63 6f   LHS fields acco
1a880 72 64 69 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a  rding to aiMap *
1a890 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 73 71 6c  /.    rLhs = sql
1a8a0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
1a8b0 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72  (pParse, nVector
1a8c0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1a8d0 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
1a8e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a8f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1a900 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c  opy, rLhsOrig+i,
1a910 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20   rLhs+aiMap[i], 
1a920 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
1a930 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69   /* If sqlite3Fi
1a940 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20  ndInIndex() did 
1a950 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61  not find or crea
1a960 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  te an index that
1a970 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c   is.  ** suitabl
1a980 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67  e for evaluating
1a990 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
1a9a0 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20  , then evaluate 
1a9b0 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71  using a.  ** seq
1a9c0 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69  uence of compari
1a9d0 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  sons..  **.  ** 
1a9e0 54 68 69 73 20 69 73 20 73 74 65 70 20 28 31 29  This is step (1)
1a9f0 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72 61   in the in-opera
1aa00 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64  tor.md optimized
1aa10 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f   algorithm..  */
1aa20 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e  .  if( eType==IN
1aa30 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20  _INDEX_NOOP ){. 
1aa40 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
1aa50 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
1aa60 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  ist;.    CollSeq
1aa70 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
1aa80 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1aa90 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1aaa0 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65  t);.    int labe
1aab0 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lOk = sqlite3Vdb
1aac0 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
1aad0 65 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20  e);.    int r2, 
1aae0 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69  regToFree;.    i
1aaf0 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30  nt regCkNull = 0
1ab00 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  ;.    int ii;.  
1ab10 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1ab20 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1ab30 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1ab40 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49  );.    if( destI
1ab50 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c  fNull!=destIfFal
1ab60 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65 67 43  se ){.      regC
1ab70 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  kNull = sqlite3G
1ab80 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1ab90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1aba0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1abb0 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73 2c 20 72  _BitAnd, rLhs, r
1abc0 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b  Lhs, regCkNull);
1abd0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1abe0 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e  i=0; ii<pList->n
1abf0 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
1ac00 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1ac10 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ac20 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  se, pList->a[ii]
1ac30 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72  .pExpr, &regToFr
1ac40 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ee);.      if( r
1ac50 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69  egCkNull && sqli
1ac60 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
1ac70 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45  (pList->a[ii].pE
1ac80 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
1ac90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1aca0 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
1acb0 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72  regCkNull, r2, r
1acc0 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  egCkNull);.     
1acd0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c   }.      if( ii<
1ace0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c  pList->nExpr-1 |
1acf0 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  | destIfNull!=de
1ad00 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
1ad10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ad20 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c  AddOp4(v, OP_Eq,
1ad30 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c 20   rLhs, labelOk, 
1ad40 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r2,.            
1ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1ad60 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
1ad70 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20  OLLSEQ);.       
1ad80 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1ad90 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  v, ii<pList->nEx
1ada0 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56  pr-1);.        V
1adb0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1adc0 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70   ii==pList->nExp
1add0 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  r-1);.        sq
1ade0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1adf0 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20  5(v, zAff[0]);. 
1ae00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ae10 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74      assert( dest
1ae20 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
1ae30 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  lse );.        s
1ae40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1ae50 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2c  (v, OP_Ne, rLhs,
1ae60 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32   destIfFalse, r2
1ae70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1ae90 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
1aea0 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72  LSEQ); VdbeCover
1aeb0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
1aec0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1aed0 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c  eP5(v, zAff[0] |
1aee0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
1aef0 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
1af00 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1af10 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1af20 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20   regToFree);.   
1af30 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b   }.    if( regCk
1af40 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Null ){.      sq
1af50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1af60 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
1af70 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e  gCkNull, destIfN
1af80 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ull); VdbeCovera
1af90 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
1afa0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1afb0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1afc0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1afd0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1afe0 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20  v, labelOk);.   
1aff0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1b000 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1b010 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 67  egCkNull);.    g
1b020 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  oto sqlite3ExprC
1b030 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a  odeIN_finished;.
1b040 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 32    }..  /* Step 2
1b050 3a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  : Check to see i
1b060 66 20 74 68 65 20 4c 48 53 20 63 6f 6e 74 61 69  f the LHS contai
1b070 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c 75  ns any NULL colu
1b080 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  mns.  If the.  *
1b090 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f 6e 74 61  * LHS does conta
1b0a0 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e 20 74 68  in NULLs then th
1b0b0 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65  e result must be
1b0c0 20 65 69 74 68 65 72 20 46 41 4c 53 45 20 6f 72   either FALSE or
1b0d0 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20 77   NULL..  ** We w
1b0e0 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70 20 74 68  ill then skip th
1b0f0 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  e binary search 
1b100 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f  of the RHS..  */
1b110 0a 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c  .  if( destIfNul
1b120 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l==destIfFalse )
1b130 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70 32 20  {.    destStep2 
1b140 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  = destIfFalse;. 
1b150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 73 74   }else{.    dest
1b160 53 74 65 70 32 20 3d 20 64 65 73 74 53 74 65 70  Step2 = destStep
1b170 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  6 = sqlite3VdbeM
1b180 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
1b190 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1b1a0 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29   i<nVector; i++)
1b1b0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
1b1c0 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
1b1d0 6c 64 53 75 62 65 78 70 72 28 70 45 78 70 72 2d  ldSubexpr(pExpr-
1b1e0 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
1b1f0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1b200 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20  anBeNull(p) ){. 
1b210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b220 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
1b230 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73  ull, rLhs+i, des
1b240 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20 20 56  tStep2);.      V
1b250 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b260 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1b270 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c 48 53  Step 3.  The LHS
1b280 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f   is now known to
1b290 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44   be non-NULL.  D
1b2a0 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  o the binary sea
1b2b0 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  rch.  ** of the 
1b2c0 52 48 53 20 75 73 69 6e 67 20 74 68 65 20 4c 48  RHS using the LH
1b2d0 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20 20 49  S as a probe.  I
1b2e0 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72 65 73  f found, the res
1b2f0 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72 75 65  ult is.  ** true
1b300 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1b310 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
1b320 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  ID ){.    /* In 
1b330 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52  this case, the R
1b340 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  HS is the ROWID 
1b350 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  of table b-tree 
1b360 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20  and so we also. 
1b370 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20     ** know that 
1b380 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e  the RHS is non-N
1b390 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65 20  ULL.  Hence, we 
1b3a0 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 33 20  combine steps 3 
1b3b0 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74  and 4.    ** int
1b3c0 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  o a single opcod
1b3d0 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
1b3e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1b3f0 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 54 61  P_SeekRowid, iTa
1b400 62 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  b, destIfFalse, 
1b410 72 4c 68 73 29 3b 0a 20 20 20 20 56 64 62 65 43  rLhs);.    VdbeC
1b420 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1b430 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71  addrTruthOp = sq
1b440 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
1b450 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f 2a  v, OP_Goto);  /*
1b460 20 52 65 74 75 72 6e 20 54 72 75 65 20 2a 2f 0a   Return True */.
1b470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1b480 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1b490 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72  , OP_Affinity, r
1b4a0 4c 68 73 2c 20 6e 56 65 63 74 6f 72 2c 20 30 2c  Lhs, nVector, 0,
1b4b0 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f 72 29 3b   zAff, nVector);
1b4c0 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66 46  .    if( destIfF
1b4d0 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c  alse==destIfNull
1b4e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d   ){.      /* Com
1b4f0 62 69 6e 65 20 53 74 65 70 20 33 20 61 6e 64 20  bine Step 3 and 
1b500 53 74 65 70 20 35 20 69 6e 74 6f 20 61 20 73 69  Step 5 into a si
1b510 6e 67 6c 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  ngle opcode */. 
1b520 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b530 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
1b540 4e 6f 74 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  NotFound, iTab, 
1b550 64 65 73 74 49 66 46 61 6c 73 65 2c 0a 20 20 20  destIfFalse,.   
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b570 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56          rLhs, nV
1b580 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65  ector); VdbeCove
1b590 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 67  rage(v);.      g
1b5a0 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  oto sqlite3ExprC
1b5b0 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a  odeIN_finished;.
1b5c0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72 64      }.    /* Ord
1b5d0 69 6e 61 72 79 20 53 74 65 70 20 33 2c 20 66 6f  inary Step 3, fo
1b5e0 72 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  r the case where
1b5f0 20 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c 20   FALSE and NULL 
1b600 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  are distinct */.
1b610 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70 20      addrTruthOp 
1b620 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1b630 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
1b640 6e 64 2c 20 69 54 61 62 2c 20 30 2c 0a 20 20 20  nd, iTab, 0,.   
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b670 20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72     rLhs, nVector
1b680 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1b690 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  v);.  }..  /* St
1b6a0 65 70 20 34 2e 20 20 49 66 20 74 68 65 20 52 48  ep 4.  If the RH
1b6b0 53 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65  S is known to be
1b6c0 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65   non-NULL and we
1b6d0 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20   did not find.  
1b6e0 2a 2a 20 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74  ** an match on t
1b6f0 68 65 20 73 65 61 72 63 68 20 61 62 6f 76 65 2c  he search above,
1b700 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
1b710 20 6d 75 73 74 20 62 65 20 46 41 4c 53 45 2e 0a   must be FALSE..
1b720 20 20 2a 2f 0a 20 20 69 66 28 20 72 52 68 73 48    */.  if( rRhsH
1b730 61 73 4e 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f  asNull && nVecto
1b740 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==1 ){.    sqli
1b750 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b760 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68   OP_NotNull, rRh
1b770 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66  sHasNull, destIf
1b780 46 61 6c 73 65 29 3b 0a 20 20 20 20 56 64 62 65  False);.    Vdbe
1b790 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
1b7a0 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35 2e 20 20  ..  /* Step 5.  
1b7b0 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  If we do not car
1b7c0 65 20 61 62 6f 75 74 20 74 68 65 20 64 69 66 66  e about the diff
1b7d0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 4e  erence between N
1b7e0 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c  ULL and.  ** FAL
1b7f0 53 45 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  SE, then just re
1b800 74 75 72 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a  turn false. .  *
1b810 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 46 61  /.  if( destIfFa
1b820 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
1b830 29 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74  ) sqlite3VdbeGot
1b840 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  o(v, destIfFalse
1b850 29 3b 0a 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a  );..  /* Step 6:
1b860 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 72 6f   Loop through ro
1b870 77 73 20 6f 66 20 74 68 65 20 52 48 53 2e 20 20  ws of the RHS.  
1b880 43 6f 6d 70 61 72 65 20 65 61 63 68 20 72 6f 77  Compare each row
1b890 20 74 6f 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a   to the LHS..  *
1b8a0 2a 20 49 66 20 61 6e 79 20 63 6f 6d 70 61 72 69  * If any compari
1b8b0 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  son is NULL, the
1b8c0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
1b8d0 4e 55 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20  NULL.  If all.  
1b8e0 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61  ** comparisons a
1b8f0 72 65 20 46 41 4c 53 45 20 74 68 65 6e 20 74 68  re FALSE then th
1b900 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 69  e final result i
1b910 73 20 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20  s FALSE..  **.  
1b920 2a 2a 20 46 6f 72 20 61 20 73 63 61 6c 61 72 20  ** For a scalar 
1b930 4c 48 53 2c 20 69 74 20 69 73 20 73 75 66 66 69  LHS, it is suffi
1b940 63 69 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a  cient to check j
1b950 75 73 74 20 74 68 65 20 66 69 72 73 74 20 72 6f  ust the first ro
1b960 77 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48  w.  ** of the RH
1b970 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  S..  */.  if( de
1b980 73 74 53 74 65 70 36 20 29 20 73 71 6c 69 74 65  stStep6 ) sqlite
1b990 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1b9a0 6c 28 76 2c 20 64 65 73 74 53 74 65 70 36 29 3b  l(v, destStep6);
1b9b0 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
1b9c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b9d0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
1b9e0 62 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  b, destIfFalse);
1b9f0 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
1ba00 76 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f  v);.  if( nVecto
1ba10 72 3e 31 20 29 7b 0a 20 20 20 20 64 65 73 74 4e  r>1 ){.    destN
1ba20 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  otNull = sqlite3
1ba30 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
1ba40 61 72 73 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  arse);.  }else{.
1ba50 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74      /* For nVect
1ba60 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73  or==1, combine s
1ba70 74 65 70 73 20 36 20 61 6e 64 20 37 20 62 79 20  teps 6 and 7 by 
1ba80 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
1ba90 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c  rning.    ** FAL
1baa0 53 45 20 69 66 20 74 68 65 20 66 69 72 73 74 20  SE if the first 
1bab0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f  comparison is no
1bac0 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65  t NULL */.    de
1bad0 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74  stNotNull = dest
1bae0 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66  IfFalse;.  }.  f
1baf0 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
1bb00 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
1bb10 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65  r *p;.    CollSe
1bb20 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e  q *pColl;.    in
1bb30 74 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65  t r3 = sqlite3Ge
1bb40 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
1bb50 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
1bb60 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
1bb70 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20  xpr(pLeft, i);. 
1bb80 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1bb90 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1bba0 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73 71  arse, p);.    sq
1bbb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1bbc0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
1bbd0 61 62 2c 20 69 2c 20 72 33 29 3b 0a 20 20 20 20  ab, i, r3);.    
1bbe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bbf0 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73  4(v, OP_Ne, rLhs
1bc00 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c  +i, destNotNull,
1bc10 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r3,.           
1bc20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
1bc30 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
1bc40 53 45 51 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  SEQ);.    VdbeCo
1bc50 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1bc60 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1bc70 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29  pReg(pParse, r3)
1bc80 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
1bc90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1bca0 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e  Goto, 0, destIfN
1bcb0 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 56 65 63  ull);.  if( nVec
1bcc0 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  tor>1 ){.    sql
1bcd0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1bce0 61 62 65 6c 28 76 2c 20 64 65 73 74 4e 6f 74 4e  abel(v, destNotN
1bcf0 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
1bd00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1bd10 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
1bd20 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64  drTop+1);.    Vd
1bd30 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
1bd40 20 20 20 20 2f 2a 20 53 74 65 70 20 37 3a 20 20      /* Step 7:  
1bd50 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
1bd60 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20   point, we know 
1bd70 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
1bd80 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 66  must.    ** be f
1bd90 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  alse. */.    sql
1bda0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1bdb0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
1bdc0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a  stIfFalse);.  }.
1bdd0 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65  .  /* Jumps here
1bde0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 74   in order to ret
1bdf0 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73  urn true. */.  s
1be00 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1be10 72 65 28 76 2c 20 61 64 64 72 54 72 75 74 68 4f  re(v, addrTruthO
1be20 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70 72  p);..sqlite3Expr
1be30 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a  CodeIN_finished:
1be40 0a 20 20 69 66 28 20 72 4c 68 73 21 3d 72 4c 68  .  if( rLhs!=rLh
1be50 73 4f 72 69 67 20 29 20 73 71 6c 69 74 65 33 52  sOrig ) sqlite3R
1be60 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1be70 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 56  arse, rLhs);.  V
1be80 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1be90 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  end IN expr"));.
1bea0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1beb0 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73  N_oom_error:.  s
1bec0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
1bed0 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b  rse->db, aiMap);
1bee0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1bef0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66  (pParse->db, zAf
1bf00 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  f);.}.#endif /* 
1bf10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1bf20 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
1bf30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1bf40 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a  ATING_POINT./*.*
1bf50 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
1bf60 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
1bf70 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61  ill put the floa
1bf80 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
1bf90 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79  lue described by
1bfa0 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
1bfb0 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
1bfc0 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72  *.** The z[] str
1bfd0 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ing will probabl
1bfe0 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65  y not be zero-te
1bff0 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
1c000 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72  he .** z[n] char
1c010 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74  acter is guarant
1c020 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  eed to be someth
1c030 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ing that does no
1c040 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74  t look.** like t
1c050 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
1c060 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a  of the number..*
1c070 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
1c080 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20  deReal(Vdbe *v, 
1c090 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
1c0a0 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69  nt negateFlag, i
1c0b0 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20  nt iMem){.  if( 
1c0c0 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a  ALWAYS(z!=0) ){.
1c0d0 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65      double value
1c0e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  ;.    sqlite3Ato
1c0f0 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c  F(z, &value, sql
1c100 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
1c110 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
1c120 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69     assert( !sqli
1c130 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20  te3IsNaN(value) 
1c140 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74  ); /* The new At
1c150 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73  oF never returns
1c160 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20   NaN */.    if( 
1c170 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c  negateFlag ) val
1c180 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20  ue = -value;.   
1c190 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c1a0 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61  p4Dup8(v, OP_Rea
1c1b0 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28  l, 0, iMem, 0, (
1c1c0 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52  u8*)&value, P4_R
1c1d0 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  EAL);.  }.}.#end
1c1e0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  if.../*.** Gener
1c1f0 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
1c200 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
1c210 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
1c220 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
1c230 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
1c240 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
1c250 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  *.** Expr.u.zTok
1c260 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46  en is always UTF
1c270 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69  8 and zero-termi
1c280 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  nated..*/.static
1c290 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65   void codeIntege
1c2a0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1c2b0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1c2c0 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69  t negFlag, int i
1c2d0 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Mem){.  Vdbe *v 
1c2e0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1c2f0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
1c300 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
1c310 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  e ){.    int i =
1c320 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
1c330 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ;.    assert( i>
1c340 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  =0 );.    if( ne
1c350 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a  gFlag ) i = -i;.
1c360 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c370 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1c380 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20  ger, i, iMem);. 
1c390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1c3a0 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65  c;.    i64 value
1c3b0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1c3c0 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a   *z = pExpr->u.z
1c3d0 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  Token;.    asser
1c3e0 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63  t( z!=0 );.    c
1c3f0 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48   = sqlite3DecOrH
1c400 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75  exToI64(z, &valu
1c410 65 29 3b 0a 20 20 20 20 69 66 28 20 28 63 3d 3d  e);.    if( (c==
1c420 33 20 26 26 20 21 6e 65 67 46 6c 61 67 29 20 7c  3 && !negFlag) |
1c430 7c 20 28 63 3d 3d 32 29 20 7c 7c 20 28 6e 65 67  | (c==2) || (neg
1c440 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d 3d 53  Flag && value==S
1c450 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b  MALLEST_INT64)){
1c460 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
1c470 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1c480 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  NT.      sqlite3
1c490 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1c4a0 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65   "oversized inte
1c4b0 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46  ger: %s%s", negF
1c4c0 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20  lag ? "-" : "", 
1c4d0 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65  z);.#else.#ifnde
1c4e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45  f SQLITE_OMIT_HE
1c4f0 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20  X_INTEGER.      
1c500 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
1c510 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d  icmp(z,"0x",2)==
1c520 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1c530 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c540 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61  rse, "hex litera
1c550 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25 73 22  l too big: %s%s"
1c560 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22  , negFlag?"-":""
1c570 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ,z);.      }else
1c580 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
1c590 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c          codeReal
1c5a0 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20  (v, z, negFlag, 
1c5b0 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  iMem);.      }.#
1c5c0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
1c5d0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c  .      if( negFl
1c5e0 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d  ag ){ value = c=
1c5f0 3d 33 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e  =3 ? SMALLEST_IN
1c600 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a  T64 : -value; }.
1c610 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c620 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
1c630 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d  P_Int64, 0, iMem
1c640 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65  , 0, (u8*)&value
1c650 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20  , P4_INT64);.   
1c660 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65   }.  }.}.../* Ge
1c670 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1c680 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20   will load into 
1c690 72 65 67 69 73 74 65 72 20 72 65 67 4f 75 74 20  register regOut 
1c6a0 61 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a  a value that is.
1c6b0 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ** appropriate f
1c6c0 6f 72 20 74 68 65 20 69 49 64 78 43 6f 6c 2d 74  or the iIdxCol-t
1c6d0 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  h column of inde
1c6e0 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20  x pIdx..*/.void 
1c6f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c  sqlite3ExprCodeL
1c700 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a  oadIndexColumn(.
1c710 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1c720 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1c730 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
1c740 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a  dex *pIdx,    /*
1c750 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65   The index whose
1c760 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65   column is to be
1c770 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74   loaded */.  int
1c780 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20   iTabCur,    /* 
1c790 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1c7a0 74 6f 20 61 20 74 61 62 6c 65 20 72 6f 77 20 2a  to a table row *
1c7b0 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c  /.  int iIdxCol,
1c7c0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d      /* The colum
1c7d0 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  n of the index t
1c7e0 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  o be loaded */. 
1c7f0 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20   int regOut     
1c800 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e   /* Store the in
1c810 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  dex column value
1c820 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
1c830 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54  r */.){.  i16 iT
1c840 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69  abCol = pIdx->ai
1c850 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b  Column[iIdxCol];
1c860 0a 20 20 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d  .  if( iTabCol==
1c870 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 61  XN_EXPR ){.    a
1c880 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f  ssert( pIdx->aCo
1c890 6c 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73  lExpr );.    ass
1c8a0 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45  ert( pIdx->aColE
1c8b0 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43  xpr->nExpr>iIdxC
1c8c0 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ol );.    pParse
1c8d0 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 54 61  ->iSelfTab = iTa
1c8e0 62 43 75 72 20 2b 20 31 3b 0a 20 20 20 20 73 71  bCur + 1;.    sq
1c8f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
1c900 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  y(pParse, pIdx->
1c910 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78  aColExpr->a[iIdx
1c920 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f  Col].pExpr, regO
1c930 75 74 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ut);.    pParse-
1c940 3e 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20  >iSelfTab = 0;. 
1c950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1c960 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1c970 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72  lumnOfTable(pPar
1c980 73 65 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d  se->pVdbe, pIdx-
1c990 3e 70 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72  >pTable, iTabCur
1c9a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9c0 20 20 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72        iTabCol, r
1c9d0 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  egOut);.  }.}../
1c9e0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1c9f0 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
1ca00 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
1ca10 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
1ca20 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
1ca30 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1ca40 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1ca50 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  e(.  Vdbe *v,   
1ca60 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
1ca70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1ca80 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ion */.  Table *
1ca90 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20  pTab,    /* The 
1caa0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1cab0 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20   the value */.  
1cac0 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20  int iTabCur,    
1cad0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75 72  /* The table cur
1cae0 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20  sor.  Or the PK 
1caf0 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f  cursor for WITHO
1cb00 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e  UT ROWID */.  in
1cb10 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a  t iCol,       /*
1cb20 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   Index of the co
1cb30 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20  lumn to extract 
1cb40 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20  */.  int regOut 
1cb50 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
1cb60 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  the value into t
1cb70 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
1cb80 29 7b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  ){.  if( pTab==0
1cb90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1cba0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1cbb0 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 43 75 72 2c  Column, iTabCur,
1cbc0 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   iCol, regOut);.
1cbd0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1cbe0 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20    if( iCol<0 || 
1cbf0 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  iCol==pTab->iPKe
1cc00 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
1cc10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cc20 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c  _Rowid, iTabCur,
1cc30 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73   regOut);.  }els
1cc40 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  e{.    int op = 
1cc50 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
1cc60 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f  ? OP_VColumn : O
1cc70 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e  P_Column;.    in
1cc80 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  t x = iCol;.    
1cc90 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
1cca0 61 62 29 20 26 26 20 21 49 73 56 69 72 74 75 61  ab) && !IsVirtua
1ccb0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
1ccc0 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
1ccd0 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65  mnOfIndex(sqlite
1cce0 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
1ccf0 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20  (pTab), iCol);. 
1cd00 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1cd10 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
1cd20 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65  , iTabCur, x, re
1cd30 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  gOut);.  }.  if(
1cd40 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
1cd50 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66  sqlite3ColumnDef
1cd60 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43  ault(v, pTab, iC
1cd70 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
1cd80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1cd90 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1cda0 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43  l extract the iC
1cdb0 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
1cdc0 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54  from.** table pT
1cdd0 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ab and store the
1cde0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
1cdf0 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 20   register iReg. 
1ce00 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
1ce10 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
1ce20 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69  sor to pTab in i
1ce30 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20  Table when this 
1ce40 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
1ce50 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d  lled.  If iColum
1ce60 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  n<0 then code is
1ce70 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20   generated that 
1ce80 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77  extracts the row
1ce90 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  id..*/.int sqlit
1cea0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1ceb0 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
1cec0 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
1ced0 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
1cee0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
1cef0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
1cf00 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
1cf10 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
1cf20 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
1cf30 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
1cf40 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
1cf50 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
1cf60 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
1cf70 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
1cf80 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
1cf90 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
1cfa0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c  e */.  int iReg,
1cfb0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
1cfc0 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
1cfd0 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20  .  u8 p5        
1cfe0 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20      /* P5 value 
1cff0 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20  for OP_Column + 
1d000 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64  FLAGS */.){.  Vd
1d010 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1d020 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
1d030 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
1d040 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1d050 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
1d060 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  ab, iTable, iCol
1d070 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66  umn, iReg);.  if
1d080 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( p5 ){.    sqli
1d090 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1d0a0 76 2c 20 70 35 29 3b 0a 20 20 7d 0a 20 20 72 65  v, p5);.  }.  re
1d0b0 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a  turn iReg;.}../*
1d0c0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1d0d0 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e  e to move conten
1d0e0 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73  t from registers
1d0f0 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e   iFrom...iFrom+n
1d100 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f  Reg-1.** over to
1d110 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31   iTo..iTo+nReg-1
1d120 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d130 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61  3ExprCodeMove(Pa
1d140 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1d150 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
1d160 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73   int nReg){.  as
1d170 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f  sert( iFrom>=iTo
1d180 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e  +nReg || iFrom+n
1d190 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71  Reg<=iTo );.  sq
1d1a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1d1b0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1d1c0 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69  P_Move, iFrom, i
1d1d0 54 6f 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 2f 2a  To, nReg);.}../*
1d1e0 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63  .** Convert a sc
1d1f0 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  alar expression 
1d200 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47  node to a TK_REG
1d210 49 53 54 45 52 20 72 65 66 65 72 65 6e 63 69 6e  ISTER referencin
1d220 67 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 52  g.** register iR
1d230 65 67 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20  eg.  The caller 
1d240 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
1d250 20 69 52 65 67 20 61 6c 72 65 61 64 79 20 63 6f   iReg already co
1d260 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f  ntains.** the co
1d270 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
1d280 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
1d290 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1d2a0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78  xprToRegister(Ex
1d2b0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 69  pr *pExpr, int i
1d2c0 52 65 67 29 7b 0a 20 20 45 78 70 72 20 2a 70 20  Reg){.  Expr *p 
1d2d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
1d2e0 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b  pCollate(pExpr);
1d2f0 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f  .  p->op2 = p->o
1d300 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  p;.  p->op = TK_
1d310 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69  REGISTER;.  p->i
1d320 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20  Table = iReg;.  
1d330 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
1d340 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d  y(p, EP_Skip);.}
1d350 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65  ../*.** Evaluate
1d360 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28   an expression (
1d370 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20  either a vector 
1d380 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  or a scalar expr
1d390 65 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72  ession) and stor
1d3a0 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
1d3b0 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74  in continguous t
1d3c0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1d3d0 72 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  rs.  Return the 
1d3e0 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
1d3f0 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 75  first register u
1d400 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
1d410 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49   result..**.** I
1d420 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72  f the returned r
1d430 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69  esult register i
1d440 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63  s a temporary sc
1d450 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20  alar, then also 
1d460 77 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65  write.** that re
1d470 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e  gister number in
1d480 74 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20  to *piFreeable. 
1d490 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   If the returned
1d4a0 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
1d4b0 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  .** is not a tem
1d4c0 70 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68 65  porary or if the
1d4d0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
1d4e0 20 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46   vector set *piF
1d4f0 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e  reeable.** to 0.
1d500 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
1d510 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61  xprCodeVector(Pa
1d520 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1d530 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65  r *p, int *piFre
1d540 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52  eable){.  int iR
1d550 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65  esult;.  int nRe
1d560 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  sult = sqlite3Ex
1d570 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b  prVectorSize(p);
1d580 0a 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d  .  if( nResult==
1d590 31 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74  1 ){.    iResult
1d5a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1d5b0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1d5c0 2c 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20  , piFreeable);. 
1d5d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46   }else{.    *piF
1d5e0 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  reeable = 0;.   
1d5f0 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   if( p->op==TK_S
1d600 45 4c 45 43 54 20 29 7b 0a 23 69 66 20 53 51 4c  ELECT ){.#if SQL
1d610 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1d620 59 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  Y.      iResult 
1d630 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  = 0;.#else.     
1d640 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   iResult = sqlit
1d650 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
1d660 70 50 61 72 73 65 2c 20 70 29 3b 0a 23 65 6e 64  pParse, p);.#end
1d670 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
1d680 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1d690 20 69 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73   iResult = pPars
1d6a0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
1d6b0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1d6c0 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20   nResult;.      
1d6d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75  for(i=0; i<nResu
1d6e0 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  lt; i++){.      
1d6f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1d700 65 46 61 63 74 6f 72 61 62 6c 65 28 70 50 61 72  eFactorable(pPar
1d710 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  se, p->x.pList->
1d720 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 2b 69 52  a[i].pExpr, i+iR
1d730 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a  esult);.      }.
1d740 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1d750 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a  rn iResult;.}...
1d760 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1d770 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72  ode into the cur
1d780 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61  rent Vdbe to eva
1d790 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a  luate the given.
1d7a0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ** expression.  
1d7b0 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65  Attempt to store
1d7c0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1d7d0 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74  register "target
1d7e0 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  "..** Return the
1d7f0 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20   register where 
1d800 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
1d810 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74  ed..**.** With t
1d820 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
1d830 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74  re is no guarant
1d840 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20  ee that results 
1d850 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65  will.** be store
1d860 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68  d in target.  Th
1d870 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62  e result might b
1d880 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65  e stored in some
1d890 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74   other.** regist
1d8a0 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76  er if it is conv
1d8b0 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e  enient to do so.
1d8c0 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
1d8d0 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63  nction.** must c
1d8e0 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
1d8f0 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68  code and move th
1d900 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65  e results to the
1d910 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69   desired.** regi
1d920 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ster..*/.int sql
1d930 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1d940 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  et(Parse *pParse
1d950 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1d960 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
1d970 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1d980 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56  pVdbe;  /* The V
1d990 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  M under construc
1d9a0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
1d9b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d9c0 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
1d9d0 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
1d9e0 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74  .  int inReg = t
1d9f0 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  arget;       /* 
1da00 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69  Results stored i
1da10 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67  n register inReg
1da20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
1da30 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
1da40 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66  /* If non-zero f
1da50 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61  ree this tempora
1da60 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ry register */. 
1da70 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
1da80 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
1da90 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
1daa0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
1dab0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
1dac0 72 31 2c 20 72 32 3b 20 20 20 20 20 20 20 20 20  r1, r2;         
1dad0 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
1dae0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
1daf0 73 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70  s */.  Expr temp
1db00 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
1db10 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78   /* Temporary ex
1db20 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f  pression node */
1db30 0a 20 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a  .  int p5 = 0;..
1db40 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
1db50 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
1db60 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
1db70 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
1db80 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1db90 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1dba0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
1dbb0 3b 0a 20 20 7d 0a 0a 65 78 70 72 5f 63 6f 64 65  ;.  }..expr_code
1dbc0 5f 64 6f 6f 76 65 72 3a 0a 20 20 69 66 28 20 70  _doover:.  if( p
1dbd0 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  Expr==0 ){.    o
1dbe0 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d  p = TK_NULL;.  }
1dbf0 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70  else{.    op = p
1dc00 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20  Expr->op;.  }.  
1dc10 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1dc20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
1dc30 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  LUMN: {.      Ag
1dc40 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
1dc50 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
1dc60 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  o;.      struct 
1dc70 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
1dc80 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
1dc90 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  Col[pExpr->iAgg]
1dca0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67  ;.      if( !pAg
1dcb0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
1dcc0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
1dcd0 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e  ert( pCol->iMem>
1dce0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  0 );.        ret
1dcf0 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a  urn pCol->iMem;.
1dd00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1dd10 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72  pAggInfo->useSor
1dd20 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20  tingIdx ){.     
1dd30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1dd40 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1dd50 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72  n, pAggInfo->sor
1dd60 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20  tingIdxPTab,.   
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd80 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1dd90 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20  >iSorterColumn, 
1dda0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1ddb0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1ddc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
1ddd0 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
1dde0 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
1ddf0 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f  K_COLUMN case */
1de00 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1de10 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
1de20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45     int iTab = pE
1de30 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
1de40 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1de50 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1de60 5f 46 69 78 65 64 43 6f 6c 29 20 29 7b 0a 20 20  _FixedCol) ){.  
1de70 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 43 4f        /* This CO
1de80 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  LUMN expression 
1de90 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6e 73  is really a cons
1dea0 74 61 6e 74 20 64 75 65 20 74 6f 20 57 48 45 52  tant due to WHER
1deb0 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  E clause.       
1dec0 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c   ** constraints,
1ded0 20 61 6e 64 20 74 68 61 74 20 63 6f 6e 73 74 61   and that consta
1dee0 6e 74 20 69 73 20 63 6f 64 65 64 20 62 79 20 74  nt is coded by t
1def0 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 0a  he pExpr->pLeft.
1df00 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
1df10 73 73 73 69 6f 6e 2e 20 20 48 6f 77 65 76 65 72  sssion.  However
1df20 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1df30 63 6f 6e 73 74 61 6e 74 20 68 61 73 20 74 68 65  constant has the
1df40 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 20   correct.       
1df50 20 2a 2a 20 64 61 74 61 74 79 70 65 20 62 79 20   ** datatype by 
1df60 61 70 70 6c 79 69 6e 67 20 74 68 65 20 41 66 66  applying the Aff
1df70 69 6e 69 74 79 20 6f 66 20 74 68 65 20 74 61 62  inity of the tab
1df80 6c 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65  le column to the
1df90 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  .        ** cons
1dfa0 74 61 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tant..        */
1dfb0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 65  .        int iRe
1dfc0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1dfd0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1dfe0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 74  , pExpr->pLeft,t
1dff0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1e000 69 6e 74 20 61 66 66 20 3d 20 73 71 6c 69 74 65  int aff = sqlite
1e010 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69  3TableColumnAffi
1e020 6e 69 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54  nity(pExpr->y.pT
1e030 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ab, pExpr->iColu
1e040 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mn);.        if(
1e050 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
1e060 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20  _BLOB ){.       
1e070 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1e080 63 68 61 72 20 7a 41 66 66 5b 5d 20 3d 20 22 42  char zAff[] = "B
1e090 5c 30 30 30 43 5c 30 30 30 44 5c 30 30 30 45 22  \000C\000D\000E"
1e0a0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1e0b0 72 74 28 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  rt( SQLITE_AFF_B
1e0c0 4c 4f 42 3d 3d 27 41 27 20 29 3b 0a 20 20 20 20  LOB=='A' );.    
1e0d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
1e0e0 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3d 3d 27  LITE_AFF_TEXT=='
1e0f0 42 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  B' );.          
1e100 69 66 28 20 69 52 65 67 21 3d 74 61 72 67 65 74  if( iReg!=target
1e110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e120 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e130 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
1e140 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
1e150 20 20 20 20 20 20 20 20 20 20 69 52 65 67 20 3d            iReg =
1e160 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 20   target;.       
1e170 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
1e180 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1e190 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
1e1a0 20 69 52 65 67 2c 20 31 2c 20 30 2c 0a 20 20 20   iReg, 1, 0,.   
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1c0 20 20 20 20 20 20 20 20 20 26 7a 41 66 66 5b 28           &zAff[(
1e1d0 61 66 66 2d 27 42 27 29 2a 32 5d 2c 20 50 34 5f  aff-'B')*2], P4_
1e1e0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
1e1f0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
1e200 6e 20 69 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a  n iReg;.      }.
1e210 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30        if( iTab<0
1e220 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1e230 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1e240 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
1e250 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48  /* Generating CH
1e260 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
1e270 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74  or inserting int
1e280 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  o partial index 
1e290 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
1e2a0 75 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  urn pExpr->iColu
1e2b0 6d 6e 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65  mn - pParse->iSe
1e2c0 6c 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d  lfTab;.        }
1e2d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e2e0 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70  /* Coding an exp
1e2f0 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
1e300 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  part of an index
1e310 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61   where column na
1e320 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  mes.          **
1e330 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65   in the index re
1e340 66 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65  fer to the table
1e350 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e   to which the in
1e360 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  dex belongs */. 
1e370 20 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20           iTab = 
1e380 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1e390 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   - 1;.        }.
1e3a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1e3b0 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
1e3c0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
1e3d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 79 2e 70  arse, pExpr->y.p
1e3e0 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e400 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
1e410 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74  mn, iTab, target
1e420 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e440 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20   pExpr->op2);.  
1e450 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e460 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
1e470 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
1e480 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  rse, pExpr, 0, t
1e490 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65  arget);.      re
1e4a0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e4b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
1e4c0 52 55 45 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20  RUEFALSE: {.    
1e4d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e4e0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1e4f0 72 2c 20 73 71 6c 69 74 65 33 45 78 70 72 54 72  r, sqlite3ExprTr
1e500 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 29 2c  uthValue(pExpr),
1e510 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1e520 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1e530 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1e540 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1e550 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65  G_POINT.    case
1e560 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
1e570 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1e580 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1e590 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1e5a0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61  );.      codeRea
1e5b0 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  l(v, pExpr->u.zT
1e5c0 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29  oken, 0, target)
1e5d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1e5e0 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  arget;.    }.#en
1e5f0 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
1e600 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
1e610 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1e620 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1e630 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1e640 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e650 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74  eLoadString(v, t
1e660 61 72 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e  arget, pExpr->u.
1e670 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72  zToken);.      r
1e680 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1e690 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e6a0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
1e6b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e6c0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
1e6d0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65  arget);.      re
1e6e0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e6f0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1e700 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
1e710 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
1e720 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  BLOB: {.      in
1e730 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t n;.      const
1e740 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
1e750 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20  char *zBlob;.   
1e760 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1e770 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1e780 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1e790 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e7a0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e7b0 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70  [0]=='x' || pExp
1e7c0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1e7d0 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  'X' );.      ass
1e7e0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1e7f0 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b  oken[1]=='\'' );
1e800 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70  .      z = &pExp
1e810 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a  r->u.zToken[2];.
1e820 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
1e830 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31  3Strlen30(z) - 1
1e840 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e850 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  z[n]=='\'' );.  
1e860 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69      zBlob = sqli
1e870 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c  te3HexToBlob(sql
1e880 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a  ite3VdbeDb(v), z
1e890 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
1e8a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1e8b0 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74   OP_Blob, n/2, t
1e8c0 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c  arget, 0, zBlob,
1e8d0 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
1e8e0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1e8f0 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
1e900 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
1e910 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  ABLE: {.      as
1e920 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1e930 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e940 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1e950 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1e960 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29  r->u.zToken!=0 )
1e970 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e980 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1e990 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  0]!=0 );.      s
1e9a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e9b0 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c  (v, OP_Variable,
1e9c0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1e9d0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1e9e0 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  if( pExpr->u.zTo
1e9f0 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20  ken[1]!=0 ){.   
1ea00 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1ea10 2a 7a 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73  *z = sqlite3VLis
1ea20 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73  tNumToName(pPars
1ea30 65 2d 3e 70 56 4c 69 73 74 2c 20 70 45 78 70 72  e->pVList, pExpr
1ea40 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1ea50 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1ea60 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1ea70 27 3f 27 20 7c 7c 20 73 74 72 63 6d 70 28 70 45  '?' || strcmp(pE
1ea80 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a  xpr->u.zToken, z
1ea90 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1eaa0 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30  pParse->pVList[0
1eab0 5d 20 3d 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61  ] = 0; /* Indica
1eac0 74 65 20 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20  te VList may no 
1ead0 6c 6f 6e 67 65 72 20 62 65 20 65 6e 6c 61 72 67  longer be enlarg
1eae0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  ed */.        sq
1eaf0 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
1eb00 34 28 76 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50  4(v, (char*)z, P
1eb10 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
1eb20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1eb30 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
1eb40 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
1eb50 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
1eb60 72 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  rn pExpr->iTable
1eb70 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1eb80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
1eb90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
1eba0 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  T: {.      /* Ex
1ebb0 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
1ebc0 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c   form:   CAST(pL
1ebd0 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f  eft AS token) */
1ebe0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
1ebf0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1ec00 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1ec10 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
1ec20 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  t);.      if( in
1ec30 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20  Reg!=target ){. 
1ec40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ec50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1ec60 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
1ec70 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  get);.        in
1ec80 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
1ec90 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1eca0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ecb0 20 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74   OP_Cast, target
1ecc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ecd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ece0 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45  3AffinityType(pE
1ecf0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
1ed00 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1ed10 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65   inReg;.    }.#e
1ed20 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1ed30 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
1ed40 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
1ed50 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
1ed60 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
1ed70 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
1ed80 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20  TK_NE;.      p5 
1ed90 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b  = SQLITE_NULLEQ;
1eda0 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74  .      /* fall-t
1edb0 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61  hrough */.    ca
1edc0 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
1edd0 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
1ede0 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
1edf0 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
1ee00 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
1ee10 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
1ee20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
1ee30 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
1ee40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1ee50 78 70 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66  xprIsVector(pLef
1ee60 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  t) ){.        co
1ee70 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28  deVectorCompare(
1ee80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1ee90 61 72 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a  arget, op, p5);.
1eea0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1eeb0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1eec0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1eed0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65  arse, pLeft, &re
1eee0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
1eef0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1ef00 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1ef10 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1ef20 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1ef30 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1ef40 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1ef50 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1ef60 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  p,.            r
1ef70 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
1ef80 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70  LITE_STOREP2 | p
1ef90 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  5);.        asse
1efa0 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
1efb0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1efc0 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
1efd0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1efe0 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t);.        asse
1eff0 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
1f000 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f010 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
1f020 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1f030 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
1f040 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
1f050 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f060 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
1f070 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
1f080 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t);.        asse
1f090 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
1f0a0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f0b0 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
1f0c0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
1f0d0 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
1f0e0 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
1f0f0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f100 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Eq); VdbeCover
1f110 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45  ageIf(v,op==OP_E
1f120 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  q);.        asse
1f130 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
1f140 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f150 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ne); VdbeCover
1f160 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e  ageIf(v,op==OP_N
1f170 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
1f180 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1f190 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
1f1a0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1f1b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
1f1c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f1d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1f1e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
1f1f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
1f200 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
1f210 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
1f220 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
1f230 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
1f240 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
1f250 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
1f260 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
1f270 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
1f280 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
1f290 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
1f2a0 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
1f2b0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1f2c0 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20   TK_AND==OP_And 
1f2d0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65  );            te
1f2e0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41  stcase( op==TK_A
1f2f0 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ND );.      asse
1f300 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72  rt( TK_OR==OP_Or
1f310 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
1f320 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f330 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  K_OR );.      as
1f340 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
1f350 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20  P_Add );        
1f360 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f370 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20  =TK_PLUS );.    
1f380 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
1f390 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
1f3a0 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28  );     testcase(
1f3b0 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b   op==TK_MINUS );
1f3c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f3d0 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
1f3e0 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74  der );      test
1f3f0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
1f400 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f410 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
1f420 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74  BitAnd );      t
1f430 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f440 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  BITAND );.      
1f450 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
1f460 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20  ==OP_BitOr );   
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 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
1f490 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f4a0 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
1f4b0 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61   );       testca
1f4c0 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48  se( op==TK_SLASH
1f4d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f4e0 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
1f4f0 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74  ShiftLeft );   t
1f500 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f510 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  LSHIFT );.      
1f520 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46  assert( TK_RSHIF
1f530 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  T==OP_ShiftRight
1f540 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f   );  testcase( o
1f550 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a  p==TK_RSHIFT );.
1f560 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f570 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
1f580 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  at );      testc
1f590 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43  ase( op==TK_CONC
1f5a0 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  AT );.      r1 =
1f5b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f5c0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1f5d0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1f5e0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1f5f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f600 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f610 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1f620 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73  gFree2);.      s
1f630 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1f640 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20  (v, op, r2, r1, 
1f650 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74  target);.      t
1f660 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f670 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1f680 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1f690 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1f6a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f6b0 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
1f6c0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
1f6d0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
1f6e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f6f0 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  pLeft );.      i
1f700 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
1f710 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
1f720 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
1f730 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31  pParse, pLeft, 1
1f740 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f750 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1f760 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1f770 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1f780 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65  OINT.      }else
1f790 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
1f7a0 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
1f7b0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1f7c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1f7d0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1f7e0 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
1f7f0 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75  Real(v, pLeft->u
1f800 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67  .zToken, 1, targ
1f810 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  et);.        ret
1f820 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e 64  urn target;.#end
1f830 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  if.      }else{.
1f840 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70          tempX.op
1f850 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20   = TK_INTEGER;. 
1f860 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61         tempX.fla
1f870 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs = EP_IntValue
1f880 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20  |EP_TokenOnly;. 
1f890 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69         tempX.u.i
1f8a0 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20  Value = 0;.     
1f8b0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1f8c0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f8d0 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67  se, &tempX, &reg
1f8e0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
1f8f0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1f900 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f910 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1f920 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1f930 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f940 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
1f950 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72  act, r2, r1, tar
1f960 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65  get);.        te
1f970 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1f980 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
1f990 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f9a0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
1f9b0 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
1f9c0 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
1f9d0 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
1f9e0 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20  ==OP_BitNot );  
1f9f0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1fa00 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20  K_BITNOT );.    
1fa10 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
1fa20 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20  ==OP_Not );     
1fa30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1fa40 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20  ==TK_NOT );.    
1fa50 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1fa60 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1fa70 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1fa80 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1fa90 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1faa0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1fab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fac0 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69  Op2(v, op, r1, i
1fad0 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
1fae0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1faf0 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20  se TK_TRUTH: {. 
1fb00 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b       int isTrue;
1fb10 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f      /* IS TRUE o
1fb20 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f  r IS NOT TRUE */
1fb30 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 6f 72 6d  .      int bNorm
1fb40 61 6c 3b 20 20 20 2f 2a 20 49 53 20 54 52 55 45  al;   /* IS TRUE
1fb50 20 6f 72 20 49 53 20 46 41 4c 53 45 20 2a 2f 0a   or IS FALSE */.
1fb60 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1fb70 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1fb80 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1fb90 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1fba0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fbb0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1fbc0 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20 73        isTrue = s
1fbd0 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56  qlite3ExprTruthV
1fbe0 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67  alue(pExpr->pRig
1fbf0 68 74 29 3b 0a 20 20 20 20 20 20 62 4e 6f 72 6d  ht);.      bNorm
1fc00 61 6c 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d  al = pExpr->op2=
1fc10 3d 54 4b 5f 49 53 3b 0a 20 20 20 20 20 20 74 65  =TK_IS;.      te
1fc20 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26  stcase( isTrue &
1fc30 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20  & bNormal);.    
1fc40 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54    testcase( !isT
1fc50 72 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b  rue && bNormal);
1fc60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1fc70 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
1fc80 50 5f 49 73 54 72 75 65 2c 20 72 31 2c 20 69 6e  P_IsTrue, r1, in
1fc90 52 65 67 2c 20 21 69 73 54 72 75 65 2c 20 69 73  Reg, !isTrue, is
1fca0 54 72 75 65 20 5e 20 62 4e 6f 72 6d 61 6c 29 3b  True ^ bNormal);
1fcb0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fcc0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1fcd0 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
1fce0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
1fcf0 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
1fd00 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1fd10 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
1fd20 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  l );   testcase(
1fd30 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
1fd40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fd50 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
1fd60 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61  otNull ); testca
1fd70 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
1fd80 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  LL );.      sqli
1fd90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1fda0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
1fdb0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
1fdc0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1fdd0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1fde0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1fdf0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1fe00 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1fe10 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  e1==0 );.      a
1fe20 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
1fe30 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72  eAddOp1(v, op, r
1fe40 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
1fe50 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1fe60 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
1fe70 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1fe80 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
1fe90 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
1fea0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1feb0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74  OP_Integer, 0, t
1fec0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
1fed0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1fee0 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
1fef0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1ff00 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
1ff10 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
1ff20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20   AggInfo *pInfo 
1ff30 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
1ff40 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
1ff50 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
1ff60 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1ff70 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1ff80 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1ff90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ffa0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1ffb0 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
1ffc0 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45  egate: %s()", pE
1ffd0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1ffe0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fff0 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e 66       return pInf
20000 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e  o->aFunc[pExpr->
20010 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20  iAgg].iMem;.    
20020 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
20030 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20040 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
20050 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
20060 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
20070 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
20080 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
20090 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20     int nFarg;   
200a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
200b0 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ber of function 
200c0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
200d0 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
200e0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
200f0 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
20100 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
20110 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
20120 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  *zId;       /* T
20130 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
20140 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f   */.      u32 co
20150 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  nstMask = 0;    
20160 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63   /* Mask of func
20170 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
20180 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  hat are constant
20190 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201b0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
201c0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
201d0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
201e0 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  db;  /* The data
201f0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
20200 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  */.      u8 enc 
20210 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20  = ENC(db);      
20220 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f  /* The text enco
20230 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69  ding used by thi
20240 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
20250 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
20260 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20  ll = 0;    /* A 
20270 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
20280 63 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ce */..#ifndef S
20290 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
202a0 57 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20  WFUNC.      if( 
202b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
202c0 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e  pExpr, EP_WinFun
202d0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  c) ){.        re
202e0 74 75 72 6e 20 70 45 78 70 72 2d 3e 79 2e 70 57  turn pExpr->y.pW
202f0 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 3b 0a 20  in->regResult;. 
20300 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
20310 20 20 20 20 20 69 66 28 20 43 6f 6e 73 74 46 61       if( ConstFa
20320 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 26  ctorOk(pParse) &
20330 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
20340 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
20350 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
20360 20 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   /* SQL function
20370 73 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69  s can be expensi
20380 76 65 2e 20 53 6f 20 74 72 79 20 74 6f 20 6d 6f  ve. So try to mo
20390 76 65 20 63 6f 6e 73 74 61 6e 74 20 66 75 6e 63  ve constant func
203a0 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a  tions.        **
203b0 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
203c0 72 20 6c 6f 6f 70 2c 20 65 76 65 6e 20 69 66 20  r loop, even if 
203d0 74 68 61 74 20 6d 65 61 6e 73 20 61 6e 20 65 78  that means an ex
203e0 74 72 61 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a  tra OP_Copy. */.
203f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
20400 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
20410 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
20420 70 72 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d  pr, -1);.      }
20430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
20440 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
20450 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
20460 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ect) );.      if
20470 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
20480 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
20490 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
204a0 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20    pFarg = 0;.   
204b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
204c0 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d    pFarg = pExpr-
204d0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
204e0 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20  }.      nFarg = 
204f0 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e  pFarg ? pFarg->n
20500 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20  Expr : 0;.      
20510 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
20520 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
20530 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
20540 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70        zId = pExp
20550 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
20560 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
20570 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
20580 2c 20 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e  , zId, nFarg, en
20590 63 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51  c, 0);.#ifdef SQ
205a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e  LITE_ENABLE_UNKN
205b0 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e  OWN_SQL_FUNCTION
205c0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
205d0 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78  =0 && pParse->ex
205e0 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  plain ){.       
205f0 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
20600 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
20610 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67  "unknown", nFarg
20620 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
20630 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
20640 69 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70  if( pDef==0 || p
20650 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d  Def->xFinalize!=
20660 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
20670 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
20680 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75  rse, "unknown fu
20690 6e 63 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a  nction: %s()", z
206a0 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Id);.        bre
206b0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
206c0 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20     /* Attempt a 
206d0 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74  direct implement
206e0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69  ation of the bui
206f0 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29  lt-in COALESCE()
20700 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46   and.      ** IF
20710 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73  NULL() functions
20720 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75  .  This avoids u
20730 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 75  nnecessary evalu
20740 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a  ation of.      *
20750 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74  * arguments past
20760 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e   the first non-N
20770 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  ULL argument..  
20780 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
20790 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
207a0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43   & SQLITE_FUNC_C
207b0 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20  OALESCE ){.     
207c0 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73     int endCoales
207d0 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
207e0 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
207f0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
20800 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20  t( nFarg>=2 );. 
20810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20820 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
20830 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
20840 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
20850 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46     for(i=1; i<nF
20860 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
20870 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20880 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp2(v, OP_Not
20890 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e  Null, target, en
208a0 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
208b0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
208c0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
208d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
208e0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
208f0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[i].pExpr, targ
20900 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
20910 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20920 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
20930 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a  , endCoalesce);.
20940 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20950 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
20960 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20   The UNLIKELY() 
20970 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
20980 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74  -op.  The result
20990 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20   is the value.  
209a0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
209b0 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  rst argument..  
209c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
209d0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
209e0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55   & SQLITE_FUNC_U
209f0 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20  NLIKELY ){.     
20a00 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
20a10 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 72  >=1 );.        r
20a20 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
20a30 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
20a40 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  se, pFarg->a[0].
20a50 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
20a60 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20        }..#ifdef 
20a70 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
20a80 20 20 20 2f 2a 20 54 68 65 20 41 46 46 49 4e 49     /* The AFFINI
20a90 54 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 65 76  TY() function ev
20aa0 61 6c 75 61 74 65 73 20 74 6f 20 61 20 73 74 72  aluates to a str
20ab0 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
20ac0 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  es.      ** the 
20ad0 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
20ae0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20   the argument.  
20af0 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
20b00 20 74 65 73 74 69 6e 67 20 6f 66 0a 20 20 20 20   testing of.    
20b10 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20    ** the SQLite 
20b20 74 79 70 65 20 6c 6f 67 69 63 2e 0a 20 20 20 20  type logic..    
20b30 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
20b40 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
20b50 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 41 46 46   SQLITE_FUNC_AFF
20b60 49 4e 49 54 59 20 29 7b 0a 20 20 20 20 20 20 20  INITY ){.       
20b70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41   const char *azA
20b80 66 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f 62 22 2c  ff[] = { "blob",
20b90 20 22 74 65 78 74 22 2c 20 22 6e 75 6d 65 72 69   "text", "numeri
20ba0 63 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 22  c", "integer", "
20bb0 72 65 61 6c 22 20 7d 3b 0a 20 20 20 20 20 20 20  real" };.       
20bc0 20 63 68 61 72 20 61 66 66 3b 0a 20 20 20 20 20   char aff;.     
20bd0 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
20be0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==1 );.        a
20bf0 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ff = sqlite3Expr
20c00 41 66 66 69 6e 69 74 79 28 70 46 61 72 67 2d 3e  Affinity(pFarg->
20c10 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
20c20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20c30 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61  LoadString(v, ta
20c40 72 67 65 74 2c 20 0a 20 20 20 20 20 20 20 20 20  rget, .         
20c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c60 20 20 20 20 20 61 66 66 20 3f 20 61 7a 41 66 66       aff ? azAff
20c70 5b 61 66 66 2d 53 51 4c 49 54 45 5f 41 46 46 5f  [aff-SQLITE_AFF_
20c80 42 4c 4f 42 5d 20 3a 20 22 6e 6f 6e 65 22 29 3b  BLOB] : "none");
20c90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20ca0 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a  target;.      }.
20cb0 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 66 6f  #endif..      fo
20cc0 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20  r(i=0; i<nFarg; 
20cd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
20ce0 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65  ( i<32 && sqlite
20cf0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
20d00 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
20d10 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
20d20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31 20  testcase( i==31 
20d30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  );.          con
20d40 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  stMask |= MASKBI
20d50 54 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20 20  T32(i);.        
20d60 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
20d70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
20d80 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
20d90 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43  DCOLL)!=0 && !pC
20da0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
20db0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
20dc0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
20dd0 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
20de0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
20df0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
20e00 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20  if( pFarg ){.   
20e10 20 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d 61       if( constMa
20e20 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sk ){.          
20e30 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  r1 = pParse->nMe
20e40 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  m+1;.          p
20e50 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
20e60 46 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 65  Farg;.        }e
20e70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
20e80 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
20e90 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
20ea0 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20  nFarg);.        
20eb0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  }..        /* Fo
20ec0 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74  r length() and t
20ed0 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e  ypeof() function
20ee0 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20  s with a column 
20ef0 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20  argument,.      
20f00 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20    ** set the P5 
20f10 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65  parameter to the
20f20 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64   OP_Column opcod
20f30 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47  e to OPFLAG_LENG
20f40 54 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a  THARG.        **
20f50 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f   or OPFLAG_TYPEO
20f60 46 41 52 47 20 72 65 73 70 65 63 74 69 76 65 6c  FARG respectivel
20f70 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65  y, to avoid unne
20f80 63 65 73 73 61 72 79 20 64 61 74 61 0a 20 20 20  cessary data.   
20f90 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e       ** loading.
20fa0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
20fb0 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
20fc0 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49  uncFlags & (SQLI
20fd0 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53  TE_FUNC_LENGTH|S
20fe0 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f  QLITE_FUNC_TYPEO
20ff0 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  F))!=0 ){.      
21000 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a 20      u8 exprOp;. 
21010 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
21020 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20   nFarg==1 );.   
21030 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
21040 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
21050 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
21060 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67 2d   exprOp = pFarg-
21070 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b  >a[0].pExpr->op;
21080 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
21090 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  xprOp==TK_COLUMN
210a0 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41   || exprOp==TK_A
210b0 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  GG_COLUMN ){.   
210c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
210d0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e   SQLITE_FUNC_LEN
210e0 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47  GTH==OPFLAG_LENG
210f0 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  THARG );.       
21100 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
21110 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d  ITE_FUNC_TYPEOF=
21120 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52  =OPFLAG_TYPEOFAR
21130 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
21140 20 74 65 73 74 63 61 73 65 28 20 70 44 65 66 2d   testcase( pDef-
21150 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50 46  >funcFlags & OPF
21160 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b  LAG_LENGTHARG );
21170 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 61  .            pFa
21180 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  rg->a[0].pExpr->
21190 6f 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20 20  op2 = .         
211a0 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 66           pDef->f
211b0 75 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46 4c  uncFlags & (OPFL
211c0 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46  AG_LENGTHARG|OPF
211d0 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a  LAG_TYPEOFARG);.
211e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
211f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73      }..        s
21200 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
21210 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
21220 46 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20  Farg, r1, 0,.   
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21240 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
21250 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c  ITE_ECEL_DUP|SQL
21260 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29  ITE_ECEL_FACTOR)
21270 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21280 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20         r1 = 0;. 
21290 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
212a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
212b0 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a  ALTABLE.      /*
212c0 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f   Possibly overlo
212d0 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ad the function 
212e0 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  if the first arg
212f0 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a  ument is.      *
21300 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * a virtual tabl
21310 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20  e column..      
21320 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
21330 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20  infix functions 
21340 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47  (LIKE, GLOB, REG
21350 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20  EXP, and MATCH) 
21360 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  use the.      **
21370 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
21380 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c  , not the first,
21390 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
213a0 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20   to test to.    
213b0 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
213c0 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  s a column in a 
213d0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
213e0 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63  This is done bec
213f0 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  ause.      ** th
21400 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f  e left operand o
21410 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  f infix function
21420 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77  s (the operand w
21430 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20  e want to.      
21440 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c  ** control overl
21450 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20  oading) ends up 
21460 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
21470 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  gument to the.  
21480 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
21490 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
214a0 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65   "A glob B" is e
214b0 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20  quivalent to .  
214c0 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41      ** "glob(B,A
214d0 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75  ).  We want to u
214e0 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67  se the A in "A g
214f0 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20  lob B" to test. 
21500 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63       ** for func
21510 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67  tion overloading
21520 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68  .  But we use th
21530 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f  e B term in "glo
21540 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a  b(B,A)"..      *
21550 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  /.      if( nFar
21560 67 3e 3d 32 20 26 26 20 45 78 70 72 48 61 73 50  g>=2 && ExprHasP
21570 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
21580 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a  P_InfixFunc) ){.
21590 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
215a0 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
215b0 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
215c0 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
215d0 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a  g->a[1].pExpr);.
215e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
215f0 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20  nFarg>0 ){.     
21600 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
21610 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
21620 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
21630 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
21640 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
21650 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
21660 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
21670 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
21680 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
21690 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
216a0 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
216b0 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20  DfltColl; .     
216c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
216d0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
216e0 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  eq, 0, 0, 0, (ch
216f0 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
21700 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d  OLLSEQ);.      }
21710 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
21720 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c  NABLE_OFFSET_SQL
21730 5f 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20  _FUNC.      if( 
21740 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
21750 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4f 46  & SQLITE_FUNC_OF
21760 46 53 45 54 20 29 7b 0a 20 20 20 20 20 20 20 20  FSET ){.        
21770 45 78 70 72 20 2a 70 41 72 67 20 3d 20 70 46 61  Expr *pArg = pFa
21780 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  rg->a[0].pExpr;.
21790 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
217a0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
217b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
217c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
217d0 2c 20 4f 50 5f 4f 66 66 73 65 74 2c 20 70 41 72  , OP_Offset, pAr
217e0 67 2d 3e 69 54 61 62 6c 65 2c 20 70 41 72 67 2d  g->iTable, pArg-
217f0 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  >iColumn, target
21800 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
21810 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
21820 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21830 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
21840 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  get);.        }.
21850 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
21860 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
21870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21880 64 4f 70 34 28 76 2c 20 70 50 61 72 73 65 2d 3e  dOp4(v, pParse->
21890 69 53 65 6c 66 54 61 62 20 3f 20 4f 50 5f 50 75  iSelfTab ? OP_Pu
218a0 72 65 46 75 6e 63 30 20 3a 20 4f 50 5f 46 75 6e  reFunc0 : OP_Fun
218b0 63 74 69 6f 6e 30 2c 0a 20 20 20 20 20 20 20 20  ction0,.        
218c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218d0 20 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c    constMask, r1,
218e0 20 74 61 72 67 65 74 2c 20 28 63 68 61 72 2a 29   target, (char*)
218f0 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46  pDef, P4_FUNCDEF
21900 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21910 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
21920 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20  , (u8)nFarg);.  
21930 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
21940 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61  nFarg && constMa
21950 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sk==0 ){.       
21960 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
21970 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
21980 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20   r1, nFarg);.   
21990 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
219a0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
219b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
219c0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
219d0 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
219e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
219f0 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ECT: {.      int
21a00 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73   nCol;.      tes
21a10 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58  tcase( op==TK_EX
21a20 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65  ISTS );.      te
21a30 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
21a40 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69  ELECT );.      i
21a50 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  f( op==TK_SELECT
21a60 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78 70   && (nCol = pExp
21a70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
21a80 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31 20  List->nExpr)!=1 
21a90 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21aa0 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
21ab0 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20 31  (pParse, nCol, 1
21ac0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
21ad0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
21ae0 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
21af0 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
21b00 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
21b10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
21b20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
21b30 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  T_COLUMN: {.    
21b40 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69    int n;.      i
21b50 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  f( pExpr->pLeft-
21b60 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20  >iTable==0 ){.  
21b70 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
21b80 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c  ft->iTable = sql
21b90 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
21ba0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
21bb0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d  >pLeft);.      }
21bc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21bd0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  Expr->iTable==0 
21be0 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  || pExpr->pLeft-
21bf0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
21c00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
21c10 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  r->iTable.      
21c20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
21c30 65 21 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33 45  e!=(n = sqlite3E
21c40 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45  xprVectorSize(pE
21c50 78 70 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20  xpr->pLeft)) .  
21c60 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
21c70 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
21c80 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d  Parse, "%d colum
21c90 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76  ns assigned %d v
21ca0 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20  alues",.        
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cc0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
21cd0 54 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20  Table, n);.     
21ce0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
21cf0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54  pExpr->pLeft->iT
21d00 61 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69 43  able + pExpr->iC
21d10 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  olumn;.    }.   
21d20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
21d30 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
21d40 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
21d50 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
21d60 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64  se);.      int d
21d70 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
21d80 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
21d90 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
21da0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21db0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
21dc0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21dd0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
21de0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
21df0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
21e00 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
21e10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21e20 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
21e30 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
21e40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
21e50 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
21e60 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
21e70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21e80 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
21e90 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20  m, target, 0);. 
21ea0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21eb0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
21ec0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
21ed0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
21ee0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
21ef0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
21f00 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20  BQUERY */...    
21f10 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42  /*.    **    x B
21f20 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
21f30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
21f40 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
21f50 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  to.    **.    **
21f60 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
21f70 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
21f80 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  X is stored in p
21f90 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
21fa0 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20   ** Y is stored 
21fb0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
21fc0 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[0].pExpr..   
21fd0 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20   ** Z is stored 
21fe0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
21ff0 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[1].pExpr..   
22000 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
22010 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
22020 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
22030 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
22040 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20  target, 0, 0);. 
22050 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
22060 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  et;.    }.    ca
22070 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20  se TK_SPAN:.    
22080 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a  case TK_COLLATE:
22090 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50   .    case TK_UP
220a0 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 70 45 78  LUS: {.      pEx
220b0 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pr = pExpr->pLef
220c0 74 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  t;.      goto ex
220d0 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3b 20  pr_code_doover; 
220e0 2f 2a 20 32 30 31 38 2d 30 34 2d 32 38 3a 20 50  /* 2018-04-28: P
220f0 72 65 76 65 6e 74 20 64 65 65 70 20 72 65 63 75  revent deep recu
22100 72 73 69 6f 6e 2e 20 4f 53 53 46 75 7a 7a 2e 20  rsion. OSSFuzz. 
22110 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  */.    }..    ca
22120 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
22130 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
22140 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
22150 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
22160 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
22170 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
22180 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
22190 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
221a0 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
221b0 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
221c0 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
221d0 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
221e0 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
221f0 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
22200 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
22210 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
22220 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
22230 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
22240 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
22250 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
22260 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
22270 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
22280 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
22290 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
222a0 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
222b0 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
222c0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65  *.      ** The e
222d0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70  xpression is imp
222e0 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
222f0 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64  n OP_Param opcod
22300 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20  e. The p1.      
22310 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
22320 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20  set to 0 for an 
22330 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65  old.rowid refere
22340 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29  nce, or to (i+1)
22350 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66  .      ** to ref
22360 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63  erence another c
22370 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64  olumn of the old
22380 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
22390 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a   where .      **
223a0 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   i is the index 
223b0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46  of the column. F
223c0 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72  or a new.rowid r
223d0 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a  eference, p1 is.
223e0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
223f0 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69  (n+1), where n i
22400 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
22410 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20  columns in each 
22420 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20  pseudo-table..  
22430 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66      ** For a ref
22440 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74  erence to any ot
22450 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  her column in th
22460 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  e new.* pseudo-t
22470 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a  able, p1.      *
22480 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32  * is set to (n+2
22490 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64  +i), where n and
224a0 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65   i are as define
224b0 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f  d previously. Fo
224c0 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70  r.      ** examp
224d0 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65  le, if the table
224e0 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65   on which trigge
224f0 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72  rs are being fir
22500 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ed is.      ** d
22510 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20  eclared as:.    
22520 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
22530 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
22540 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a  a, b);.      **.
22550 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31        ** Then p1
22560 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
22570 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
22580 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
22590 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==0   ->    ol
225a0 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d  d.rowid     p1==
225b0 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f  3   ->    new.ro
225c0 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  wid.      **   p
225d0 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==1   ->    old
225e0 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34  .a         p1==4
225f0 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20     ->    new.a. 
22600 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20       **   p1==2 
22610 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20    ->    old.b   
22620 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e        p1==5   ->
22630 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20      new.b       
22640 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22650 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45  Table *pTab = pE
22660 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20  xpr->y.pTab;.   
22670 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70     int p1 = pExp
22680 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61  r->iTable * (pTa
22690 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b  b->nCol+1) + 1 +
226a0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
226b0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
226c0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30  pExpr->iTable==0
226d0 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
226e0 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73  e==1 );.      as
226f0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f  sert( pExpr->iCo
22700 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70  lumn>=-1 && pExp
22710 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d  r->iColumn<pTab-
22720 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61  >nCol );.      a
22730 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b  ssert( pTab->iPK
22740 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  ey<0 || pExpr->i
22750 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50  Column!=pTab->iP
22760 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Key );.      ass
22770 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31  ert( p1>=0 && p1
22780 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32  <(pTab->nCol*2+2
22790 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ) );..      sqli
227a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
227b0 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74   OP_Param, p1, t
227c0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64  arget);.      Vd
227d0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
227e0 5b 25 64 5d 3d 25 73 2e 25 73 22 2c 20 74 61 72  [%d]=%s.%s", tar
227f0 67 65 74 2c 0a 20 20 20 20 20 20 20 20 28 70 45  get,.        (pE
22800 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e  xpr->iTable ? "n
22810 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20  ew" : "old"),.  
22820 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43        (pExpr->iC
22830 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64  olumn<0 ? "rowid
22840 22 20 3a 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  " : pExpr->y.pTa
22850 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
22860 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 0a 20  Column].zName). 
22870 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65       ));..#ifnde
22880 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
22890 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
228a0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
228b0 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66  umn has REAL aff
228c0 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75  inity, it may cu
228d0 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65  rrently be store
228e0 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a  d as an.      **
228f0 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50   integer. Use OP
22900 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f  _RealAffinity to
22910 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   make sure it is
22920 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20   really real..  
22930 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
22940 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
22950 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74  0985-57662 SQLit
22960 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74  e will convert t
22970 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f  he value back to
22980 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69  .      ** floati
22990 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78  ng point when ex
229a0 74 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d  tracting it from
229b0 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f   the record.  */
229c0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
229d0 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20  ->iColumn>=0 .  
229e0 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43       && pTab->aC
229f0 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
22a00 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  n].affinity==SQL
22a10 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20  ITE_AFF_REAL.   
22a20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
22a30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
22a40 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  v, OP_RealAffini
22a50 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ty, target);.   
22a60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
22a70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
22a80 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54      case TK_VECT
22a90 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OR: {.      sqli
22aa0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
22ab0 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
22ac0 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20  isused");.      
22ad0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
22ae0 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c    case TK_IF_NUL
22af0 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 69  L_ROW: {.      i
22b00 6e 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20 20  nt addrINR;.    
22b10 20 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c 69    addrINR = sqli
22b20 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
22b30 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20 70   OP_IfNullRow, p
22b40 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
22b50 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
22b60 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
22b70 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
22b80 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
22b90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22ba0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
22bb0 64 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20 73  ddrINR);.      s
22bc0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
22bd0 50 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20 69  P3(v, addrINR, i
22be0 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
22bf0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
22c00 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a  *.    ** Form A:
22c10 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78  .    **   CASE x
22c20 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
22c30 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
22c40 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
22c50 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
22c60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
22c70 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm B:.    **   C
22c80 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e  ASE WHEN e1 THEN
22c90 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
22ca0 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
22cb0 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
22cc0 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
22cd0 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62   Form A is can b
22ce0 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  e transformed in
22cf0 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  to the equivalen
22d00 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c  t form B as foll
22d10 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  ows:.    **   CA
22d20 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45  SE WHEN x=e1 THE
22d30 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54  N r1 WHEN x=e2 T
22d40 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a  HEN r2 ....    *
22d50 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d  *        WHEN x=
22d60 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
22d70 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
22d80 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69   ** X (if it exi
22d90 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72  sts) is in pExpr
22da0 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
22db0 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74  Y is in the last
22dc0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70   element of pExp
22dd0 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45  r->x.pList if pE
22de0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
22df0 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64  xpr is.    ** od
22e00 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73  d.  The Y is als
22e10 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20  o optional.  If 
22e20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
22e30 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73  ements in x.pLis
22e40 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e  t.    ** is even
22e50 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74  , then Y is omit
22e60 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68  ted and the "oth
22e70 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69  erwise" result i
22e80 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
22e90 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
22ea0 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
22eb0 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
22ec0 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
22ed0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
22ee0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
22ef0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
22f00 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
22f10 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
22f20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
22f30 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
22f40 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
22f50 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
22f60 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
22f70 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
22f80 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
22f90 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  lt: assert( op==
22fa0 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20  TK_CASE ); {.   
22fb0 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
22fe0 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
22ff0 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
23000 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23020 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
23030 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
23040 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
23050 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23070 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
23080 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
23090 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
230a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230b0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
230c0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
230d0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
230e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
230f0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
23100 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
23110 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
23120 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
23130 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
23140 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
23150 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
23160 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
23170 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
23180 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
23190 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
231c0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
231d0 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74       Expr *pTest
231e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
231f0 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20         /* X==Ei 
23200 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74  (form A) or just
23210 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a   Ei (form B) */.
23220 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
23230 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
23240 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
23250 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78  ect) && pExpr->x
23260 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  .pList );.      
23270 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e  assert(pExpr->x.
23280 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30  pList->nExpr > 0
23290 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20  );.      pEList 
232a0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
232b0 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65  ;.      aListele
232c0 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  m = pEList->a;. 
232d0 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c       nExpr = pEL
232e0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
232f0 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c    endLabel = sql
23300 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
23310 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
23320 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72   if( (pX = pExpr
23330 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20  ->pLeft)!=0 ){. 
23340 20 20 20 20 20 20 20 65 78 70 72 4e 6f 64 65 43         exprNodeC
23350 6f 70 79 28 26 74 65 6d 70 58 2c 20 70 58 29 3b  opy(&tempX, pX);
23360 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
23370 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  e( pX->op==TK_CO
23380 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
23390 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26  exprToRegister(&
233a0 74 65 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56  tempX, exprCodeV
233b0 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74  ector(pParse, &t
233c0 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  empX, &regFree1)
233d0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
233e0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
233f0 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   );.        mems
23400 65 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30  et(&opCompare, 0
23410 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61  , sizeof(opCompa
23420 72 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  re));.        op
23430 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f  Compare.op = TK_
23440 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f  EQ;.        opCo
23450 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74  mpare.pLeft = &t
23460 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54  empX;.        pT
23470 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65  est = &opCompare
23480 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63  ;.        /* Tic
23490 6b 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35  ket b351d95f9cd5
234a0 65 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35  ef17e9d9dbae18f5
234b0 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20  ca8611190001:.  
234c0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c        ** The val
234d0 75 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d  ue in regFree1 m
234e0 69 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65  ight get SCopy-e
234f0 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20  d into the file 
23500 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20  result..        
23510 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20  ** So make sure 
23520 74 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65  that the regFree
23530 31 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f  1 register is no
23540 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68  t reused for oth
23550 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75  er.        ** pu
23560 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69  rposes and possi
23570 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  bly overwritten.
23580 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67    */.        reg
23590 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20  Free1 = 0;.     
235a0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
235b0 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69  ; i<nExpr-1; i=i
235c0 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  +2){.        if(
235d0 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20   pX ){.         
235e0 20 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d   assert( pTest!=
235f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 );.          o
23600 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20  pCompare.pRight 
23610 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
23620 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  Expr;.        }e
23630 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
23640 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  Test = aListelem
23650 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
23660 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78     }.        nex
23670 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56  tCase = sqlite3V
23680 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
23690 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  rse);.        te
236a0 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f  stcase( pTest->o
236b0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
236c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
236d0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
236e0 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61  e, pTest, nextCa
236f0 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  se, SQLITE_JUMPI
23700 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
23710 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65  testcase( aListe
23720 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e  lem[i+1].pExpr->
23730 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
23740 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23750 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
23760 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
23770 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
23780 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23790 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61  dbeGoto(v, endLa
237a0 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  bel);.        sq
237b0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
237c0 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73  Label(v, nextCas
237d0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
237e0 20 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21    if( (nExpr&1)!
237f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
23800 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
23810 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
23820 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20  nExpr-1].pExpr, 
23830 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
23840 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
23850 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23860 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
23870 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
23880 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23890 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
238a0 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
238b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
238c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
238d0 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63  IT_TRIGGER.    c
238e0 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a  ase TK_RAISE: {.
238f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
23900 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
23910 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20  E_Rollback .    
23920 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
23930 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
23940 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ort.           |
23950 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
23960 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20  y==OE_Fail.     
23970 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
23980 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
23990 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ore.      );.   
239a0 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
239b0 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
239c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
239d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
239e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239f0 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
23a00 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
23a10 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
23a20 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  -program");.    
23a30 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
23a40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23a50 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
23a60 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
23a70 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
23a80 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
23a90 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
23aa0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
23ab0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
23ac0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
23ad0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
23ae0 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
23af0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23b00 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
23b10 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50             v, OP
23b20 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b  _Halt, SQLITE_OK
23b30 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20  , OE_Ignore, 0, 
23b40 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
23b50 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
23b60 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
23b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23b80 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
23b90 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
23ba0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
23bb0 54 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20  T_TRIGGER,.     
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bd0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
23be0 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d  affinity, pExpr-
23bf0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29  >u.zToken, 0, 0)
23c00 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
23c10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
23c20 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
23c30 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
23c40 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
23c50 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
23c60 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
23c70 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
23c80 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d   return inReg;.}
23c90 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f  ../*.** Factor o
23ca0 75 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74  ut the code of t
23cb0 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
23cc0 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ion to initializ
23cd0 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2a 0a 2a  ation time..**.*
23ce0 2a 20 49 66 20 72 65 67 44 65 73 74 3e 3d 30 20  * If regDest>=0 
23cf0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
23d00 69 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64  is always stored
23d10 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65   in that registe
23d20 72 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65 73  r and the.** res
23d30 75 6c 74 20 69 73 20 6e 6f 74 20 72 65 75 73 61  ult is not reusa
23d40 62 6c 65 2e 20 20 49 66 20 72 65 67 44 65 73 74  ble.  If regDest
23d50 3c 30 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  <0 then this rou
23d60 74 69 6e 65 20 69 73 20 66 72 65 65 20 74 6f 20  tine is free to 
23d70 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 76 61  .** store the va
23d80 6c 75 65 20 77 68 65 72 65 65 76 65 72 20 69 74  lue whereever it
23d90 20 77 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67   wants.  The reg
23da0 69 73 74 65 72 20 77 68 65 72 65 20 74 68 65 20  ister where the 
23db0 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a 2a 20 69  expression .** i
23dc0 73 20 73 74 6f 72 65 64 20 69 73 20 72 65 74 75  s stored is retu
23dd0 72 6e 65 64 2e 20 20 57 68 65 6e 20 72 65 67 44  rned.  When regD
23de0 65 73 74 3c 30 2c 20 74 77 6f 20 69 64 65 6e 74  est<0, two ident
23df0 69 63 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73  ical expressions
23e00 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65 20 74 6f   will.** code to
23e10 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74   the same regist
23e20 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
23e30 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
23e40 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
23e50 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
23e60 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
23e70 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
23e80 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
23e90 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74  n to code when t
23ea0 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69  he VDBE initiali
23eb0 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  zes */.  int reg
23ec0 44 65 73 74 20 20 20 20 20 20 20 2f 2a 20 53 74  Dest       /* St
23ed0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ore the value in
23ee0 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
23ef0 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  /.){.  ExprList 
23f00 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f  *p;.  assert( Co
23f10 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
23f20 73 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61  se) );.  p = pPa
23f30 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b  rse->pConstExpr;
23f40 0a 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30  .  if( regDest<0
23f50 20 26 26 20 70 20 29 7b 0a 20 20 20 20 73 74 72   && p ){.    str
23f60 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
23f70 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 69 6e  m *pItem;.    in
23f80 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  t i;.    for(pIt
23f90 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45  em=p->a, i=p->nE
23fa0 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b  xpr; i>0; pItem+
23fb0 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69  +, i--){.      i
23fc0 66 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62  f( pItem->reusab
23fd0 6c 65 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  le && sqlite3Exp
23fe0 72 43 6f 6d 70 61 72 65 28 30 2c 70 49 74 65 6d  rCompare(0,pItem
23ff0 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31  ->pExpr,pExpr,-1
24000 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
24010 72 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e  return pItem->u.
24020 69 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20  iConstExprReg;. 
24030 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
24040 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
24050 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
24060 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
24070 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
24080 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
24090 72 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a  rse, p, pExpr);.
240a0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
240b0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
240c0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
240d0 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b  ->a[p->nExpr-1];
240e0 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75  .     pItem->reu
240f0 73 61 62 6c 65 20 3d 20 72 65 67 44 65 73 74 3c  sable = regDest<
24100 30 3b 0a 20 20 20 20 20 69 66 28 20 72 65 67 44  0;.     if( regD
24110 65 73 74 3c 30 20 29 20 72 65 67 44 65 73 74 20  est<0 ) regDest 
24120 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
24130 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e  ;.     pItem->u.
24140 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20  iConstExprReg = 
24150 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a 20 20 70  regDest;.  }.  p
24160 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
24170 72 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20  r = p;.  return 
24180 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  regDest;.}../*.*
24190 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
241a0 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65  to evaluate an e
241b0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74  xpression and st
241c0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ore the results.
241d0 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
241e0 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
241f0 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
24200 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74  where the result
24210 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e  s.** are stored.
24220 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
24230 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
24240 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
24250 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c  hat can be deall
24260 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  ocated,.** then 
24270 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72  write its number
24280 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66   into *pReg.  If
24290 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69   the result regi
242a0 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  ster is not.** a
242b0 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e   temporary, then
242c0 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65   set *pReg to ze
242d0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  ro..**.** If pEx
242e0 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  pr is a constant
242f0 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
24300 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61  ine might genera
24310 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20  te this.** code 
24320 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69  to fill the regi
24330 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74  ster in the init
24340 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69  ialization secti
24350 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42  on of the.** VDB
24360 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72  E program, in or
24370 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74  der to factor it
24380 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c   out of the eval
24390 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a  uation loop..*/.
243a0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
243b0 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70  odeTemp(Parse *p
243c0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
243d0 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a  pr, int *pReg){.
243e0 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70    int r2;.  pExp
243f0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
24400 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
24410 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61  );.  if( ConstFa
24420 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20  ctorOk(pParse). 
24430 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d    && pExpr->op!=
24440 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26  TK_REGISTER.   &
24450 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
24460 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
24470 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 2a  Expr).  ){.    *
24480 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 72  pReg  = 0;.    r
24490 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
244a0 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
244b0 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20  , pExpr, -1);.  
244c0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
244d0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
244e0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
244f0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
24500 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
24510 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
24520 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31  ;.    if( r2==r1
24530 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20   ){.      *pReg 
24540 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = r1;.    }else{
24550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
24560 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
24570 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
24580 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  *pReg = 0;.    }
24590 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
245a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
245b0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
245c0 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
245d0 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
245e0 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
245f0 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
24600 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
24610 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
24620 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
24630 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
24640 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  arget..*/.void s
24650 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
24660 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
24670 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
24680 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
24690 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
246a0 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
246b0 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
246c0 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
246d0 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  && pExpr->op==TK
246e0 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
246f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24700 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
24710 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72  , OP_Copy, pExpr
24720 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
24730 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24740 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
24750 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
24760 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
24770 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  get);.    assert
24780 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
24790 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
247a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
247b0 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21  ;.    if( inReg!
247c0 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73  =target && pPars
247d0 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
247e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
247f0 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
24800 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  e, OP_SCopy, inR
24810 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
24820 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
24830 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74  Make a transient
24840 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
24850 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68  ion pExpr and th
24860 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67  en code it using
24870 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43  .** sqlite3ExprC
24880 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75  ode().  This rou
24890 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20  tine works just 
248a0 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  like sqlite3Expr
248b0 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74  Code().** except
248c0 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20   that the input 
248d0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75  expression is gu
248e0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75  aranteed to be u
248f0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
24900 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
24910 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61  eCopy(Parse *pPa
24920 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
24930 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
24940 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
24950 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78  Parse->db;.  pEx
24960 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
24970 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
24980 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  );.  if( !db->ma
24990 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c  llocFailed ) sql
249a0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
249b0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
249c0 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  et);.  sqlite3Ex
249d0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
249e0 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  pr);.}../*.** Ge
249f0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
24a00 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
24a10 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
24a20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
24a30 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
24a40 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
24a50 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
24a60 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
24a70 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
24a80 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68  r target.  If th
24a90 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
24aa0 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
24ab0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
24ac0 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63  ight choose to c
24ad0 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ode the expressi
24ae0 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61  on at initializa
24af0 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f  tion time..*/.vo
24b00 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
24b10 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72  deFactorable(Par
24b20 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
24b30 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
24b40 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72  get){.  if( pPar
24b50 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
24b60 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  r && sqlite3Expr
24b70 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
24b80 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
24b90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
24ba0 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
24bb0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
24bc0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
24bd0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
24be0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
24bf0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
24c00 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
24c10 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 68 65  at evaluates the
24c20 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
24c30 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72  n and puts the r
24c40 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69  esult.** in regi
24c50 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  ster target..**.
24c60 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63  ** Also make a c
24c70 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  opy of the expre
24c80 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e  ssion results in
24c90 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68  to another "cach
24ca0 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61  e" register.** a
24cb0 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78  nd modify the ex
24cc0 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74  pression so that
24cd0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69   the next time i
24ce0 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a  t is evaluated,.
24cf0 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ** the result is
24d00 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
24d10 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a  ache register..*
24d20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
24d30 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78  e is used for ex
24d40 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
24d50 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65  re used multiple
24d60 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65   .** times.  The
24d70 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  y are evaluated 
24d80 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73  once and the res
24d90 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72  ults of the expr
24da0 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65  ession.** are re
24db0 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  used..*/.void sq
24dc0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64  lite3ExprCodeAnd
24dd0 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
24de0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
24df0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
24e00 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
24e10 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
24e20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iMem;..  assert(
24e30 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61   target>0 );.  a
24e40 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
24e50 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  !=TK_REGISTER );
24e60 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
24e70 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
24e80 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69 4d 65  , target);.  iMe
24e90 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
24ea0 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  em;.  sqlite3Vdb
24eb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
24ec0 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d 65 6d  py, target, iMem
24ed0 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73  );.  exprToRegis
24ee0 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29  ter(pExpr, iMem)
24ef0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
24f00 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75  ate code that pu
24f10 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  shes the value o
24f20 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
24f30 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  of the given.** 
24f40 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
24f50 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20  into a sequence 
24f60 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67  of registers beg
24f70 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74  inning at target
24f80 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
24f90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
24fa0 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e  ments evaluated.
24fb0 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
24fc0 75 72 6e 65 64 20 77 69 6c 6c 0a 2a 2a 20 75 73  urned will.** us
24fd0 75 61 6c 6c 79 20 62 65 20 70 4c 69 73 74 2d 3e  ually be pList->
24fe0 6e 45 78 70 72 20 62 75 74 20 6d 69 67 68 74 20  nExpr but might 
24ff0 62 65 20 72 65 64 75 63 65 64 20 69 66 20 53 51  be reduced if SQ
25000 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
25010 46 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2e  F.** is defined.
25020 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
25030 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20  E_ECEL_DUP flag 
25040 70 72 65 76 65 6e 74 73 20 74 68 65 20 61 72 67  prevents the arg
25050 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e  uments from bein
25060 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e  g.** filled usin
25070 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f  g OP_SCopy.  OP_
25080 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73 65  Copy must be use
25090 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
250a0 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c   The SQLITE_ECEL
250b0 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74  _FACTOR argument
250c0 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74   allows constant
250d0 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65   arguments to be
250e0 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74  .** factored out
250f0 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61   into initializa
25100 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  tion code..**.**
25110 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c   The SQLITE_ECEL
25120 5f 52 45 46 20 66 6c 61 67 20 6d 65 61 6e 73 20  _REF flag means 
25130 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73  that expressions
25140 20 69 6e 20 74 68 65 20 6c 69 73 74 20 77 69 74   in the list wit
25150 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b  h.** ExprList.a[
25160 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
25170 6c 3e 30 20 68 61 76 65 20 61 6c 72 65 61 64 79  l>0 have already
25180 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64 20   been evaluated 
25190 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  and stored.** in
251a0 20 72 65 67 69 73 74 65 72 73 20 61 74 20 73 72   registers at sr
251b0 63 52 65 67 2c 20 61 6e 64 20 73 6f 20 74 68 65  cReg, and so the
251c0 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 63 6f   value can be co
251d0 70 69 65 64 20 66 72 6f 6d 20 74 68 65 72 65 2e  pied from there.
251e0 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 43  .** If SQLITE_EC
251f0 45 4c 5f 4f 4d 49 54 52 45 46 20 69 73 20 61 6c  EL_OMITREF is al
25200 73 6f 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  so set, then the
25210 20 76 61 6c 75 65 73 20 77 69 74 68 20 75 2e 78   values with u.x
25220 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 2a  .iOrderByCol>0.*
25230 2a 20 61 72 65 20 73 69 6d 70 6c 79 20 6f 6d 69  * are simply omi
25240 74 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  tted rather than
25250 20 62 65 69 6e 67 20 63 6f 70 69 65 64 20 66 72   being copied fr
25260 6f 6d 20 73 72 63 52 65 67 2e 0a 2a 2f 0a 69 6e  om srcReg..*/.in
25270 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
25280 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  eExprList(.  Par
25290 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
252a0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
252b0 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
252c0 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68   *pList,   /* Th
252d0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
252e0 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  t to be coded */
252f0 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20  .  int target,  
25300 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
25310 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20  o write results 
25320 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67 2c  */.  int srcReg,
25330 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
25340 65 20 72 65 67 69 73 74 65 72 73 20 69 66 20 53  e registers if S
25350 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a  QLITE_ECEL_REF *
25360 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20 20  /.  u8 flags    
25370 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
25380 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f  _ECEL_* flags */
25390 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
253a0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
253b0 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  m;.  int i, j, n
253c0 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20  ;.  u8 copyOp = 
253d0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
253e0 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43  ECEL_DUP) ? OP_C
253f0 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a  opy : OP_SCopy;.
25400 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
25410 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
25420 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
25430 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
25440 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
25450 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d   pParse->pVdbe!=
25460 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67  0 );  /* Never g
25470 65 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68  ets this far oth
25480 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20  erwise */.  n = 
25490 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
254a0 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72  if( !ConstFactor
254b0 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c 61  Ok(pParse) ) fla
254c0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43  gs &= ~SQLITE_EC
254d0 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72  EL_FACTOR;.  for
254e0 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
254f0 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20   i=0; i<n; i++, 
25500 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pItem++){.    Ex
25510 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65  pr *pExpr = pIte
25520 6d 2d 3e 70 45 78 70 72 3b 0a 23 69 66 64 65 66  m->pExpr;.#ifdef
25530 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
25540 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
25550 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
25560 62 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20  bSorterRef ){.  
25570 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 6e      i--;.      n
25580 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  --;.    }else.#e
25590 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 66 6c  ndif.    if( (fl
255a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
255b0 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20  L_REF)!=0 && (j 
255c0 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  = pItem->u.x.iOr
255d0 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20  derByCol)>0 ){. 
255e0 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26       if( flags &
255f0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49   SQLITE_ECEL_OMI
25600 54 52 45 46 20 29 7b 0a 20 20 20 20 20 20 20 20  TREF ){.        
25610 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d  i--;.        n--
25620 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25630 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
25640 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79  beAddOp2(v, copy
25650 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20  Op, j+srcReg-1, 
25660 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
25670 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
25680 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
25690 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30  _ECEL_FACTOR)!=0
256a0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73  .           && s
256b0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
256c0 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
256d0 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  r).    ){.      
256e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
256f0 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
25700 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
25710 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25720 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c   int inReg = sql
25730 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
25740 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
25750 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
25760 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
25770 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20  rget+i ){.      
25780 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
25790 20 20 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f         if( copyO
257a0 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20  p==OP_Copy.     
257b0 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69      && (pOp=sqli
257c0 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
257d0 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  -1))->opcode==OP
257e0 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26  _Copy.         &
257f0 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70  & pOp->p1+pOp->p
25800 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20  3+1==inReg.     
25810 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70      && pOp->p2+p
25820 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74  Op->p3+1==target
25830 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  +i.        ){.  
25840 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b          pOp->p3+
25850 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
25860 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
25870 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25880 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20   copyOp, inReg, 
25890 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
258a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
258b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
258c0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
258d0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
258e0 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
258f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54  ..**.**    x BET
25900 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a  WEEN y AND z.**.
25910 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20  ** The above is 
25920 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a  equivalent to .*
25930 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44  *.**    x>=y AND
25940 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65   x<=z.**.** Code
25950 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b   it as such, tak
25960 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74  ing care to do t
25970 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70  he common subexp
25980 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69  ression.** elimi
25990 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a  nation of x..**.
259a0 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20 70  ** The xJumpIf p
259b0 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
259c0 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a  nes details:.**.
259d0 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20  **    NULL:     
259e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74                St
259f0 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20  ore the boolean 
25a00 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64 65  result in reg[de
25a10 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  st].**    sqlite
25a20 33 45 78 70 72 49 66 54 72 75 65 3a 20 20 20 20  3ExprIfTrue:    
25a30 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69    Jump to dest i
25a40 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c  f true.**    sql
25a50 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 3a  ite3ExprIfFalse:
25a60 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73       Jump to des
25a70 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a  t if false.**.**
25a80 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   The jumpIfNull 
25a90 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
25aa0 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66 20  ored if xJumpIf 
25ab0 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  is NULL..*/.stat
25ac0 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65  ic void exprCode
25ad0 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65  Between(.  Parse
25ae0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
25af0 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
25b00 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
25b10 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
25b20 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  Expr,      /* Th
25b30 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73  e BETWEEN expres
25b40 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sion */.  int de
25b50 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
25b60 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
25b70 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61 74  or storage locat
25b80 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ion */.  void (*
25b90 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45 78  xJump)(Parse*,Ex
25ba0 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a  pr*,int,int), /*
25bb0 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20   Action to take 
25bc0 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  */.  int jumpIfN
25bd0 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74  ull    /* Take t
25be0 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42  he jump if the B
25bf0 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a  ETWEEN is NULL *
25c00 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78 70 72 41  /.){. Expr exprA
25c10 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41  nd;     /* The A
25c20 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20  ND operator in  
25c30 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a  x>=y AND x<=z  *
25c40 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66  /.  Expr compLef
25c50 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e  t;    /* The  x>
25c60 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =y  term */.  Ex
25c70 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20  pr compRight;   
25c80 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65  /* The  x<=z  te
25c90 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70  rm */.  Expr exp
25ca0 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  rX;       /* The
25cb0 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69    x  subexpressi
25cc0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  on */.  int regF
25cd0 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d  ree1 = 0; /* Tem
25ce0 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
25cf0 74 65 72 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74  ter */..  memset
25d00 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20 73  (&compLeft, 0, s
25d10 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
25d20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67 68  memset(&compRigh
25d30 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  t, 0, sizeof(Exp
25d40 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65  r));.  memset(&e
25d50 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65 6f  xprAnd, 0, sizeo
25d60 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73 73  f(Expr));..  ass
25d70 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
25d80 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
25d90 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
25da0 65 78 70 72 4e 6f 64 65 43 6f 70 79 28 26 65 78  exprNodeCopy(&ex
25db0 70 72 58 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  prX, pExpr->pLef
25dc0 74 29 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70  t);.  exprAnd.op
25dd0 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70   = TK_AND;.  exp
25de0 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f  rAnd.pLeft = &co
25df0 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  mpLeft;.  exprAn
25e00 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70  d.pRight = &comp
25e10 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66  Right;.  compLef
25e20 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20  t.op = TK_GE;.  
25e30 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d  compLeft.pLeft =
25e40 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c   &exprX;.  compL
25e50 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  eft.pRight = pEx
25e60 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
25e70 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52  ].pExpr;.  compR
25e80 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b  ight.op = TK_LE;
25e90 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65  .  compRight.pLe
25ea0 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
25eb0 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20  ompRight.pRight 
25ec0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
25ed0 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
25ee0 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26  exprToRegister(&
25ef0 65 78 70 72 58 2c 20 65 78 70 72 43 6f 64 65 56  exprX, exprCodeV
25f00 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 65  ector(pParse, &e
25f10 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
25f20 29 3b 0a 20 20 69 66 28 20 78 4a 75 6d 70 20 29  );.  if( xJump )
25f30 7b 0a 20 20 20 20 78 4a 75 6d 70 28 70 50 61 72  {.    xJump(pPar
25f40 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
25f50 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
25f60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
25f70 20 4d 61 72 6b 20 74 68 65 20 65 78 70 72 65 73   Mark the expres
25f80 73 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 66 72  sion is being fr
25f90 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  om the ON or USI
25fa0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  NG clause of a j
25fb0 6f 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68  oin.    ** so th
25fc0 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 45 78  at the sqlite3Ex
25fd0 70 72 43 6f 64 65 54 61 72 67 65 74 28 29 20 72  prCodeTarget() r
25fe0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20  outine will not 
25ff0 61 74 74 65 6d 70 74 20 74 6f 20 6d 6f 76 65 0a  attempt to move.
26000 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 74      ** it into t
26010 68 65 20 50 61 72 73 65 2e 70 43 6f 6e 73 74 45  he Parse.pConstE
26020 78 70 72 20 6c 69 73 74 2e 20 20 57 65 20 73 68  xpr list.  We sh
26030 6f 75 6c 64 20 75 73 65 20 61 20 6e 65 77 20 62  ould use a new b
26040 69 74 20 66 6f 72 20 74 68 69 73 2c 0a 20 20 20  it for this,.   
26050 20 2a 2a 20 66 6f 72 20 63 6c 61 72 69 74 79 2c   ** for clarity,
26060 20 62 75 74 20 77 65 20 61 72 65 20 6f 75 74 20   but we are out 
26070 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 45  of bits in the E
26080 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 20  xpr.flags field 
26090 73 6f 20 77 65 0a 20 20 20 20 2a 2a 20 68 61 76  so we.    ** hav
260a0 65 20 74 6f 20 72 65 75 73 65 20 74 68 65 20 45  e to reuse the E
260b0 50 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20  P_FromJoin bit. 
260c0 20 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20 20   Bummer. */.    
260d0 65 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45  exprX.flags |= E
260e0 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20  P_FromJoin;.    
260f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
26100 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 26 65  arget(pParse, &e
26110 78 70 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20  xprAnd, dest);. 
26120 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
26130 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
26140 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20  e, regFree1);.. 
26150 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75   /* Ensure adequ
26160 61 74 65 20 74 65 73 74 20 63 6f 76 65 72 61 67  ate test coverag
26170 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  e */.  testcase(
26180 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26190 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
261a0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
261b0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
261c0 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
261d0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72  =sqlite3ExprIfTr
261e0 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ue  && jumpIfNul
261f0 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
26200 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
26210 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
26220 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
26230 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
26240 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
26250 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26260 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26270 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
26280 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
26290 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
262a0 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
262b0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
262c0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
262d0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
262e0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
262f0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
26300 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49  IfFalse && jumpI
26310 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
26320 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
26330 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
26340 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26350 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
26360 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
26370 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
26380 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
26390 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
263a0 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
263b0 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
263c0 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
263d0 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  0 );.}../*.** Ge
263e0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
263f0 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
26400 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
26410 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
26420 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
26430 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
26440 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
26450 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
26460 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
26470 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
26480 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
26490 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
264a0 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
264b0 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
264c0 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
264d0 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
264e0 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
264f0 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
26500 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a  flag is SQLITE_J
26510 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  UMPIFNULL..**.**
26520 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e   This code depen
26530 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74  ds on the fact t
26540 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65  hat certain toke
26550 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b  n values (ex: TK
26560 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20  _EQ).** are the 
26570 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76  same as opcode v
26580 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71  alues (ex: OP_Eq
26590 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  ) that implement
265a0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
265b0 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e  ng.** operation.
265c0 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e    Special commen
265d0 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64  ts in vdbe.c and
265e0 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
265f0 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20  wk script in.** 
26600 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73  the make process
26610 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c   cause these val
26620 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41  ues to align.  A
26630 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20  ssert()s in the 
26640 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65  code.** below ve
26650 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
26660 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65  mbers are aligne
26670 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  d correctly..*/.
26680 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
26690 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
266a0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
266b0 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
266c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
266d0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
266e0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
266f0 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
26700 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
26710 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
26720 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
26730 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
26740 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
26750 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
26760 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
26770 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20  NEVER(v==0) )   
26780 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78    return;  /* Ex
26790 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
267a0 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
267b0 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  r */.  if( NEVER
267c0 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74  (pExpr==0) ) ret
267d0 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20  urn;  /* No way 
267e0 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
267f0 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  */.  op = pExpr-
26800 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  >op;.  switch( o
26810 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
26820 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
26830 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 45 78  K_OR: {.      Ex
26840 70 72 20 2a 70 41 6c 74 20 3d 20 73 71 6c 69 74  pr *pAlt = sqlit
26850 65 33 45 78 70 72 53 69 6d 70 6c 69 66 69 65 64  e3ExprSimplified
26860 41 6e 64 4f 72 28 70 45 78 70 72 29 3b 0a 20 20  AndOr(pExpr);.  
26870 20 20 20 20 69 66 28 20 70 41 6c 74 21 3d 70 45      if( pAlt!=pE
26880 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
26890 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
268a0 28 70 50 61 72 73 65 2c 20 70 41 6c 74 2c 20 64  (pParse, pAlt, d
268b0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
268c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
268d0 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ( op==TK_AND ){.
268e0 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
268f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
26900 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
26910 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
26920 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
26930 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
26940 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
26950 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
26960 74 2c 20 64 32 2c 0a 20 20 20 20 20 20 20 20 20  t, d2,.         
26970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26980 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c    jumpIfNull^SQL
26990 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
269a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
269b0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
269c0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
269d0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
269e0 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ll);.        sql
269f0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
26a00 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
26a10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26a20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
26a30 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
26a40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26a50 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
26a60 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
26a70 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26a80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
26a90 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
26aa0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
26ab0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
26ac0 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
26ad0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26ae0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
26af0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
26b00 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26b10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26b20 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
26b30 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
26b40 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
26b50 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
26b60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
26b70 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20   TK_TRUTH: {.   
26b80 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20     int isNot;   
26b90 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52 55     /* IS NOT TRU
26ba0 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c 53  E or IS NOT FALS
26bb0 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  E */.      int i
26bc0 73 54 72 75 65 3b 20 20 20 20 20 2f 2a 20 49 53  sTrue;     /* IS
26bd0 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20   TRUE or IS NOT 
26be0 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 74 65  TRUE */.      te
26bf0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26c00 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ll==0 );.      i
26c10 73 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70  sNot = pExpr->op
26c20 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20  2==TK_ISNOT;.   
26c30 20 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69     isTrue = sqli
26c40 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75  te3ExprTruthValu
26c50 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  e(pExpr->pRight)
26c60 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
26c70 28 20 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f  ( isTrue && isNo
26c80 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
26c90 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26 20  ase( !isTrue && 
26ca0 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69  isNot );.      i
26cb0 66 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e 6f  f( isTrue ^ isNo
26cc0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
26cd0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
26ce0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
26cf0 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20  eft, dest,.     
26d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d10 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c       isNot ? SQL
26d20 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a  ITE_JUMPIFNULL :
26d30 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
26d40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26d50 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
26d60 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
26d70 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20  t, dest,.       
26d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d90 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c 49      isNot ? SQLI
26da0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a 20  TE_JUMPIFNULL : 
26db0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
26dc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26dd0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
26de0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
26df0 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
26e00 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
26e10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
26e20 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
26e30 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
26e40 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
26e50 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_NE;.      jum
26e60 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
26e70 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
26e80 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
26e90 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
26ea0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
26eb0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
26ec0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
26ed0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
26ee0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
26ef0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
26f00 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
26f10 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
26f20 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
26f30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
26f40 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26f50 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
26f60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
26f70 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
26f80 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
26f90 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
26fa0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
26fb0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
26fc0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
26fd0 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
26fe0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
26ff0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
27000 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
27010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27020 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
27030 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
27040 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
27050 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
27060 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
27070 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27080 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
27090 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
270a0 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
270b0 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
270c0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
270d0 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
270e0 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
270f0 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
27100 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
27110 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
27120 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
27130 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
27140 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
27150 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
27160 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
27170 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
27180 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
27190 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
271a0 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
271b0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
271c0 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
271d0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
271e0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
271f0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27200 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
27210 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
27220 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
27230 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
27240 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
27250 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
27260 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27270 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
27280 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
27290 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
272a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
272b0 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
272c0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
272d0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
272e0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
272f0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
27300 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
27310 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
27320 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
27330 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
27340 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
27350 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
27360 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
27370 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20  =OP_IsNull );   
27380 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
27390 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
273a0 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
273b0 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
273c0 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ); testcase( op=
273d0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
273e0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
273f0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
27400 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
27410 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
27420 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27430 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
27440 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
27450 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27460 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
27470 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
27480 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
27490 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
274a0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
274b0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
274c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
274d0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
274e0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
274f0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
27500 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
27510 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
27520 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
27530 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
27540 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
27550 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27560 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
27570 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
27580 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
27590 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
275a0 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
275b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
275c0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
275d0 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a  t destIfNull = j
275e0 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74  umpIfNull ? dest
275f0 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   : destIfFalse;.
27600 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27610 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
27620 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
27630 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
27640 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27650 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
27660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27670 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
27680 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
27690 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
276a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
276b0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66  fault: {.    def
276c0 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20  ault_expr:.     
276d0 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73 54   if( ExprAlwaysT
276e0 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
276f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27700 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
27710 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
27720 45 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  ExprAlwaysFalse(
27730 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
27740 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* No-op */.  
27750 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27760 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
27770 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
27780 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
27790 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
277a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
277b0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64  (v, OP_If, r1, d
277c0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
277d0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
277e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
277f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27800 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
27810 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
27820 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
27830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27840 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
27850 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
27860 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
27870 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
27880 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
27890 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
278a0 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ree2);  .}../*.*
278b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
278c0 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
278d0 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
278e0 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
278f0 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
27900 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
27910 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
27920 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
27930 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
27940 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
27950 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
27960 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
27970 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
27980 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
27990 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
279a0 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
279b0 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
279c0 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f  fNull is SQLITE_
279d0 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61  JUMPIFNULL or fa
279e0 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
279f0 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30  mpIfNull.** is 0
27a00 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
27a10 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72  3ExprIfFalse(Par
27a20 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
27a30 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
27a40 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
27a50 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
27a60 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
27a70 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
27a80 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
27a90 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
27aa0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
27ab0 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
27ac0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
27ad0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
27ae0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
27af0 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
27b00 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45  ) ) return; /* E
27b10 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
27b20 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
27b30 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  er */.  if( pExp
27b40 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e  r==0 )    return
27b50 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
27b60 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
27b70 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
27b80 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
27b90 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
27ba0 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
27bb0 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
27bc0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
27bd0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
27be0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
27bf0 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
27c00 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
27c10 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
27c20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
27c30 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
27c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
27c50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
27c60 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
27c70 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
27c80 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
27c90 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
27ca0 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
27cb0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
27cc0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
27cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
27ce0 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
27cf0 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
27d00 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
27d10 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
27d20 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
27d30 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
27d40 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
27d50 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
27d60 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
27d70 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
27d80 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
27d90 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
27da0 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
27db0 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
27dc0 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
27dd0 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
27de0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
27df0 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
27e00 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
27e10 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
27e20 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
27e30 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
27e40 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
27e50 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
27e60 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
27e70 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
27e80 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
27e90 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
27ea0 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
27eb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27ec0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
27ed0 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
27ee0 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
27ef0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
27f00 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
27f10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
27f20 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
27f30 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
27f40 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27f50 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
27f60 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
27f70 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27f80 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
27f90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27fa0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
27fb0 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
27fc0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27fd0 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
27fe0 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
27ff0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
28000 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
28010 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
28020 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
28030 70 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pAlt = sqlite3Ex
28040 70 72 53 69 6d 70 6c 69 66 69 65 64 41 6e 64 4f  prSimplifiedAndO
28050 72 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  r(pExpr);.      
28060 69 66 28 20 70 41 6c 74 21 3d 70 45 78 70 72 20  if( pAlt!=pExpr 
28070 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28080 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
28090 61 72 73 65 2c 20 70 41 6c 74 2c 20 64 65 73 74  arse, pAlt, dest
280a0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
280b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
280c0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  Expr->op==TK_AND
280d0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
280e0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
280f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==0 );.        s
28100 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
28110 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
28120 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
28130 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
28140 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
28150 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
28160 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
28170 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
28180 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28190 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
281a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
281b0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
281c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
281d0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
281e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
281f0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
28200 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
28210 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 75 6d               jum
28230 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
28240 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
28250 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
28260 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
28270 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
28280 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
28290 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
282a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
282b0 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 7d  (v, d2);.      }
282c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
282d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
282e0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
282f0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
28300 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
28310 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
28320 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28330 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
28340 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
28350 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
28360 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b  case TK_TRUTH: {
28370 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f 74  .      int isNot
28380 3b 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52  ;   /* IS NOT TR
28390 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c  UE or IS NOT FAL
283a0 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  SE */.      int 
283b0 69 73 54 72 75 65 3b 20 20 2f 2a 20 49 53 20 54  isTrue;  /* IS T
283c0 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52  RUE or IS NOT TR
283d0 55 45 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  UE */.      test
283e0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
283f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73 4e  ==0 );.      isN
28400 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d  ot = pExpr->op2=
28410 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20  =TK_ISNOT;.     
28420 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65   isTrue = sqlite
28430 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28  3ExprTruthValue(
28440 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
28450 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28460 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20  isTrue && isNot 
28470 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
28480 65 28 20 21 69 73 54 72 75 65 20 26 26 20 69 73  e( !isTrue && is
28490 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Not );.      if(
284a0 20 69 73 54 72 75 65 20 5e 20 69 73 4e 6f 74 20   isTrue ^ isNot 
284b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53  ){.        /* IS
284c0 20 54 52 55 45 20 61 6e 64 20 49 53 20 4e 4f 54   TRUE and IS NOT
284d0 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20   FALSE */.      
284e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
284f0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
28500 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
28510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28520 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f              isNo
28530 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a  t ? 0 : SQLITE_J
28540 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 0a 20 20 20  UMPIFNULL);..   
28550 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28560 20 20 2f 2a 20 49 53 20 46 41 4c 53 45 20 61 6e    /* IS FALSE an
28570 64 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f  d IS NOT TRUE */
28580 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28590 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
285a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
285b0 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20   dest,.         
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285d0 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51 4c   isNot ? 0 : SQL
285e0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
285f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
28600 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
28610 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
28620 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
28630 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
28640 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
28650 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
28660 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
28670 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
28680 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d  op = (pExpr->op=
28690 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20  =TK_IS) ? TK_NE 
286a0 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a  : TK_EQ;.      j
286b0 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49  umpIfNull = SQLI
286c0 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
286d0 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f   /* Fall thru */
286e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
286f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
28700 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
28710 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
28720 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
28730 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
28740 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
28750 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
28760 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
28770 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78   goto default_ex
28780 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  pr;.      testca
28790 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
287a0 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
287b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
287c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
287d0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
287e0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
287f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
28800 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
28810 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
28820 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
28830 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
28840 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
28850 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
28860 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
28870 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
28880 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
28890 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
288a0 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
288b0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
288c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
288d0 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
288e0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
288f0 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
28900 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
28910 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
28920 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
28930 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
28940 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
28950 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
28960 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
28970 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
28980 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
28990 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
289a0 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
289b0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
289c0 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
289d0 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
289e0 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
289f0 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56  =OP_Eq);.      V
28a00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
28a10 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
28a20 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
28a30 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
28a40 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
28a50 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
28a60 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
28a70 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
28a80 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
28a90 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
28aa0 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
28ab0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
28ac0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
28ad0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
28ae0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
28af0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
28b00 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
28b10 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
28b20 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
28b30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
28b40 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
28b50 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
28b60 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
28b70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
28b80 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
28b90 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
28ba0 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
28bb0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
28bc0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
28bd0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
28be0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
28bf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28c00 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
28c10 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
28c20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
28c30 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65  LL );   VdbeCove
28c40 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
28c50 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
28c60 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
28c70 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62  _NOTNULL );  Vdb
28c80 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
28c90 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
28ca0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28cb0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
28cc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28cd0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
28ce0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
28cf0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
28d00 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
28d10 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
28d20 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
28d30 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72  est, sqlite3Expr
28d40 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e  IfFalse, jumpIfN
28d50 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
28d60 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
28d70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
28d80 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
28d90 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_IN: {.      if
28da0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a  ( jumpIfNull ){.
28db0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28dc0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
28dd0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
28de0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
28df0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  e{.        int d
28e00 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
28e10 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
28e20 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
28e30 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
28e40 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
28e50 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e  r, dest, destIfN
28e60 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ull);.        sq
28e70 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
28e80 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e  Label(v, destIfN
28e90 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ull);.      }.  
28ea0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
28eb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
28ec0 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75  ult: {.    defau
28ed0 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20 20 20 20  lt_expr: .      
28ee0 69 66 28 20 45 78 70 72 41 6c 77 61 79 73 46 61  if( ExprAlwaysFa
28ef0 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
28f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28f10 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
28f20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
28f30 45 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  ExprAlwaysTrue(p
28f40 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
28f50 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* no-op */.   
28f60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28f70 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
28f80 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
28f90 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
28fa0 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee1);.        sq
28fb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
28fc0 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c  v, OP_IfNot, r1,
28fd0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
28fe0 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56  l!=0);.        V
28ff0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
29000 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
29010 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
29020 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
29030 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
29040 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
29050 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
29060 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
29070 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
29080 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
29090 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
290a0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
290b0 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  gFree2);.}../*.*
290c0 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78  * Like sqlite3Ex
290d0 70 72 49 66 46 61 6c 73 65 28 29 20 65 78 63 65  prIfFalse() exce
290e0 70 74 20 74 68 61 74 20 61 20 63 6f 70 79 20 69  pt that a copy i
290f0 73 20 6d 61 64 65 20 6f 66 20 70 45 78 70 72 20  s made of pExpr 
29100 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65 20 67  before.** code g
29110 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 74  eneration, and t
29120 68 61 74 20 63 6f 70 79 20 69 73 20 64 65 6c 65  hat copy is dele
29130 74 65 64 20 61 66 74 65 72 20 63 6f 64 65 20 67  ted after code g
29140 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 0a  eneration. This.
29150 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ** ensures that 
29160 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 45 78  the original pEx
29170 70 72 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  pr is unchanged.
29180 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
29190 45 78 70 72 49 66 46 61 6c 73 65 44 75 70 28 50  ExprIfFalseDup(P
291a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
291b0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
291c0 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66 4e 75  est,int jumpIfNu
291d0 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ll){.  sqlite3 *
291e0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
291f0 0a 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d  .  Expr *pCopy =
29200 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
29210 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
29220 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
29230 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
29240 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
29250 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f 70 79  se(pParse, pCopy
29260 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
29270 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ll);.  }.  sqlit
29280 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
29290 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pCopy);.}../*.*
292a0 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 56 61  * Expression pVa
292b0 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  r is guaranteed 
292c0 74 6f 20 62 65 20 61 6e 20 53 51 4c 20 76 61 72  to be an SQL var
292d0 69 61 62 6c 65 2e 20 70 45 78 70 72 20 6d 61 79  iable. pExpr may
292e0 20 62 65 20 61 6e 79 0a 2a 2a 20 74 79 70 65 20   be any.** type 
292f0 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  of expression..*
29300 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73  *.** If pExpr is
29310 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61   a simple SQL va
29320 6c 75 65 20 2d 20 61 6e 20 69 6e 74 65 67 65 72  lue - an integer
29330 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c 20  , real, string, 
29340 62 6c 6f 62 0a 2a 2a 20 6f 72 20 4e 55 4c 4c 20  blob.** or NULL 
29350 76 61 6c 75 65 20 2d 20 74 68 65 6e 20 74 68 65  value - then the
29360 20 56 44 42 45 20 63 75 72 72 65 6e 74 6c 79 20   VDBE currently 
29370 62 65 69 6e 67 20 70 72 65 70 61 72 65 64 20 69  being prepared i
29380 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20  s configured.** 
29390 74 6f 20 72 65 2d 70 72 65 70 61 72 65 20 65 61  to re-prepare ea
293a0 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 76 61  ch time a new va
293b0 6c 75 65 20 69 73 20 62 6f 75 6e 64 20 74 6f 20  lue is bound to 
293c0 76 61 72 69 61 62 6c 65 20 70 56 61 72 2e 0a 2a  variable pVar..*
293d0 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c  *.** Additionall
293e0 79 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 61  y, if pExpr is a
293f0 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75   simple SQL valu
29400 65 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  e and the value 
29410 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  is the.** same a
29420 73 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  s that currently
29430 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61 62   bound to variab
29440 6c 65 20 70 56 61 72 2c 20 6e 6f 6e 2d 7a 65 72  le pVar, non-zer
29450 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  o is returned..*
29460 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
29470 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 6e  the values are n
29480 6f 74 20 74 68 65 20 73 61 6d 65 20 6f 72 20 69  ot the same or i
29490 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61  f pExpr is not a
294a0 20 73 69 6d 70 6c 65 0a 2a 2a 20 53 51 4c 20 76   simple.** SQL v
294b0 61 6c 75 65 2c 20 7a 65 72 6f 20 69 73 20 72 65  alue, zero is re
294c0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
294d0 63 20 69 6e 74 20 65 78 70 72 43 6f 6d 70 61 72  c int exprCompar
294e0 65 56 61 72 69 61 62 6c 65 28 50 61 72 73 65 20  eVariable(Parse 
294f0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
29500 56 61 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Var, Expr *pExpr
29510 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30  ){.  int res = 0
29520 3b 0a 20 20 69 6e 74 20 69 56 61 72 3b 0a 20 20  ;.  int iVar;.  
29530 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
29540 4c 2c 20 2a 70 52 20 3d 20 30 3b 0a 20 20 0a 20  L, *pR = 0;.  . 
29550 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f   sqlite3ValueFro
29560 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62  mExpr(pParse->db
29570 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54 45 5f  , pExpr, SQLITE_
29580 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 41 46 46  UTF8, SQLITE_AFF
29590 5f 42 4c 4f 42 2c 20 26 70 52 29 3b 0a 20 20 69  _BLOB, &pR);.  i
295a0 66 28 20 70 52 20 29 7b 0a 20 20 20 20 69 56 61  f( pR ){.    iVa
295b0 72 20 3d 20 70 56 61 72 2d 3e 69 43 6f 6c 75 6d  r = pVar->iColum
295c0 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
295d0 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61  beSetVarmask(pPa
295e0 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72  rse->pVdbe, iVar
295f0 29 3b 0a 20 20 20 20 70 4c 20 3d 20 73 71 6c 69  );.    pL = sqli
29600 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56  te3VdbeGetBoundV
29610 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52 65  alue(pParse->pRe
29620 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20 53  prepare, iVar, S
29630 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 29 3b  QLITE_AFF_BLOB);
29640 0a 20 20 20 20 69 66 28 20 70 4c 20 29 7b 0a 20  .    if( pL ){. 
29650 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
29660 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4c 29 3d  _value_type(pL)=
29670 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
29680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
29690 76 61 6c 75 65 5f 74 65 78 74 28 70 4c 29 3b 20  value_text(pL); 
296a0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
296b0 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 55 54 46   encoding is UTF
296c0 2d 38 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  -8 */.      }.  
296d0 20 20 20 20 72 65 73 20 3d 20 20 30 3d 3d 73 71      res =  0==sq
296e0 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
296f0 70 4c 2c 20 70 52 2c 20 30 29 3b 0a 20 20 20 20  pL, pR, 0);.    
29700 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  }.    sqlite3Val
29710 75 65 46 72 65 65 28 70 52 29 3b 0a 20 20 20 20  ueFree(pR);.    
29720 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
29730 28 70 4c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  (pL);.  }..  ret
29740 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
29750 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70  * Do a deep comp
29760 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78  arison of two ex
29770 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20  pression trees. 
29780 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
29790 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
297a0 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65  ons are complete
297b0 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52  ly identical.  R
297c0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20  eturn 1 if they 
297d0 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62  differ only.** b
297e0 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  y a COLLATE oper
297f0 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20  ator at the top 
29800 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32  level.  Return 2
29810 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69   if there are di
29820 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68  fferences.** oth
29830 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d  er than the top-
29840 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70  level COLLATE op
29850 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  erator..**.** If
29860 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20   any subelement 
29870 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69  of pB has Expr.i
29880 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e  Table==(-1) then
29890 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a   it is allowed.*
298a0 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75  * to compare equ
298b0 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c  al to an equival
298c0 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70  ent element in p
298d0 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62  A with Expr.iTab
298e0 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20  le==iTab..**.** 
298f0 54 68 65 20 70 41 20 73 69 64 65 20 6d 69 67 68  The pA side migh
29900 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45  t be using TK_RE
29910 47 49 53 54 45 52 2e 20 20 49 66 20 74 68 61 74  GISTER.  If that
29920 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64   is the case and
29930 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73   pB is.** not us
29940 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20  ing TK_REGISTER 
29950 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65  but is otherwise
29960 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65   equivalent, the
29970 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30  n still return 0
29980 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  ..**.** Sometime
29990 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
299a0 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65  ill return 2 eve
299b0 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70  n if the two exp
299c0 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c  ressions.** real
299d0 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  ly are equivalen
299e0 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74  t.  If we cannot
299f0 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20   prove that the 
29a00 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a  expressions are.
29a10 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65  ** identical, we
29a20 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74   return 2 just t
29a30 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69  o be safe.  So i
29a40 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
29a50 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65  * returns 2, the
29a60 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61  n you do not rea
29a70 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72  lly know for cer
29a80 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a  tain if the two.
29a90 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
29aa0 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  re the same.  Bu
29ab0 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 30  t if you get a 0
29ac0 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68   or 1 return, th
29ad0 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65  en you.** can be
29ae0 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73   sure the expres
29af0 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
29b00 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63  me.  In the plac
29b10 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73  es where.** this
29b20 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
29b30 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75  , it does not hu
29b40 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74  rt to get an ext
29b50 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a  ra 2 - that.** j
29b60 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74  ust might result
29b70 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c   in some slightl
29b80 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20  y slower code.  
29b90 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  But returning.**
29ba0 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20   an incorrect 0 
29bb0 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20  or 1 could lead 
29bc0 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  to a malfunction
29bd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73  ..**.** If pPars
29be0 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  e is not NULL th
29bf0 65 6e 20 54 4b 5f 56 41 52 49 41 42 4c 45 20 74  en TK_VARIABLE t
29c00 65 72 6d 73 20 69 6e 20 70 41 20 77 69 74 68 20  erms in pA with 
29c10 62 69 6e 64 69 6e 67 73 20 69 6e 0a 2a 2a 20 70  bindings in.** p
29c20 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72  Parse->pReprepar
29c30 65 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64  e can be matched
29c40 20 61 67 61 69 6e 73 74 20 6c 69 74 65 72 61 6c   against literal
29c50 73 20 69 6e 20 70 42 2e 20 20 54 68 65 20 0a 2a  s in pB.  The .*
29c60 2a 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2d  * pParse->pVdbe-
29c70 3e 65 78 70 6d 61 73 6b 20 62 69 74 6d 61 73 6b  >expmask bitmask
29c80 20 69 73 20 75 70 64 61 74 65 64 20 66 6f 72 20   is updated for 
29c90 65 61 63 68 20 76 61 72 69 61 62 6c 65 20 72 65  each variable re
29ca0 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 49 66 20  ferenced..** If 
29cb0 70 50 61 72 73 65 20 69 73 20 4e 55 4c 4c 20 28  pParse is NULL (
29cc0 74 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73 65 29  the normal case)
29cd0 20 74 68 65 6e 20 61 6e 79 20 54 4b 5f 56 41 52   then any TK_VAR
29ce0 49 41 42 4c 45 20 74 65 72 6d 20 69 6e 20 0a 2a  IABLE term in .*
29cf0 2a 20 41 72 67 75 6d 65 6e 74 20 70 50 61 72 73  * Argument pPars
29d00 65 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  e should normall
29d10 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69 74  y be NULL. If it
29d20 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64   is not NULL and
29d30 20 70 41 20 6f 72 0a 2a 2a 20 70 42 20 63 61 75   pA or.** pB cau
29d40 73 65 73 20 61 20 72 65 74 75 72 6e 20 76 61 6c  ses a return val
29d50 75 65 20 6f 66 20 32 2e 0a 2a 2f 0a 69 6e 74 20  ue of 2..*/.int 
29d60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
29d70 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  re(Parse *pParse
29d80 2c 20 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  , Expr *pA, Expr
29d90 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
29da0 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46  .  u32 combinedF
29db0 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d  lags;.  if( pA==
29dc0 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20  0 || pB==0 ){.  
29dd0 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20    return pB==pA 
29de0 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 69  ? 0 : 2;.  }.  i
29df0 66 28 20 70 50 61 72 73 65 20 26 26 20 70 41 2d  f( pParse && pA-
29e00 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45  >op==TK_VARIABLE
29e10 20 26 26 20 65 78 70 72 43 6f 6d 70 61 72 65 56   && exprCompareV
29e20 61 72 69 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ariable(pParse, 
29e30 70 41 2c 20 70 42 29 20 29 7b 0a 20 20 20 20 72  pA, pB) ){.    r
29e40 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 63  eturn 0;.  }.  c
29e50 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70  ombinedFlags = p
29e60 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66  A->flags | pB->f
29e70 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62  lags;.  if( comb
29e80 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49  inedFlags & EP_I
29e90 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
29ea0 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42  f( (pA->flags&pB
29eb0 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61  ->flags&EP_IntVa
29ec0 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75  lue)!=0 && pA->u
29ed0 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69  .iValue==pB->u.i
29ee0 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72  Value ){.      r
29ef0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
29f00 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
29f10 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
29f20 42 2d 3e 6f 70 20 7c 7c 20 70 41 2d 3e 6f 70 3d  B->op || pA->op=
29f30 3d 54 4b 5f 52 41 49 53 45 20 29 7b 0a 20 20 20  =TK_RAISE ){.   
29f40 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
29f50 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
29f60 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
29f70 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c  arse, pA->pLeft,
29f80 70 42 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20  pB,iTab)<2 ){.  
29f90 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
29fa0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e    }.    if( pB->
29fb0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
29fc0 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
29fd0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2c  pare(pParse, pA,
29fe0 70 42 2d 3e 70 4c 65 66 74 2c 69 54 61 62 29 3c  pB->pLeft,iTab)<
29ff0 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
2a000 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 1;.    }.    r
2a010 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
2a020 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  f( pA->op!=TK_CO
2a030 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d  LUMN && pA->op!=
2a040 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26  TK_AGG_COLUMN &&
2a050 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b   pA->u.zToken ){
2a060 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d  .    if( pA->op=
2a070 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a  =TK_FUNCTION ){.
2a080 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2a090 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a  3StrICmp(pA->u.z
2a0a0 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
2a0b0 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  en)!=0 ) return 
2a0c0 32 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  2;.#ifndef SQLIT
2a0d0 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
2a0e0 43 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69  C.      /* Justi
2a0f0 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  fication for the
2a100 20 61 73 73 65 72 74 28 29 3a 0a 20 20 20 20 20   assert():.     
2a110 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74   ** window funct
2a120 69 6f 6e 73 20 68 61 76 65 20 70 2d 3e 6f 70 3d  ions have p->op=
2a130 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 62 75 74  =TK_FUNCTION but
2a140 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2a150 69 6f 6e 73 0a 20 20 20 20 20 20 2a 2a 20 68 61  ions.      ** ha
2a160 76 65 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  ve p->op==TK_AGG
2a170 5f 46 55 4e 43 54 49 4f 4e 2e 20 20 53 6f 20 61  _FUNCTION.  So a
2a180 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65  ny comparison be
2a190 74 77 65 65 6e 20 61 6e 20 61 67 67 72 65 67 61  tween an aggrega
2a1a0 74 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  te.      ** func
2a1b0 74 69 6f 6e 20 61 6e 64 20 61 20 77 69 6e 64 6f  tion and a windo
2a1c0 77 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  w function shoul
2a1d0 64 20 68 61 76 65 20 66 61 69 6c 65 64 20 62 65  d have failed be
2a1e0 66 6f 72 65 20 72 65 61 63 68 69 6e 67 0a 20 20  fore reaching.  
2a1f0 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e      ** this poin
2a200 74 2e 20 20 41 6e 64 2c 20 69 74 20 69 73 20 6e  t.  And, it is n
2a210 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68  ot possible to h
2a220 61 76 65 20 61 20 77 69 6e 64 6f 77 20 66 75 6e  ave a window fun
2a230 63 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ction and.      
2a240 2a 2a 20 61 20 73 63 61 6c 61 72 20 66 75 6e 63  ** a scalar func
2a250 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73 61  tion with the sa
2a260 6d 65 20 6e 61 6d 65 20 61 6e 64 20 6e 75 6d 62  me name and numb
2a270 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
2a280 20 20 53 6f 0a 20 20 20 20 20 20 2a 2a 20 69 66    So.      ** if
2a290 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
2a2a0 6f 69 6e 74 2c 20 65 69 74 68 65 72 20 41 20 61  oint, either A a
2a2b0 6e 64 20 42 20 62 6f 74 68 20 77 69 6e 64 6f 77  nd B both window
2a2c0 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 0a 20 20   functions or.  
2a2d0 20 20 20 20 2a 2a 20 6e 65 69 74 68 65 72 20 61      ** neither a
2a2e0 72 65 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63  re a window func
2a2f0 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tions. */.      
2a300 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
2a310 72 6f 70 65 72 74 79 28 70 41 2c 45 50 5f 57 69  roperty(pA,EP_Wi
2a320 6e 46 75 6e 63 29 3d 3d 45 78 70 72 48 61 73 50  nFunc)==ExprHasP
2a330 72 6f 70 65 72 74 79 28 70 42 2c 45 50 5f 57 69  roperty(pB,EP_Wi
2a340 6e 46 75 6e 63 29 20 29 3b 0a 20 20 20 20 20 20  nFunc) );.      
2a350 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
2a360 72 74 79 28 70 41 2c 45 50 5f 57 69 6e 46 75 6e  rty(pA,EP_WinFun
2a370 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  c) ){.        if
2a380 28 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  ( sqlite3WindowC
2a390 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 70 41  ompare(pParse,pA
2a3a0 2d 3e 79 2e 70 57 69 6e 2c 70 42 2d 3e 79 2e 70  ->y.pWin,pB->y.p
2a3b0 57 69 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  Win)!=0 ) return
2a3c0 20 32 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   2;.      }.#end
2a3d0 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  if.    }else if(
2a3e0 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c   pA->op==TK_NULL
2a3f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2a400 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
2a410 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pA->op==TK_COL
2a420 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66  LATE ){.      if
2a430 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
2a440 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
2a450 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
2a460 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a470 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
2a480 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30  (pB->u.zToken!=0
2a490 29 20 26 26 20 73 74 72 63 6d 70 28 70 41 2d 3e  ) && strcmp(pA->
2a4a0 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
2a4b0 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20  Token)!=0 ){.   
2a4c0 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
2a4d0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41   }.  }.  if( (pA
2a4e0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
2a4f0 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61  tinct)!=(pB->fla
2a500 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
2a510 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
2a520 69 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61  if( (combinedFla
2a530 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  gs & EP_TokenOnl
2a540 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  y)==0 ){.    if(
2a550 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26   combinedFlags &
2a560 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20   EP_xIsSelect ) 
2a570 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
2a580 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  ( (combinedFlags
2a590 20 26 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 3d   & EP_FixedCol)=
2a5a0 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  =0.     && sqlit
2a5b0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
2a5c0 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c  arse, pA->pLeft,
2a5d0 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62   pB->pLeft, iTab
2a5e0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
2a5f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2a600 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
2a610 20 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d   pA->pRight, pB-
2a620 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29  >pRight, iTab) )
2a630 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
2a640 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
2a650 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e  stCompare(pA->x.
2a660 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69  pList, pB->x.pLi
2a670 73 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  st, iTab) ) retu
2a680 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 70 41  rn 2;.    if( pA
2a690 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 0a  ->op!=TK_STRING.
2a6a0 20 20 20 20 20 26 26 20 70 41 2d 3e 6f 70 21 3d       && pA->op!=
2a6b0 54 4b 5f 54 52 55 45 46 41 4c 53 45 0a 20 20 20  TK_TRUEFALSE.   
2a6c0 20 20 26 26 20 28 63 6f 6d 62 69 6e 65 64 46 6c    && (combinedFl
2a6d0 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64  ags & EP_Reduced
2a6e0 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
2a6f0 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75 6d    if( pA->iColum
2a700 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29  n!=pB->iColumn )
2a710 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20   return 2;.     
2a720 20 69 66 28 20 70 41 2d 3e 6f 70 32 21 3d 70 42   if( pA->op2!=pB
2a730 2d 3e 6f 70 32 20 29 20 72 65 74 75 72 6e 20 32  ->op2 ) return 2
2a740 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  ;.      if( pA->
2a750 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62  iTable!=pB->iTab
2a760 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70  le .       && (p
2a770 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  A->iTable!=iTab 
2a780 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61  || NEVER(pB->iTa
2a790 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72  ble>=0)) ) retur
2a7a0 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 2;.    }.  }. 
2a7b0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2a7c0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
2a7d0 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
2a7e0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
2a7f0 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
2a800 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65  l and .** non-ze
2a810 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65  ro if they diffe
2a820 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a  r in any way..**
2a830 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
2a840 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
2a850 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
2a860 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
2a870 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
2a880 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
2a890 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
2a8a0 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
2a8b0 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
2a8c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2a8d0 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  ne might return 
2a8e0 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75  non-zero for equ
2a8f0 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74  ivalent ExprList
2a900 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20  s.  The.** only 
2a910 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c  consequence will
2a920 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74   be disabled opt
2a930 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74  imizations.  But
2a940 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
2a950 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75   must never retu
2a960 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20  rn 0 if the two 
2a970 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
2a980 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20   are different, 
2a990 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74  or.** a malfunct
2a9a0 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e  ion will result.
2a9b0 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
2a9c0 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e  pointers are con
2a9d0 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68  sidered to be th
2a9e0 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e  e same.  But a N
2a9f0 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61  ULL pointer.** a
2aa00 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72  lways differs fr
2aa10 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f  om a non-NULL po
2aa20 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
2aa30 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
2aa40 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70  pare(ExprList *p
2aa50 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c  A, ExprList *pB,
2aa60 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e   int iTab){.  in
2aa70 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  t i;.  if( pA==0
2aa80 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75   && pB==0 ) retu
2aa90 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d  rn 0;.  if( pA==
2aaa0 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74  0 || pB==0 ) ret
2aab0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d  urn 1;.  if( pA-
2aac0 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70  >nExpr!=pB->nExp
2aad0 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
2aae0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e  for(i=0; i<pA->n
2aaf0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2ab00 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70  Expr *pExprA = p
2ab10 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  A->a[i].pExpr;. 
2ab20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20     Expr *pExprB 
2ab30 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pB->a[i].pExpr
2ab40 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b  ;.    if( pA->a[
2ab50 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42  i].sortOrder!=pB
2ab60 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2ab70 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
2ab80 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2ab90 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72  Compare(0, pExpr
2aba0 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29  A, pExprB, iTab)
2abb0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
2abc0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2abd0 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74  /*.** Like sqlit
2abe0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 29 20  e3ExprCompare() 
2abf0 65 78 63 65 70 74 20 43 4f 4c 4c 41 54 45 20 6f  except COLLATE o
2ac00 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65 20  perators at the 
2ac10 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72 65  top-level.** are
2ac20 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74   ignored..*/.int
2ac30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2ac40 61 72 65 53 6b 69 70 28 45 78 70 72 20 2a 70 41  areSkip(Expr *pA
2ac50 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
2ac60 69 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e 20  iTab){.  return 
2ac70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2ac80 72 65 28 30 2c 0a 20 20 20 20 20 20 20 20 20 20  re(0,.          
2ac90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b     sqlite3ExprSk
2aca0 69 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c 0a 20  ipCollate(pA),. 
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2acc0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2acd0 74 65 28 70 42 29 2c 0a 20 20 20 20 20 20 20 20  te(pB),.        
2ace0 20 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a 0a 2f       iTab);.}../
2acf0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
2ad00 7a 65 72 6f 20 69 66 20 45 78 70 72 20 70 20 63  zero if Expr p c
2ad10 61 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75 65 20  an only be true 
2ad20 69 66 20 70 4e 4e 20 69 73 20 6e 6f 74 20 4e 55  if pNN is not NU
2ad30 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LL..*/.static in
2ad40 74 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74  t exprImpliesNot
2ad50 4e 75 6c 6c 28 0a 20 20 50 61 72 73 65 20 2a 70  Null(.  Parse *p
2ad60 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
2ad70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2ad80 2f 0a 20 20 45 78 70 72 20 2a 70 2c 20 20 20 20  /.  Expr *p,    
2ad90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
2ada0 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
2adb0 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 45 78 70  checked */.  Exp
2adc0 72 20 2a 70 4e 4e 2c 20 20 20 20 20 20 20 20 20  r *pNN,         
2add0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
2ade0 6f 6e 20 74 68 61 74 20 69 73 20 4e 4f 54 20 4e  on that is NOT N
2adf0 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ULL */.  int iTa
2ae00 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b,           /* 
2ae10 54 61 62 6c 65 20 62 65 69 6e 67 20 65 76 61 6c  Table being eval
2ae20 75 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  uated */.  int s
2ae30 65 65 6e 4e 6f 74 20 20 20 20 20 20 20 20 20 2f  eenNot         /
2ae40 2a 20 54 72 75 65 20 69 66 20 70 20 69 73 20 61  * True if p is a
2ae50 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 4e 4f 54  n operand of NOT
2ae60 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
2ae70 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   p );.  assert( 
2ae80 70 4e 4e 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  pNN );.  if( sql
2ae90 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2aea0 70 50 61 72 73 65 2c 20 70 2c 20 70 4e 4e 2c 20  pParse, p, pNN, 
2aeb0 69 54 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72  iTab)==0 ) retur
2aec0 6e 20 31 3b 0a 20 20 73 77 69 74 63 68 28 20 70  n 1;.  switch( p
2aed0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
2aee0 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
2aef0 69 66 28 20 73 65 65 6e 4e 6f 74 20 26 26 20 45  if( seenNot && E
2af00 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2af10 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2af20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
2af30 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
2af40 73 50 72 6f 70 65 72 74 79 28 70 2c 45 50 5f 78  sProperty(p,EP_x
2af50 49 73 53 65 6c 65 63 74 29 0a 20 20 20 20 20 20  IsSelect).      
2af60 20 20 20 20 20 7c 7c 20 28 70 2d 3e 78 2e 70 4c       || (p->x.pL
2af70 69 73 74 21 3d 30 20 26 26 20 70 2d 3e 78 2e 70  ist!=0 && p->x.p
2af80 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 20 29  List->nExpr>0) )
2af90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 65  ;.      return e
2afa0 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c  xprImpliesNotNul
2afb0 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65  l(pParse, p->pLe
2afc0 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73  ft, pNN, iTab, s
2afd0 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a 20  eenNot);.    }. 
2afe0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
2aff0 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
2b000 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 2d  List *pList = p-
2b010 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
2b020 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
2b030 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2b040 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
2b050 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
2b060 65 65 6e 4e 6f 74 20 29 20 72 65 74 75 72 6e 20  eenNot ) return 
2b070 30 3b 0a 20 20 20 20 20 20 69 66 28 20 65 78 70  0;.      if( exp
2b080 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28  rImpliesNotNull(
2b090 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
2b0a0 5b 30 5d 2e 70 45 78 70 72 2c 20 70 4e 4e 2c 20  [0].pExpr, pNN, 
2b0b0 69 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29 0a 20  iTab, seenNot). 
2b0c0 20 20 20 20 20 20 7c 7c 20 65 78 70 72 49 6d 70        || exprImp
2b0d0 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70 50 61 72  liesNotNull(pPar
2b0e0 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  se, pList->a[1].
2b0f0 70 45 78 70 72 2c 20 70 4e 4e 2c 20 69 54 61 62  pExpr, pNN, iTab
2b100 2c 20 73 65 65 6e 4e 6f 74 29 0a 20 20 20 20 20  , seenNot).     
2b110 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2b120 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
2b130 20 20 20 20 72 65 74 75 72 6e 20 65 78 70 72 49      return exprI
2b140 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70 50  mpliesNotNull(pP
2b150 61 72 73 65 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  arse, p->pLeft, 
2b160 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65 6e 4e  pNN, iTab, seenN
2b170 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  ot);.    }.    c
2b180 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63  ase TK_EQ:.    c
2b190 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
2b1a0 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
2b1b0 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
2b1c0 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
2b1d0 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
2b1e0 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
2b1f0 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
2b200 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
2b210 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
2b220 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  M:.    case TK_B
2b230 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  ITAND:.    case 
2b240 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61  TK_BITOR:.    ca
2b250 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20  se TK_SLASH:.   
2b260 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
2b270 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
2b280 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54  IFT: .    case T
2b290 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20  K_CONCAT: {.    
2b2a0 20 20 69 66 28 20 65 78 70 72 49 6d 70 6c 69 65    if( exprImplie
2b2b0 73 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c  sNotNull(pParse,
2b2c0 20 70 2d 3e 70 52 69 67 68 74 2c 20 70 4e 4e 2c   p->pRight, pNN,
2b2d0 20 69 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29 20   iTab, seenNot) 
2b2e0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
2b2f0 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69    /* Fall thru i
2b300 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73  nto the next cas
2b310 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
2b320 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20  ase TK_SPAN:.   
2b330 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45   case TK_COLLATE
2b340 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
2b350 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
2b360 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  K_UPLUS:.    cas
2b370 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
2b380 20 20 20 20 20 72 65 74 75 72 6e 20 65 78 70 72       return expr
2b390 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70  ImpliesNotNull(p
2b3a0 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65 66 74 2c  Parse, p->pLeft,
2b3b0 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65 6e   pNN, iTab, seen
2b3c0 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Not);.    }.    
2b3d0 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b  case TK_TRUTH: {
2b3e0 0a 20 20 20 20 20 20 69 66 28 20 73 65 65 6e 4e  .      if( seenN
2b3f0 6f 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ot ) return 0;. 
2b400 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 32 21       if( p->op2!
2b410 3d 54 4b 5f 49 53 20 29 20 72 65 74 75 72 6e 20  =TK_IS ) return 
2b420 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
2b430 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75  exprImpliesNotNu
2b440 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  ll(pParse, p->pL
2b450 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20  eft, pNN, iTab, 
2b460 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a  seenNot);.    }.
2b470 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
2b480 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
2b490 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75  exprImpliesNotNu
2b4a0 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  ll(pParse, p->pL
2b4b0 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20  eft, pNN, iTab, 
2b4c0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
2b4d0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2b4e0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
2b4f0 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74  f we can prove t
2b500 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61  he pE2 will alwa
2b510 79 73 20 62 65 20 74 72 75 65 20 69 66 20 70 45  ys be true if pE
2b520 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52  1 is.** true.  R
2b530 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77  eturn false if w
2b540 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74  e cannot complet
2b550 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69  e the proof or i
2b560 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62  f pE2 might.** b
2b570 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c  e false.  Exampl
2b580 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45  es:.**.**     pE
2b590 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45  1: x==5       pE
2b5a0 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20  2: x==5         
2b5b0 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
2b5c0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30  .**     pE1: x>0
2b5d0 20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d          pE2: x==
2b5e0 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65  5             Re
2b5f0 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20  sult: false.**  
2b600 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20     pE1: x=21    
2b610 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20     pE2: x=21 OR 
2b620 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a  y=43     Result:
2b630 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
2b640 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70 45 32  : x!=123     pE2
2b650 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
2b660 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
2b670 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f  **     pE1: x!=?
2b680 31 20 20 20 20 20 20 70 45 32 3a 20 78 20 49 53  1      pE2: x IS
2b690 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73   NOT NULL    Res
2b6a0 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
2b6b0 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20   pE1: x IS NULL 
2b6c0 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
2b6d0 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66  ULL    Result: f
2b6e0 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  alse.**     pE1:
2b6f0 20 78 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a   x IS ?2    pE2:
2b700 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
2b710 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a    Reuslt: false.
2b720 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61  **.** When compa
2b730 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  ring TK_COLUMN n
2b740 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70 45 31  odes between pE1
2b750 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32   and pE2, if pE2
2b760 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61   has.** Expr.iTa
2b770 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d  ble<0 then assum
2b780 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72  e a table number
2b790 20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a   given by iTab..
2b7a0 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20  **.** If pParse 
2b7b0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
2b7c0 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  n the values of 
2b7d0 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20  bound variables 
2b7e0 69 6e 20 70 45 31 20 61 72 65 20 0a 2a 2a 20 63  in pE1 are .** c
2b7f0 6f 6d 70 61 72 65 64 20 61 67 61 69 6e 73 74 20  ompared against 
2b800 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73 20 69  literal values i
2b810 6e 20 70 45 32 20 61 6e 64 20 70 50 61 72 73 65  n pE2 and pParse
2b820 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b  ->pVdbe->expmask
2b830 20 69 73 0a 2a 2a 20 6d 6f 64 69 66 69 65 64 20   is.** modified 
2b840 74 6f 20 72 65 63 6f 72 64 20 77 68 69 63 68 20  to record which 
2b850 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20  bound variables 
2b860 61 72 65 20 72 65 66 65 72 65 6e 63 65 64 2e 20  are referenced. 
2b870 20 49 66 20 70 50 61 72 73 65 20 0a 2a 2a 20 69   If pParse .** i
2b880 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66 61 6c  s NULL, then fal
2b890 73 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  se will be retur
2b8a0 6e 65 64 20 69 66 20 70 45 31 20 63 6f 6e 74 61  ned if pE1 conta
2b8b0 69 6e 73 20 61 6e 79 20 62 6f 75 6e 64 20 76 61  ins any bound va
2b8c0 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57  riables..**.** W
2b8d0 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
2b8e0 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74  turn false.  Ret
2b8f0 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68  urning true migh
2b900 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d  t give a perform
2b910 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d  ance.** improvem
2b920 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  ent.  Returning 
2b930 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73  false might caus
2b940 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
2b950 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  reduction, but.*
2b960 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  * it will always
2b970 20 67 69 76 65 20 74 68 65 20 63 6f 72 72 65 63   give the correc
2b980 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20  t answer and is 
2b990 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66  hence always saf
2b9a0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2b9b0 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
2b9c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2b9d0 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20  Expr *pE1, Expr 
2b9e0 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b  *pE2, int iTab){
2b9f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
2ba00 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
2ba10 2c 20 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62  , pE1, pE2, iTab
2ba20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
2ba30 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
2ba40 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20  pE2->op==TK_OR. 
2ba50 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78 70    && (sqlite3Exp
2ba60 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 50 61  rImpliesExpr(pPa
2ba70 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70  rse, pE1, pE2->p
2ba80 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20  Left, iTab).    
2ba90 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
2baa0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
2bab0 70 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20  pr(pParse, pE1, 
2bac0 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  pE2->pRight, iTa
2bad0 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  b) ).  ){.    re
2bae0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
2baf0 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  ( pE2->op==TK_NO
2bb00 54 4e 55 4c 4c 0a 20 20 20 26 26 20 65 78 70 72  TNULL.   && expr
2bb10 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70  ImpliesNotNull(p
2bb20 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d  Parse, pE1, pE2-
2bb30 3e 70 4c 65 66 74 2c 20 69 54 61 62 2c 20 30 29  >pLeft, iTab, 0)
2bb40 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2bb50 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
2bb60 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
2bb70 73 20 69 73 20 74 68 65 20 45 78 70 72 20 6e 6f  s is the Expr no
2bb80 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  de callback for 
2bb90 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
2bba0 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 29 2e 0a  esNotNullRow()..
2bbb0 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
2bbc0 73 69 6f 6e 20 6e 6f 64 65 20 72 65 71 75 69 72  sion node requir
2bbd0 65 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  es that the tabl
2bbe0 65 20 61 74 20 70 57 61 6c 6b 65 72 2d 3e 69 43  e at pWalker->iC
2bbf0 75 72 0a 2a 2a 20 68 61 76 65 20 6f 6e 65 20 6f  ur.** have one o
2bc00 72 20 6d 6f 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20  r more non-NULL 
2bc10 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 73 65 74  column, then set
2bc20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
2bc30 74 6f 20 31 20 61 6e 64 20 61 62 6f 72 74 2e 0a  to 1 and abort..
2bc40 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2bc50 6e 65 20 63 6f 6e 74 72 6f 6c 73 20 61 6e 20 6f  ne controls an o
2bc60 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 46 61  ptimization.  Fa
2bc70 6c 73 65 20 70 6f 73 69 74 69 76 65 73 20 28 73  lse positives (s
2bc80 65 74 74 69 6e 67 0a 2a 2a 20 70 57 61 6c 6b 65  etting.** pWalke
2bc90 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 20 77 68  r->eCode to 1 wh
2bca0 65 6e 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  en it should not
2bcb0 20 62 65 29 20 61 72 65 20 64 65 61 64 6c 79 2c   be) are deadly,
2bcc0 20 62 75 74 20 66 61 6c 73 65 2d 6e 65 67 61 74   but false-negat
2bcd0 69 76 65 73 0a 2a 2a 20 28 6e 65 76 65 72 20 73  ives.** (never s
2bce0 65 74 74 69 6e 67 20 70 57 61 6c 6b 65 72 2d 3e  etting pWalker->
2bcf0 65 43 6f 64 65 29 20 69 73 20 61 20 68 61 72 6d  eCode) is a harm
2bd00 6c 65 73 73 20 6d 69 73 73 65 64 20 6f 70 74 69  less missed opti
2bd10 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  mization..*/.sta
2bd20 74 69 63 20 69 6e 74 20 69 6d 70 6c 69 65 73 4e  tic int impliesN
2bd30 6f 74 4e 75 6c 6c 52 6f 77 28 57 61 6c 6b 65 72  otNullRow(Walker
2bd40 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2bd50 2a 70 45 78 70 72 29 7b 0a 20 20 74 65 73 74 63  *pExpr){.  testc
2bd60 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2bd70 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
2bd80 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78  .  testcase( pEx
2bd90 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
2bda0 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66 28  UNCTION );.  if(
2bdb0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
2bdc0 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
2bdd0 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 57 52  oin) ) return WR
2bde0 43 5f 50 72 75 6e 65 3b 0a 20 20 73 77 69 74 63  C_Prune;.  switc
2bdf0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
2be00 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
2be10 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
2be20 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
2be30 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
2be40 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 0a 20 20 20   TK_NOTNULL:.   
2be50 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
2be60 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
2be70 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 0a 20   case TK_CASE:. 
2be80 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20     case TK_IN:. 
2be90 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
2bea0 49 4f 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63  ION:.      testc
2beb0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2bec0 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
2bed0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2bee0 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b  r->op==TK_NOT );
2bef0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2bf00 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2bf10 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
2bf20 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2bf30 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
2bf40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2bf50 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2bf60 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
2bf70 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2bf80 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20  =TK_OR );.      
2bf90 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2bfa0 3e 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 0a  >op==TK_CASE );.
2bfb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2bfc0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
2bfd0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2bfe0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2bff0 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  K_FUNCTION );.  
2c000 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2c010 72 75 6e 65 3b 0a 20 20 20 20 63 61 73 65 20 54  rune;.    case T
2c020 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  K_COLUMN:.      
2c030 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  if( pWalker->u.i
2c040 43 75 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  Cur==pExpr->iTab
2c050 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57  le ){.        pW
2c060 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31  alker->eCode = 1
2c070 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2c080 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
2c090 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
2c0a0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 0a 20 20 20   WRC_Prune;..   
2c0b0 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
2c0c0 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  es are allowed t
2c0d0 6f 20 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  o use constraint
2c0e0 73 20 6c 69 6b 65 20 78 3d 4e 55 4c 4c 2e 20 20  s like x=NULL.  
2c0f0 53 6f 0a 20 20 20 20 2a 2a 20 61 20 74 65 72 6d  So.    ** a term
2c100 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 79   of the form x=y
2c110 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 65 20   does not prove 
2c120 74 68 61 74 20 79 20 69 73 20 6e 6f 74 20 6e 75  that y is not nu
2c130 6c 6c 20 69 66 20 78 0a 20 20 20 20 2a 2a 20 69  ll if x.    ** i
2c140 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  s the column of 
2c150 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
2c160 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  */.    case TK_E
2c170 51 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  Q:.    case TK_N
2c180 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  E:.    case TK_L
2c190 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
2c1a0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
2c1b0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
2c1c0 45 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  E:.      testcas
2c1d0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2c1e0 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _EQ );.      tes
2c1f0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2c200 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20  ==TK_NE );.     
2c210 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2c220 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ->op==TK_LT );. 
2c230 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2c240 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
2c250 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2c260 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2c270 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
2c280 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2c290 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==TK_GE );.     
2c2a0 20 69 66 28 20 28 70 45 78 70 72 2d 3e 70 4c 65   if( (pExpr->pLe
2c2b0 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
2c2c0 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70  N && IsVirtual(p
2c2d0 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 79 2e 70  Expr->pLeft->y.p
2c2e0 54 61 62 29 29 0a 20 20 20 20 20 20 20 7c 7c 20  Tab)).       || 
2c2f0 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
2c300 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
2c310 20 49 73 56 69 72 74 75 61 6c 28 70 45 78 70 72   IsVirtual(pExpr
2c320 2d 3e 70 52 69 67 68 74 2d 3e 79 2e 70 54 61 62  ->pRight->y.pTab
2c330 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  )).      ){.    
2c340 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2c350 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  une;.      }.   
2c360 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
2c370 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2c380 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nue;.  }.}../*.*
2c390 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e  * Return true (n
2c3a0 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 65 78 70 72  on-zero) if expr
2c3b0 65 73 73 69 6f 6e 20 70 20 63 61 6e 20 6f 6e 6c  ession p can onl
2c3c0 79 20 62 65 20 74 72 75 65 20 69 66 20 61 74 20  y be true if at 
2c3d0 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 63 6f 6c  least.** one col
2c3e0 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 54 61  umn of table iTa
2c3f0 62 20 69 73 20 6e 6f 6e 2d 6e 75 6c 6c 2e 20 20  b is non-null.  
2c400 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2c410 72 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69  return true.** i
2c420 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 77  f expression p w
2c430 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 4e 55  ill always be NU
2c440 4c 4c 20 6f 72 20 66 61 6c 73 65 20 69 66 20 65  LL or false if e
2c450 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  very column of i
2c460 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a  Tab.** is NULL..
2c470 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 6e 65 67 61  **.** False nega
2c480 74 69 76 65 73 20 61 72 65 20 61 63 63 65 70 74  tives are accept
2c490 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  able.  In other 
2c4a0 77 6f 72 64 73 2c 20 69 74 20 69 73 20 6f 6b 20  words, it is ok 
2c4b0 74 6f 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72  to return.** zer
2c4c0 6f 20 65 76 65 6e 20 69 66 20 65 78 70 72 65 73  o even if expres
2c4d0 73 69 6f 6e 20 70 20 77 69 6c 6c 20 6e 65 76 65  sion p will neve
2c4e0 72 20 62 65 20 74 72 75 65 20 6f 66 20 65 76 65  r be true of eve
2c4f0 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54 61  ry column of iTa
2c500 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 20 20 41  b.** is NULL.  A
2c510 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20   false negative 
2c520 69 73 20 6d 65 72 65 6c 79 20 61 20 6d 69 73 73  is merely a miss
2c530 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ed optimization 
2c540 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2a 0a  opportunity..**.
2c550 2a 2a 20 46 61 6c 73 65 20 70 6f 73 69 74 69 76  ** False positiv
2c560 65 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  es are not allow
2c570 65 64 2c 20 68 6f 77 65 76 65 72 2e 20 20 41 20  ed, however.  A 
2c580 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 20 6d  false positive m
2c590 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ay result.** in 
2c5a0 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  an incorrect ans
2c5b0 77 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  wer..**.** Terms
2c5c0 20 6f 66 20 70 20 74 68 61 74 20 61 72 65 20 6d   of p that are m
2c5d0 61 72 6b 65 64 20 77 69 74 68 20 45 50 5f 46 72  arked with EP_Fr
2c5e0 6f 6d 4a 6f 69 6e 20 28 61 6e 64 20 68 65 6e 63  omJoin (and henc
2c5f0 65 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d  e that come from
2c600 0a 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  .** the ON or US
2c610 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 4c  ING clauses of L
2c620 45 46 54 20 4a 4f 49 4e 53 29 20 61 72 65 20 65  EFT JOINS) are e
2c630 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 65  xcluded from the
2c640 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a 2a   analysis..**.**
2c650 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2c660 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69   used to check i
2c670 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  f a LEFT JOIN ca
2c680 6e 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  n be converted i
2c690 6e 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61  nto.** an ordina
2c6a0 72 79 20 4a 4f 49 4e 2e 20 20 54 68 65 20 70 20  ry JOIN.  The p 
2c6b0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
2c6c0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 49  WHERE clause.  I
2c6d0 66 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63  f the WHERE.** c
2c6e0 6c 61 75 73 65 20 72 65 71 75 69 72 65 73 20 74  lause requires t
2c6f0 68 61 74 20 73 6f 6d 65 20 63 6f 6c 75 6d 6e 20  hat some column 
2c700 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
2c710 6c 65 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a  le of the LEFT J
2c720 4f 49 4e 0a 2a 2a 20 62 65 20 6e 6f 6e 2d 4e 55  OIN.** be non-NU
2c730 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 4c 45 46  LL, then the LEF
2c740 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 73 61  T JOIN can be sa
2c750 66 65 6c 79 20 63 6f 6e 76 65 72 74 65 64 20 69  fely converted i
2c760 6e 74 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61  nto an.** ordina
2c770 72 79 20 6a 6f 69 6e 2e 0a 2a 2f 0a 69 6e 74 20  ry join..*/.int 
2c780 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
2c790 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 45 78 70  esNonNullRow(Exp
2c7a0 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 29 7b  r *p, int iTab){
2c7b0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 70  .  Walker w;.  p
2c7c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
2c7d0 69 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20 20  ipCollate(p);.  
2c7e0 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
2c7f0 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  if( p->op==TK_NO
2c800 54 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70  TNULL ){.      p
2c810 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
2c820 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70   }else if( p->op
2c830 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
2c840 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2c850 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52  rImpliesNonNullR
2c860 6f 77 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  ow(p->pLeft, iTa
2c870 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
2c880 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67       p = p->pRig
2c890 68 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ht;.    }else{. 
2c8a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2c8b0 7d 0a 20 20 7d 0a 20 20 77 2e 78 45 78 70 72 43  }.  }.  w.xExprC
2c8c0 61 6c 6c 62 61 63 6b 20 3d 20 69 6d 70 6c 69 65  allback = implie
2c8d0 73 4e 6f 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77  sNotNullRow;.  w
2c8e0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2c8f0 20 3d 20 30 3b 0a 20 20 77 2e 78 53 65 6c 65 63   = 0;.  w.xSelec
2c900 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a  tCallback2 = 0;.
2c910 20 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20    w.eCode = 0;. 
2c920 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 54 61 62   w.u.iCur = iTab
2c930 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
2c940 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65  xpr(&w, p);.  re
2c950 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a  turn w.eCode;.}.
2c960 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2c970 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2c980 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2c990 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
2c9a0 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64  e walker.** to d
2c9b0 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65  etermine if an e
2c9c0 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
2c9d0 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72 65   evaluated by re
2c9e0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a  ference to the.*
2c9f0 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69  * index only, wi
2ca00 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
2ca10 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20  do a search for 
2ca20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2ca30 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79  g.** table entry
2ca40 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e  .  The IdxCover.
2ca50 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74 68  pIdx field is th
2ca60 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76  e index.  IdxCov
2ca70 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68  er.iCur.** is th
2ca80 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  e cursor for the
2ca90 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63   table..*/.struc
2caa0 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49  t IdxCover {.  I
2cab0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
2cac0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
2cad0 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f  be tested for co
2cae0 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  verage */.  int 
2caf0 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  iCur;        /* 
2cb00 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
2cb10 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72  r the table corr
2cb20 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
2cb30 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   index */.};../*
2cb40 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
2cb50 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72 65   if there are re
2cb60 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
2cb70 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a  mns in table .**
2cb80 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
2cb90 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20  Cover->iCur can 
2cba0 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73 69  be satisfied usi
2cbb0 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  ng the index.** 
2cbc0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
2cbd0 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73  over->pIdx..*/.s
2cbe0 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 64  tatic int exprId
2cbf0 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70  xCover(Walker *p
2cc00 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2cc10 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
2cc20 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2cc30 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54  .   && pExpr->iT
2cc40 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  able==pWalker->u
2cc50 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72  .pIdxCover->iCur
2cc60 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f  .   && sqlite3Co
2cc70 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c  lumnOfIndex(pWal
2cc80 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
2cc90 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69  ->pIdx, pExpr->i
2cca0 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20  Column)<0.  ){. 
2ccb0 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
2ccc0 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  e = 1;.    retur
2ccd0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
2cce0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2ccf0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
2cd00 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   Determine if an
2cd10 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74   index pIdx on t
2cd20 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
2cd30 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77   iCur contains w
2cd40 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65  ill.** the expre
2cd50 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
2cd60 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
2cd70 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65   index does cove
2cd80 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  r the.** express
2cd90 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ion and false if
2cda0 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65   the pExpr expre
2cdb0 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73  ssion references
2cdc0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a   table columns.*
2cdd0 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66  * that are not f
2cde0 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65  ound in the inde
2cdf0 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e  x pIdx..**.** An
2ce00 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20   index covering 
2ce10 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65  an expression me
2ce20 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78 70  ans that the exp
2ce30 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a  ression can be.*
2ce40 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e  * evaluated usin
2ce50 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78  g only the index
2ce60 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76   and without hav
2ce70 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  ing to lookup th
2ce80 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
2ce90 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a  ng table entry..
2cea0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2ceb0 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78  prCoveredByIndex
2cec0 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  (.  Expr *pExpr,
2ced0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
2cee0 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65  ndex to be teste
2cef0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
2cf00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2cf10 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
2cf20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
2cf30 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20  nding table */. 
2cf40 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
2cf50 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2cf60 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  x that might be 
2cf70 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67  used for coverag
2cf80 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72  e */.){.  Walker
2cf90 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78   w;.  struct Idx
2cfa0 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65  Cover xcov;.  me
2cfb0 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
2cfc0 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69  of(w));.  xcov.i
2cfd0 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63  Cur = iCur;.  xc
2cfe0 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a  ov.pIdx = pIdx;.
2cff0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2d000 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72  k = exprIdxCover
2d010 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65  ;.  w.u.pIdxCove
2d020 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c  r = &xcov;.  sql
2d030 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
2d040 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72   pExpr);.  retur
2d050 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a  n !w.eCode;.}...
2d060 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
2d070 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2d080 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
2d090 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65  used by the tree
2d0a0 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f   walker.** to co
2d0b0 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  unt references t
2d0c0 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  o table columns 
2d0d0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  in the arguments
2d0e0 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65   of an .** aggre
2d0f0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69  gate function, i
2d100 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65  n order to imple
2d110 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ment the.** sqli
2d120 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53  te3FunctionThisS
2d130 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  rc() routine..*/
2d140 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74  .struct SrcCount
2d150 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53   {.  SrcList *pS
2d160 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72  rc;   /* One par
2d170 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61  ticular FROM cla
2d180 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20  use in a nested 
2d190 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  query */.  int n
2d1a0 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  This;       /* N
2d1b0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
2d1c0 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
2d1d0 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  n pSrcList */.  
2d1e0 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20  int nOther;     
2d1f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2d200 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
2d210 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f  mns in other FRO
2d220 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a  M clauses */.};.
2d230 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
2d240 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
2d250 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2d260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d270 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c  exprSrcCount(Wal
2d280 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
2d290 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a  pr *pExpr){.  /*
2d2a0 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20   The NEVER() on 
2d2b0 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20  the second term 
2d2c0 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74  is because sqlit
2d2d0 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
2d2e0 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20  isSrc().  ** is 
2d2f0 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65  always called be
2d300 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72  fore sqlite3Expr
2d310 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2d320 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20  s() and so the. 
2d330 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68   ** TK_COLUMNs h
2d340 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
2d350 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
2d360 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20  TK_AGG_COLUMN.  
2d370 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  If.  ** sqlite3F
2d380 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
2d390 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66  rc() is used dif
2d3a0 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  ferently in the 
2d3b0 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a  future, the.  **
2d3c0 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65   NEVER() will ne
2d3d0 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64  ed to be removed
2d3e0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  . */.  if( pExpr
2d3f0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2d400 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e  || NEVER(pExpr->
2d410 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
2d420 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  N) ){.    int i;
2d430 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43  .    struct SrcC
2d440 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65  ount *p = pWalke
2d450 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a  r->u.pSrcCount;.
2d460 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
2d470 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  c = p->pSrc;.   
2d480 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63   int nSrc = pSrc
2d490 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20   ? pSrc->nSrc : 
2d4a0 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
2d4b0 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSrc; i++){.  
2d4c0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
2d4d0 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69  Table==pSrc->a[i
2d4e0 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ].iCursor ) brea
2d4f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
2d500 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20   i<nSrc ){.     
2d510 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20   p->nThis++;.   
2d520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
2d530 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d  >nOther++;.    }
2d540 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2d550 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2d560 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
2d570 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67  f any of the arg
2d580 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45  uments to the pE
2d590 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66  xpr Function ref
2d5a0 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69  erence.** pSrcLi
2d5b0 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  st.  Return true
2d5c0 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c   if they do.  Al
2d5d0 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  so return true i
2d5e0 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  f the function.*
2d5f0 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e  * has no argumen
2d600 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63  ts or has only c
2d610 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
2d620 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  s.  Return false
2d630 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66   if pExpr.** ref
2d640 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20  erences columns 
2d650 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20  but not columns 
2d660 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20  of tables found 
2d670 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  in pSrcList..*/.
2d680 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74  int sqlite3Funct
2d690 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45  ionUsesThisSrc(E
2d6a0 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c  xpr *pExpr, SrcL
2d6b0 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a  ist *pSrcList){.
2d6c0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74    Walker w;.  st
2d6d0 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e  ruct SrcCount cn
2d6e0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  t;.  assert( pEx
2d6f0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
2d700 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77 2e 78  UNCTION );.  w.x
2d710 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
2d720 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77  xprSrcCount;.  w
2d730 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2d740 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 72 63   = 0;.  w.u.pSrc
2d750 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20  Count = &cnt;.  
2d760 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c  cnt.pSrc = pSrcL
2d770 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73  ist;.  cnt.nThis
2d780 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68   = 0;.  cnt.nOth
2d790 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  er = 0;.  sqlite
2d7a0 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77  3WalkExprList(&w
2d7b0 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
2d7c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e  );.  return cnt.
2d7d0 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e  nThis>0 || cnt.n
2d7e0 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Other==0;.}../*.
2d7f0 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
2d800 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
2d810 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72  Info->aCol[] arr
2d820 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
2d830 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
2d840 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
2d850 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
2d860 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
2d870 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2d880 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
2d890 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a  Column(sqlite3 *
2d8a0 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
2d8b0 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
2d8c0 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71  pInfo->aCol = sq
2d8d0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
2d8e0 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20  te(.       db,. 
2d8f0 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
2d900 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  l,.       sizeof
2d910 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29  (pInfo->aCol[0])
2d920 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
2d930 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >nColumn,.      
2d940 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
2d950 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
2d960 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
2d970 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
2d980 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72  nfo->aFunc[] arr
2d990 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
2d9a0 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
2d9b0 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
2d9c0 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
2d9d0 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
2d9e0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2d9f0 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
2da00 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62  Func(sqlite3 *db
2da10 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
2da20 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
2da30 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c  nfo->aFunc = sql
2da40 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
2da50 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20  e(.       db, . 
2da60 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75        pInfo->aFu
2da70 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  nc,.       sizeo
2da80 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  f(pInfo->aFunc[0
2da90 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  ]),.       &pInf
2daa0 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->nFunc,.      
2dab0 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
2dac0 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
2dad0 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45  * This is the xE
2dae0 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  xprCallback for 
2daf0 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20  a tree walker.  
2db00 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a  It is used to.**
2db10 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74   implement sqlit
2db20 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2db30 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
2db40 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2db50 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
2db60 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
2db70 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
2db80 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
2db90 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65  eAggregate(Walke
2dba0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2dbb0 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
2dbc0 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
2dbd0 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d   *pNC = pWalker-
2dbe0 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20  >u.pNC;.  Parse 
2dbf0 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
2dc00 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74  Parse;.  SrcList
2dc10 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
2dc20 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67  ->pSrcList;.  Ag
2dc30 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
2dc40 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 41 67 67 49  = pNC->uNC.pAggI
2dc50 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  nfo;..  assert( 
2dc60 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e  pNC->ncFlags & N
2dc70 43 5f 55 41 67 67 49 6e 66 6f 20 29 3b 0a 20 20  C_UAggInfo );.  
2dc80 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
2dc90 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
2dca0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
2dcb0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
2dcc0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
2dcd0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2dce0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
2dcf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2dd00 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
2dd10 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  UMN );.      /* 
2dd20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2dd30 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
2dd40 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
2dd50 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
2dd60 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
2dd70 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
2dd80 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
2dd90 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69  f( ALWAYS(pSrcLi
2dda0 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  st!=0) ){.      
2ddb0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2ddc0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
2ddd0 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  SrcList->a;.    
2dde0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2ddf0 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
2de00 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2de10 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2de20 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
2de30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2de40 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2de50 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
2de60 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2de70 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
2de80 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
2de90 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
2dea0 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
2deb0 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
2dec0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
2ded0 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70   means that pExp
2dee0 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  r refers to a ta
2def0 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
2df00 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  ** that is in th
2df10 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2df20 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
2df30 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20  uery.  .        
2df40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
2df50 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e     ** Make an en
2df60 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  try for the colu
2df70 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  mn in pAggInfo->
2df80 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a  aCol[] if there.
2df90 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
2dfa0 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74  s not an entry t
2dfb0 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
2dfc0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2dfd0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
2dfe0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2dff0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f   = pAggInfo->aCo
2e000 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  l;.            f
2e010 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e  or(k=0; k<pAggIn
2e020 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b  fo->nColumn; k++
2e030 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
2e040 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
2e050 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  l->iTable==pExpr
2e060 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2e080 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  ol->iColumn==pEx
2e090 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
2e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2e0b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2e0c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e0d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2e0e0 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f  if( (k>=pAggInfo
2e0f0 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20  ->nColumn).     
2e100 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20          && (k = 
2e110 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
2e120 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
2e130 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20  gInfo))>=0 .    
2e140 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2e150 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
2e160 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
2e170 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k];.            
2e180 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70    pCol->pTab = p
2e190 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20  Expr->y.pTab;.  
2e1a0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2e1b0 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72  ->iTable = pExpr
2e1c0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
2e1d0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
2e1e0 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
2e1f0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
2e200 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d        pCol->iMem
2e210 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2e220 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
2e230 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2e240 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
2e250 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
2e260 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
2e270 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e280 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
2e290 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
2e2a0 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a        int j, n;.
2e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2c0 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20  ExprList *pGB = 
2e2d0 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
2e2e0 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  By;.            
2e2f0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
2e300 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20  ist_item *pTerm 
2e310 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20  = pGB->a;.      
2e320 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47            n = pG
2e330 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  B->nExpr;.      
2e340 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
2e350 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65  0; j<n; j++, pTe
2e360 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
2e370 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
2e380 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
2e390 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e3a0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
2e3b0 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d  TK_COLUMN && pE-
2e3c0 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
2e3d0 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
2e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3f0 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  pE->iColumn==pEx
2e400 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
2e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e420 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
2e430 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
2e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e450 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2e460 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e470 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e480 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e490 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2e4a0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
2e4b0 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
2e4c0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
2e4d0 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41  orterColumn = pA
2e4e0 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67  ggInfo->nSorting
2e4f0 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20  Column++;.      
2e500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e520 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
2e530 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  now an entry for
2e540 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e   pExpr in pAggIn
2e550 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68  fo->aCol[] (eith
2e560 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  er.            *
2e570 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73  * because it was
2e580 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72   there before or
2e590 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
2e5a0 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20   created it)..  
2e5b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e            ** Con
2e5c0 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74  vert the pExpr t
2e5d0 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f  o be a TK_AGG_CO
2e5e0 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74  LUMN referring t
2e5f0 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  o that.         
2e600 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e     ** pAggInfo->
2e610 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20  aCol[] entry..  
2e620 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2e630 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
2e640 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
2e650 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
2e660 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
2e670 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
2e680 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
2e690 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
2e6a0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a   TK_AGG_COLUMN;.
2e6b0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2e6c0 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b  r->iAgg = (i16)k
2e6d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
2e6e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2e6f0 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d   /* endif pExpr-
2e700 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
2e710 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20  iCursor */.     
2e720 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70     } /* end loop
2e730 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a   over pSrcList *
2e740 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
2e750 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2e760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2e770 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
2e780 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  : {.      if( (p
2e790 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
2e7a0 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20  _InAggFunc)==0. 
2e7b0 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72        && pWalker
2e7c0 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70  ->walkerDepth==p
2e7d0 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20  Expr->op2.      
2e7e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ){.        /* Ch
2e7f0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45  eck to see if pE
2e800 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61  xpr is a duplica
2e810 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67  te of another ag
2e820 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20  gregate .       
2e830 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   ** function tha
2e840 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
2e850 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72  the pAggInfo str
2e860 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a  ucture.        *
2e870 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  /.        struct
2e880 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2e890 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Item = pAggInfo-
2e8a0 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  >aFunc;.        
2e8b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
2e8c0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
2e8d0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2e8e0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2e8f0 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70  ExprCompare(0, p
2e900 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78  Item->pExpr, pEx
2e910 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  pr, -1)==0 ){.  
2e920 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2e930 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2e950 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  f( i>=pAggInfo->
2e960 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  nFunc ){.       
2e970 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f     /* pExpr is o
2e980 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61  riginal.  Make a
2e990 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41   new entry in pA
2e9a0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a  ggInfo->aFunc[].
2e9b0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2e9c0 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20         u8 enc = 
2e9d0 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
2e9e0 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61  .          i = a
2e9f0 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50  ddAggInfoFunc(pP
2ea00 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
2ea10 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fo);.          i
2ea20 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( i>=0 ){.     
2ea30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2ea40 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2ea50 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2ea60 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
2ea70 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67      pItem = &pAg
2ea80 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b  gInfo->aFunc[i];
2ea90 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
2eaa0 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
2eab0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
2eac0 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  Item->iMem = ++p
2ead0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2eae0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2eaf0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2eb00 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
2eb10 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
2eb20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e       pItem->pFun
2eb30 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
2eb40 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
2eb50 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
2eb60 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e         pExpr->u.
2eb70 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20  zToken, .       
2eb80 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2eb90 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78  r->x.pList ? pEx
2eba0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
2ebb0 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
2ebc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2ebd0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
2ebe0 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  EP_Distinct ){. 
2ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
2ec00 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
2ec10 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
2ec20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
2ec30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
2ec40 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
2ec50 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  t = -1;.        
2ec60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ec70 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2ec80 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70      /* Make pExp
2ec90 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61  r point to the a
2eca0 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49  ppropriate pAggI
2ecb0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74  nfo->aFunc[] ent
2ecc0 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ry.        */.  
2ecd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2ece0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2ecf0 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
2ed00 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
2ed10 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65  ;.        ExprSe
2ed20 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
2ed30 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
2ed40 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
2ed50 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a  >iAgg = (i16)i;.
2ed60 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
2ed70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
2ed80 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  fo;.        retu
2ed90 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2eda0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2edb0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
2edc0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
2edd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2ede0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2edf0 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  .}.static int an
2ee00 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
2ee10 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a  nSelect(Walker *
2ee20 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
2ee30 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55  *pSelect){.  UNU
2ee40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53  SED_PARAMETER(pS
2ee50 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65  elect);.  pWalke
2ee60 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b  r->walkerDepth++
2ee70 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
2ee80 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
2ee90 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67  c void analyzeAg
2eea0 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
2eeb0 45 6e 64 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  End(Walker *pWal
2eec0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
2eed0 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  lect){.  UNUSED_
2eee0 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63  PARAMETER(pSelec
2eef0 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77  t);.  pWalker->w
2ef00 61 6c 6b 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a  alkerDepth--;.}.
2ef10 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
2ef20 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73  he pExpr express
2ef30 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ion looking for 
2ef40 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
2ef50 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76  ons and.** for v
2ef60 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65  ariables that ne
2ef70 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ed to be added t
2ef80 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74  o AggInfo object
2ef90 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49   that pNC->pAggI
2efa0 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  nfo.** points to
2efb0 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e  .  Additional en
2efc0 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f  tries are made o
2efd0 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62  n the AggInfo ob
2efe0 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73  ject as.** neces
2eff0 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sary..**.** This
2f000 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
2f010 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
2f020 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73  fter the express
2f030 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ion has been.** 
2f040 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69  analyzed by sqli
2f050 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
2f060 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  mes()..*/.void s
2f070 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2f080 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65  eAggregates(Name
2f090 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
2f0a0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61  pr *pExpr){.  Wa
2f0b0 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70  lker w;.  w.xExp
2f0c0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  rCallback = anal
2f0d0 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20  yzeAggregate;.  
2f0e0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2f0f0 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
2f100 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20  gatesInSelect;. 
2f110 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2f120 63 6b 32 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67  ck2 = analyzeAgg
2f130 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45  regatesInSelectE
2f140 6e 64 3b 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65  nd;.  w.walkerDe
2f150 70 74 68 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70  pth = 0;.  w.u.p
2f160 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 77 2e 70 50  NC = pNC;.  w.pP
2f170 61 72 73 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  arse = 0;.  asse
2f180 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  rt( pNC->pSrcLis
2f190 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  t!=0 );.  sqlite
2f1a0 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45  3WalkExpr(&w, pE
2f1b0 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  xpr);.}../*.** C
2f1c0 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41  all sqlite3ExprA
2f1d0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2f1e0 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
2f1f0 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a  ression in an.**
2f200 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
2f210 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
2f220 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
2f230 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
2f240 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20  r is found, the 
2f250 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20  analysis is cut 
2f260 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  short..*/.void s
2f270 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2f280 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e  eAggList(NameCon
2f290 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c  text *pNC, ExprL
2f2a0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73  ist *pList){.  s
2f2b0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2f2c0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
2f2d0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
2f2e0 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
2f2f0 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
2f300 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
2f310 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
2f320 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2f330 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2f340 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70  es(pNC, pItem->p
2f350 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
2f360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2f370 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  te a single new 
2f380 72 65 67 69 73 74 65 72 20 66 6f 72 20 75 73 65  register for use
2f390 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e   to hold some in
2f3a0 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
2f3b0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2f3c0 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73  3GetTempReg(Pars
2f3d0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66  e *pParse){.  if
2f3e0 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
2f3f0 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  eg==0 ){.    ret
2f400 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  urn ++pParse->nM
2f410 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  em;.  }.  return
2f420 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
2f430 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d  g[--pParse->nTem
2f440 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pReg];.}../*.** 
2f450 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67  Deallocate a reg
2f460 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76  ister, making av
2f470 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73  ailable for reus
2f480 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
2f490 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2f 0a  .** purpose..*/.
2f4a0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
2f4b0 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65  aseTempReg(Parse
2f4c0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
2f4d0 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20  eg){.  if( iReg 
2f4e0 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  && pParse->nTemp
2f4f0 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
2f500 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
2f510 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61  ){.    pParse->a
2f520 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
2f530 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52  nTempReg++] = iR
2f540 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
2f550 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61   Allocate or dea
2f560 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20  llocate a block 
2f570 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74  of nReg consecut
2f580 69 76 65 20 72 65 67 69 73 74 65 72 73 2e 0a 2a  ive registers..*
2f590 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
2f5a0 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
2f5b0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65  *pParse, int nRe
2f5c0 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  g){.  int i, n;.
2f5d0 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 20    if( nReg==1 ) 
2f5e0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47 65  return sqlite3Ge
2f5f0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
2f600 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  i = pParse->
2f610 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d  iRangeReg;.  n =
2f620 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2f630 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d  eg;.  if( nReg<=
2f640 6e 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  n ){.    pParse-
2f650 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52  >iRangeReg += nR
2f660 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
2f670 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65  nRangeReg -= nRe
2f680 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
2f690 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  i = pParse->nMem
2f6a0 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
2f6b0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  nMem += nReg;.  
2f6c0 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
2f6d0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
2f6e0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72  aseTempRange(Par
2f6f0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
2f700 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b  iReg, int nReg){
2f710 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29  .  if( nReg==1 )
2f720 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  {.    sqlite3Rel
2f730 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
2f740 73 65 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 72  se, iReg);.    r
2f750 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
2f760 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52   nReg>pParse->nR
2f770 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70  angeReg ){.    p
2f780 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2f790 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61   = nReg;.    pPa
2f7a0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d  rse->iRangeReg =
2f7b0 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
2f7c0 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d  .** Mark all tem
2f7d0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
2f7e0 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69   as being unavai
2f7f0 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e  lable for reuse.
2f800 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2f810 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
2f820 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
2f830 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  {.  pParse->nTem
2f840 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  pReg = 0;.  pPar
2f850 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
2f860 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69  0;.}../*.** Vali
2f870 64 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d  date that no tem
2f880 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
2f890 66 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65  falls within the
2f8a0 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69   range of.** iFi
2f8b0 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c  rst..iLast, incl
2f8c0 75 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75  usive.  This rou
2f8d0 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
2f8e0 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73  l from within as
2f8f0 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d  sert().** statem
2f900 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ents..*/.#ifdef 
2f910 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74  SQLITE_DEBUG.int
2f920 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49   sqlite3NoTempsI
2f930 6e 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  nRange(Parse *pP
2f940 61 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74  arse, int iFirst
2f950 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20  , int iLast){.  
2f960 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61  int i;.  if( pPa
2f970 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30  rse->nRangeReg>0
2f980 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
2f990 52 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d  RangeReg+pParse-
2f9a0 3e 6e 52 61 6e 67 65 52 65 67 20 3e 20 69 46 69  >nRangeReg > iFi
2f9b0 72 73 74 0a 20 20 20 26 26 20 70 50 61 72 73 65  rst.   && pParse
2f9c0 2d 3e 69 52 61 6e 67 65 52 65 67 20 3c 3d 20 69  ->iRangeReg <= i
2f9d0 4c 61 73 74 0a 20 20 29 7b 0a 20 20 20 20 20 72  Last.  ){.     r
2f9e0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66  eturn 0;.  }.  f
2f9f0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
2fa00 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29  ->nTempReg; i++)
2fa10 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
2fa20 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69  ->aTempReg[i]>=i
2fa30 46 69 72 73 74 20 26 26 20 70 50 61 72 73 65 2d  First && pParse-
2fa40 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c  >aTempReg[i]<=iL
2fa50 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ast ){.      ret
2fa60 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
2fa70 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
2fa80 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2fa90 44 45 42 55 47 20 2a 2f 0a                       DEBUG */.