/ Hex Artifact Content
Login

Artifact f1d87bc9f2d0f14df97b768d5a3d4e4e606fbe45372bc9a0cb6a2623d1933e6d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72   op;.  if( pExpr
0600: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e  ->flags & EP_Gen
0610: 65 72 69 63 20 29 20 72 65 74 75 72 6e 20 30 3b  eric ) return 0;
0620: 0a 20 20 77 68 69 6c 65 28 20 45 78 70 72 48 61  .  while( ExprHa
0630: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0640: 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20 20   EP_Skip) ){.   
0650: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0660: 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
0670: 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 45  ;.    pExpr = pE
0680: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
0690: 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30  assert( pExpr!=0
06a0: 20 29 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70   );.  }.  op = p
06b0: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
06c0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
06d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
06e0: 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49 73  pr->flags&EP_xIs
06f0: 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72 65  Select );.    re
0700: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
0710: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
0720: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
0730: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
0740: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
0750: 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
0760: 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23 69 66   pExpr->op2;.#if
0770: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0780: 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d  _CAST.  if( op==
0790: 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61  TK_CAST ){.    a
07a0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
07b0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
07c0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
07d0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
07e0: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45  3AffinityType(pE
07f0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
0800: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
0810: 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f  if( (op==TK_AGG_
0820: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
0830: 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45 78 70  _COLUMN) && pExp
0840: 72 2d 3e 79 2e 70 54 61 62 20 29 7b 0a 20 20 20  r->y.pTab ){.   
0850: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0860: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0870: 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54 61 62  ty(pExpr->y.pTab
0880: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
0890: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d  );.  }.  if( op=
08a0: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
08b0: 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  N ){.    assert(
08c0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66   pExpr->pLeft->f
08d0: 6c 61 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63  lags&EP_xIsSelec
08e0: 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t );.    return 
08f0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
0900: 69 74 79 28 0a 20 20 20 20 20 20 20 20 70 45 78  ity(.        pEx
0910: 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65  pr->pLeft->x.pSe
0920: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
0930: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
0940: 70 45 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d  pExpr.    );.  }
0950: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d  .  return pExpr-
0960: 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a  >affinity;.}../*
0970: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
0980: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
0990: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  or expression pE
09a0: 78 70 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f  xpr to be the co
09b0: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
09c0: 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f  nce named by pTo
09d0: 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20  ken.   Return a 
09e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77  pointer to a new
09f0: 20 45 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a   Expr node that.
0a00: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
0a10: 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  e COLLATE operat
0a20: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  or..**.** If a m
0a30: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
0a40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
0a50: 68 61 74 20 66 61 63 74 20 69 73 20 72 65 63 6f  hat fact is reco
0a60: 72 64 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e  rded in pParse->
0a70: 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45  db.** and the pE
0a80: 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  xpr parameter is
0a90: 20 72 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e   returned unchan
0aa0: 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ged..*/.Expr *sq
0ab0: 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
0ac0: 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73  ateToken(.  Pars
0ad0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
0ae0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
0af0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
0b00: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
0b10: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
0b20: 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73   "COLLATE" claus
0b30: 65 20 74 6f 20 74 68 69 73 20 65 78 70 72 65 73  e to this expres
0b40: 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  sion */.  const 
0b50: 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65  Token *pCollName
0b60: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f  ,  /* Name of co
0b70: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0b80: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
0b90: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e              /
0ba0: 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74  * True to dequot
0bb0: 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29  e pCollName */.)
0bc0: 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d  {.  if( pCollNam
0bd0: 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78  e->n>0 ){.    Ex
0be0: 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
0bf0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72  e3ExprAlloc(pPar
0c00: 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41  se->db, TK_COLLA
0c10: 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64  TE, pCollName, d
0c20: 65 71 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28  equote);.    if(
0c30: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70   pNew ){.      p
0c40: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78  New->pLeft = pEx
0c50: 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pr;.      pNew->
0c60: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c  flags |= EP_Coll
0c70: 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20  ate|EP_Skip;.   
0c80: 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b     pExpr = pNew;
0c90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0ca0: 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70  urn pExpr;.}.Exp
0cb0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64  r *sqlite3ExprAd
0cc0: 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50  dCollateString(P
0cd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
0ce0: 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74  pr *pExpr, const
0cf0: 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f   char *zC){.  To
0d00: 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28  ken s;.  assert(
0d10: 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69   zC!=0 );.  sqli
0d20: 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c  te3TokenInit(&s,
0d30: 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72   (char*)zC);.  r
0d40: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0d50: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
0d60: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
0d70: 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &s, 0);.}../*.**
0d80: 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54   Skip over any T
0d90: 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  K_COLLATE operat
0da0: 6f 72 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69  ors and any unli
0db0: 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b  kely().** or lik
0dc0: 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69  elihood() functi
0dd0: 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f  on at the root o
0de0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  f an expression.
0df0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
0e00: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
0e10: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
0e20: 20 77 68 69 6c 65 28 20 70 45 78 70 72 20 26 26   while( pExpr &&
0e30: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
0e40: 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 7c  (pExpr, EP_Skip|
0e50: 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a  EP_Unlikely) ){.
0e60: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
0e70: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
0e80: 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20  P_Unlikely) ){. 
0e90: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
0ea0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0eb0: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
0ec0: 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  t) );.      asse
0ed0: 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  rt( pExpr->x.pLi
0ee0: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
0ef0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
0f00: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pr->op==TK_FUNCT
0f10: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ION );.      pEx
0f20: 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  pr = pExpr->x.pL
0f30: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
0f40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
0f50: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0f60: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
0f70: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  );.      pExpr =
0f80: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
0f90: 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65     }.  }   .  re
0fa0: 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f  turn pExpr;.}../
0fb0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0fc0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
0fd0: 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ce for the expre
0fe0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a  ssion pExpr. If.
0ff0: 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  ** there is no d
1000: 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  efined collating
1010: 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72   sequence, retur
1020: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  n NULL..**.** Se
1030: 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 45  e also: sqlite3E
1040: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29 0a 2a  xprNNCollSeq().*
1050: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
1060: 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29 20  ExprNNCollSeq() 
1070: 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 65  works the same e
1080: 78 61 63 74 20 74 68 61 74 20 69 74 20 72 65 74  xact that it ret
1090: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65 66 61  urns the.** defa
10a0: 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 66  ult collation if
10b0: 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20 64 65   pExpr has no de
10c0: 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 2e  fined collation.
10d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
10e0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 69  ting sequence mi
10f0: 67 68 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65  ght be determine
1100: 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f  d by a COLLATE o
1110: 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20 62 79  perator.** or by
1120: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
1130: 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61   a column with a
1140: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
1150: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20  ng sequence..** 
1160: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
1170: 73 20 74 61 6b 65 20 66 69 72 73 74 20 70 72 65  s take first pre
1180: 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74 20 6f  cedence.  Left o
1190: 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a 2a 20  perands take.** 
11a0: 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20  precedence over 
11b0: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73 2e 0a  right operands..
11c0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
11d0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50  te3ExprCollSeq(P
11e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
11f0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71  pr *pExpr){.  sq
1200: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1210: 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c 53 65  se->db;.  CollSe
1220: 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
1230: 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70 72 3b  Expr *p = pExpr;
1240: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
1250: 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e 6f     int op = p->o
1260: 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  p;.    if( p->fl
1270: 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72 69 63  ags & EP_Generic
1280: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
1290: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
12a0: 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b  R ) op = p->op2;
12b0: 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b  .    if( (op==TK
12c0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f  _AGG_COLUMN || o
12d0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
12e0: 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a  op==TK_TRIGGER).
12f0: 20 20 20 20 20 26 26 20 70 2d 3e 79 2e 70 54 61       && p->y.pTa
1300: 62 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  b!=0.    ){.    
1310: 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49    /* op==TK_REGI
1320: 53 54 45 52 20 26 26 20 70 2d 3e 79 2e 70 54 61  STER && p->y.pTa
1330: 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65  b!=0 happens whe
1340: 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67  n pExpr was orig
1350: 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  inally.      ** 
1360: 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20  a TK_COLUMN but 
1370: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65  was previously e
1380: 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63  valuated and cac
1390: 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65  hed in a registe
13a0: 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  r */.      int j
13b0: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
13c0: 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b       if( j>=0 ){
13d0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
13e0: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e  har *zColl = p->
13f0: 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  y.pTab->aCol[j].
1400: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
1410: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
1420: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
1430: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
1440: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1450: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1460: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54   if( op==TK_CAST
1470: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   || op==TK_UPLUS
1480: 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d   ){.      p = p-
1490: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63 6f  >pLeft;.      co
14a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
14b0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c    if( op==TK_COL
14c0: 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 70 43  LATE ){.      pC
14d0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
14e0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
14f0: 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75  ENC(db), 0, p->u
1500: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1510: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1520: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
1530: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
1540: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
1550: 20 26 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66   && (p->pLeft->f
1560: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1570: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
1580: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
1590: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15a0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 78 74 20      Expr *pNext 
15b0: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
15c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70        /* The Exp
15d0: 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76  r.x union is nev
15e0: 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20 73  er used at the s
15f0: 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70 72  ame time as Expr
1600: 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  .pRight */.     
1610: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e     assert( p->x.
1620: 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pList==0 || p->p
1630: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
1640: 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20      /* p->flags 
1650: 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65  holds EP_Collate
1660: 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66   and p->pLeft->f
1670: 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20  lags does not.  
1680: 41 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  And.        ** p
1690: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e  ->x.pSelect cann
16a0: 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e  ot.  So if p->x.
16b0: 70 4c 65 66 74 20 65 78 69 73 74 73 2c 20 69 74  pLeft exists, it
16c0: 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 0a 20 20   must hold at.  
16d0: 20 20 20 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f        ** least o
16e0: 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54  ne EP_Collate. T
16f0: 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hus the followin
1700: 67 20 74 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f  g two ALWAYS. */
1710: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1720: 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 41 4c  x.pList!=0 && AL
1730: 57 41 59 53 28 21 45 78 70 72 48 61 73 50 72 6f  WAYS(!ExprHasPro
1740: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
1750: 65 6c 65 63 74 29 29 20 29 7b 0a 20 20 20 20 20  elect)) ){.     
1760: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1770: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 41        for(i=0; A
1780: 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69  LWAYS(i<p->x.pLi
1790: 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29  st->nExpr); i++)
17a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
17b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
17c0: 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  y(p->x.pList->a[
17d0: 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c  i].pExpr, EP_Col
17e0: 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  late) ){.       
17f0: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
1800: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1810: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
1820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1830: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1840: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1850: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
1860: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1870: 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61  else{.      brea
1880: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
1890: 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43  f( sqlite3CheckC
18a0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
18b0: 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43  Coll) ){ .    pC
18c0: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  oll = 0;.  }.  r
18d0: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
18e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1900: 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  nce for the expr
1910: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66  ession pExpr. If
1920: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20  .** there is no 
1930: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
1940: 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75  g sequence, retu
1950: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1960: 74 68 65 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63  the.** defautl c
1970: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1980: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
1990: 6f 3a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  o: sqlite3ExprCo
19a0: 6c 6c 53 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68  llSeq().**.** Th
19b0: 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  e sqlite3ExprCol
19c0: 6c 53 65 71 28 29 20 72 6f 75 74 69 6e 65 20 77  lSeq() routine w
19d0: 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 65 78  orks the same ex
19e0: 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
19f0: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
1a00: 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66 69  there is no defi
1a10: 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a  ned collation..*
1a20: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
1a30: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
1a40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1a50: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43  xpr *pExpr){.  C
1a60: 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 73 71 6c 69  ollSeq *p = sqli
1a70: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1a80: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
1a90: 20 69 66 28 20 70 3d 3d 30 20 29 20 70 20 3d 20   if( p==0 ) p = 
1aa0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
1ab0: 74 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  tColl;.  assert(
1ac0: 20 70 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p!=0 );.  retur
1ad0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
1ae0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1af0: 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
1b00: 20 68 61 76 65 20 65 71 75 69 76 61 6c 65 6e 74   have equivalent
1b10: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1b20: 6e 63 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nces..*/.int sql
1b30: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d  ite3ExprCollSeqM
1b40: 61 74 63 68 28 50 61 72 73 65 20 2a 70 50 61 72  atch(Parse *pPar
1b50: 73 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45  se, Expr *pE1, E
1b60: 78 70 72 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c  xpr *pE2){.  Col
1b70: 6c 53 65 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73  lSeq *pColl1 = s
1b80: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
1b90: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 31 29  Seq(pParse, pE1)
1ba0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
1bb0: 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ll2 = sqlite3Exp
1bc0: 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  rNNCollSeq(pPars
1bd0: 65 2c 20 70 45 32 29 3b 0a 20 20 72 65 74 75 72  e, pE2);.  retur
1be0: 6e 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  n sqlite3StrICmp
1bf0: 28 70 43 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20  (pColl1->zName, 
1c00: 70 43 6f 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d  pColl2->zName)==
1c10: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  0;.}../*.** pExp
1c20: 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20  r is an operand 
1c30: 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  of a comparison 
1c40: 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20  operator.  aff2 
1c50: 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61  is the.** type a
1c60: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f  ffinity of the o
1c70: 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54  ther operand.  T
1c80: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1c90: 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20  rns the.** type 
1ca0: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
1cb0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
1cc0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1cd0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61  operator..*/.cha
1ce0: 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  r sqlite3Compare
1cf0: 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70  Affinity(Expr *p
1d00: 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32 29  Expr, char aff2)
1d10: 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d 20  {.  char aff1 = 
1d20: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
1d30: 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ity(pExpr);.  if
1d40: 28 20 61 66 66 31 20 26 26 20 61 66 66 32 20 29  ( aff1 && aff2 )
1d50: 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69  {.    /* Both si
1d60: 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  des of the compa
1d70: 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e  rison are column
1d80: 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75  s. If one has nu
1d90: 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66  meric.    ** aff
1da0: 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e  inity, use that.
1db0: 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 6e   Otherwise use n
1dc0: 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  o affinity..    
1dd0: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
1de0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1df0: 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c  ity(aff1) || sql
1e00: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1e10: 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20  inity(aff2) ){. 
1e20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e30: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
1e40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
1e60: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20  FF_BLOB;.    }. 
1e70: 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66 31   }else if( !aff1
1e80: 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20   && !aff2 ){.   
1e90: 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65   /* Neither side
1ea0: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1eb0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
1ec0: 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20   Compare the.   
1ed0: 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65   ** results dire
1ee0: 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctly..    */.   
1ef0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
1f00: 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65  FF_BLOB;.  }else
1f10: 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64  {.    /* One sid
1f20: 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  e is a column, t
1f30: 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e  he other is not.
1f40: 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73   Use the columns
1f50: 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
1f60: 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d    assert( aff1==
1f70: 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a  0 || aff2==0 );.
1f80: 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31      return (aff1
1f90: 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a   + aff2);.  }.}.
1fa0: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
1fb0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1fc0: 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74  rator.  Return t
1fd0: 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  he type affinity
1fe0: 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
1ff0: 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f  be applied to bo
2000: 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f  th operands prio
2010: 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63  r to doing the c
2020: 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74  omparison..*/.st
2030: 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72  atic char compar
2040: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70  isonAffinity(Exp
2050: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61  r *pExpr){.  cha
2060: 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28  r aff;.  assert(
2070: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
2080: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
2090: 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IN || pExpr->
20a0: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20  op==TK_LT ||.   
20b0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
20c0: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72  ==TK_GT || pExpr
20d0: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70  ->op==TK_GE || p
20e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
20f0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
2100: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c  pr->op==TK_NE ||
2110: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2120: 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  S || pExpr->op==
2130: 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73  TK_ISNOT );.  as
2140: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
2150: 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71  ft );.  aff = sq
2160: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
2170: 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  y(pExpr->pLeft);
2180: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52  .  if( pExpr->pR
2190: 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20  ight ){.    aff 
21a0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
21b0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
21c0: 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20  pRight, aff);.  
21d0: 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61  }else if( ExprHa
21e0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
21f0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2200: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
2210: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
2220: 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  ty(pExpr->x.pSel
2230: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ect->pEList->a[0
2240: 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20  ].pExpr, aff);. 
2250: 20 7d 65 6c 73 65 20 69 66 28 20 61 66 66 3d 3d   }else if( aff==
2260: 30 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53  0 ){.    aff = S
2270: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
2280: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66    }.  return aff
2290: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
22a0: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
22b0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e   expression, eg.
22c0: 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e   '=', '<', IN(..
22d0: 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61  .) etc..** idx_a
22e0: 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61  ffinity is the a
22f0: 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e  ffinity of an in
2300: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65  dexed column. Re
2310: 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20  turn true.** if 
2320: 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61  the index with a
2330: 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69  ffinity idx_affi
2340: 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64  nity may be used
2350: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
2360: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
2370: 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74  in pExpr..*/.int
2380: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
2390: 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45  inityOk(Expr *pE
23a0: 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66  xpr, char idx_af
23b0: 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20  finity){.  char 
23c0: 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  aff = comparison
23d0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
23e0: 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29  .  switch( aff )
23f0: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
2400: 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20  E_AFF_BLOB:.    
2410: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2420: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
2430: 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75  TEXT:.      retu
2440: 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d  rn idx_affinity=
2450: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
2460: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
2470: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
2480: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
2490: 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74  nity(idx_affinit
24a0: 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  y);.  }.}../*.**
24b0: 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76   Return the P5 v
24c0: 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64  alue that should
24d0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62   be used for a b
24e0: 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e  inary comparison
24f0: 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45  .** opcode (OP_E
2500: 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75  q, OP_Ge etc.) u
2510: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70  sed to compare p
2520: 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32  Expr1 and pExpr2
2530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62  ..*/.static u8 b
2540: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45  inaryCompareP5(E
2550: 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70  xpr *pExpr1, Exp
2560: 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a  r *pExpr2, int j
2570: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38  umpIfNull){.  u8
2580: 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c   aff = (char)sql
2590: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
25a0: 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20  (pExpr2);.  aff 
25b0: 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d  = (u8)sqlite3Com
25c0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
25d0: 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29  pr1, aff) | (u8)
25e0: 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65  jumpIfNull;.  re
25f0: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
2600: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
2610: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61  ter to the colla
2620: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68  tion sequence th
2630: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
2640: 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79  d by.** a binary
2650: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
2660: 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70  ator comparing p
2670: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
2680: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65  .**.** If the le
2690: 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ft hand expressi
26a0: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
26b0: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65  ng sequence type
26c0: 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
26d0: 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  used. Otherwise 
26e0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
26f0: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
2700: 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73  ight hand expres
2710: 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c  sion.** is used,
2720: 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20   or the default 
2730: 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74  (BINARY) if neit
2740: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68  her expression h
2750: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  as a collating.*
2760: 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72  * type..**.** Ar
2770: 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62  gument pRight (b
2780: 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61  ut not pLeft) ma
2790: 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  y be a null poin
27a0: 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ter. In this cas
27b0: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  e,.** it is not 
27c0: 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43  considered..*/.C
27d0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42  ollSeq *sqlite3B
27e0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
27f0: 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Seq(.  Parse *pP
2800: 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70  arse, .  Expr *p
2810: 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70  Left, .  Expr *p
2820: 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53  Right.){.  CollS
2830: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73  eq *pColl;.  ass
2840: 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
2850: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
2860: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
2870: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2880: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2890: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
28a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
28b0: 68 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66  ht && (pRight->f
28c0: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
28d0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  e)!=0 ){.    pCo
28e0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
28f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2900: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
2910: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
2920: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2930: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
2940: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
2950: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  ){.      pColl =
2960: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2970: 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67  Seq(pParse, pRig
2980: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ht);.    }.  }. 
2990: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
29a0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
29b0: 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
29c0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
29d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
29e0: 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61  odeCompare(.  Pa
29f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2a00: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28  /* The parsing (
2a10: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
2a20: 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ing) context */.
2a30: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
2a40: 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
2a50: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
2a60: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f  r *pRight,     /
2a70: 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72  * The right oper
2a80: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63  and */.  int opc
2a90: 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ode,       /* Th
2aa0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63  e comparison opc
2ab0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31  ode */.  int in1
2ac0: 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65  , int in2, /* Re
2ad0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f  gister holding o
2ae0: 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74  perands */.  int
2af0: 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
2b00: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
2b10: 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a  rue.  */.  int j
2b20: 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
2b30: 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66  If true, jump if
2b40: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
2b50: 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  is NULL */.){.  
2b60: 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64  int p5;.  int ad
2b70: 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dr;.  CollSeq *p
2b80: 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74  4;..  p4 = sqlit
2b90: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
2ba0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2bb0: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
2bc0: 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70   p5 = binaryComp
2bd0: 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69  areP5(pLeft, pRi
2be0: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
2bf0: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
2c00: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61  e3VdbeAddOp4(pPa
2c10: 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f  rse->pVdbe, opco
2c20: 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69  de, in2, dest, i
2c30: 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n1,.            
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2c50: 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c  void*)p4, P4_COL
2c60: 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33  LSEQ);.  sqlite3
2c70: 56 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61  VdbeChangeP5(pPa
2c80: 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29  rse->pVdbe, (u8)
2c90: 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  p5);.  return ad
2ca0: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dr;.}../*.** Ret
2cb0: 75 72 6e 20 74 72 75 65 20 69 66 20 65 78 70 72  urn true if expr
2cc0: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
2cd0: 61 20 76 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c  a vector, or fal
2ce0: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  se otherwise..**
2cf0: 0a 2a 2a 20 41 20 76 65 63 74 6f 72 20 69 73 20  .** A vector is 
2d00: 64 65 66 69 6e 65 64 20 61 73 20 61 6e 79 20 65  defined as any e
2d10: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 72  xpression that r
2d20: 65 73 75 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72  esults in two or
2d30: 20 6d 6f 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73   more.** columns
2d40: 20 6f 66 20 72 65 73 75 6c 74 2e 20 20 45 76 65   of result.  Eve
2d50: 72 79 20 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64  ry TK_VECTOR nod
2d60: 65 20 69 73 20 61 6e 20 76 65 63 74 6f 72 20 62  e is an vector b
2d70: 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61  ecause the.** pa
2d80: 72 73 65 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65  rser will not ge
2d90: 6e 65 72 61 74 65 20 61 20 54 4b 5f 56 45 43 54  nerate a TK_VECT
2da0: 4f 52 20 77 69 74 68 20 66 65 77 65 72 20 74 68  OR with fewer th
2db0: 61 6e 20 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a  an two entries..
2dc0: 2a 2a 20 42 75 74 20 61 20 54 4b 5f 53 45 4c 45  ** But a TK_SELE
2dd0: 43 54 20 6d 69 67 68 74 20 62 65 20 65 69 74 68  CT might be eith
2de0: 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61  er a vector or a
2df0: 20 73 63 61 6c 61 72 2e 20 49 74 20 69 73 20 6f   scalar. It is o
2e00: 6e 6c 79 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  nly.** considere
2e10: 64 20 61 20 76 65 63 74 6f 72 20 69 66 20 69 74  d a vector if it
2e20: 20 68 61 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65   has two or more
2e30: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e   result columns.
2e40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2e50: 78 70 72 49 73 56 65 63 74 6f 72 28 45 78 70 72  xprIsVector(Expr
2e60: 20 2a 70 45 78 70 72 29 7b 0a 20 20 72 65 74 75   *pExpr){.  retu
2e70: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 56 65  rn sqlite3ExprVe
2e80: 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3e  ctorSize(pExpr)>
2e90: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  1;.}../*.** If t
2ea0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  he expression pa
2eb0: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
2ec0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20   argument is of 
2ed0: 74 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a  type TK_VECTOR .
2ee0: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ** return the nu
2ef0: 6d 62 65 72 20 6f 66 20 65 78 70 72 65 73 73 69  mber of expressi
2f00: 6f 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f  ons in the vecto
2f10: 72 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 65 78  r. Or, if the ex
2f20: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61  pression.** is a
2f30: 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 72 65 74   sub-select, ret
2f40: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2f50: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
2f60: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72   sub-select. For
2f70: 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 74 79  .** any other ty
2f80: 70 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  pe of expression
2f90: 2c 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69  , return 1..*/.i
2fa0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 56 65  nt sqlite3ExprVe
2fb0: 63 74 6f 72 53 69 7a 65 28 45 78 70 72 20 2a 70  ctorSize(Expr *p
2fc0: 45 78 70 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d  Expr){.  u8 op =
2fd0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
2fe0: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
2ff0: 52 20 29 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  R ) op = pExpr->
3000: 6f 70 32 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  op2;.  if( op==T
3010: 4b 5f 56 45 43 54 4f 52 20 29 7b 0a 20 20 20 20  K_VECTOR ){.    
3020: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e  return pExpr->x.
3030: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
3040: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
3050: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72  _SELECT ){.    r
3060: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70  eturn pExpr->x.p
3070: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
3080: 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nExpr;.  }else{.
3090: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
30a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
30b0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
30c0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 6f   subexpression o
30d0: 66 20 70 56 65 63 74 6f 72 20 74 68 61 74 20 69  f pVector that i
30e0: 73 20 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f  s the i-th.** co
30f0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
3100: 6f 72 20 28 6e 75 6d 62 65 72 65 64 20 73 74 61  or (numbered sta
3110: 72 74 69 6e 67 20 77 69 74 68 20 30 29 2e 20 20  rting with 0).  
3120: 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a  The caller must.
3130: 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 69  ** ensure that i
3140: 20 69 73 20 77 69 74 68 69 6e 20 72 61 6e 67 65   is within range
3150: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74  ..**.** If pVect
3160: 6f 72 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73  or is really a s
3170: 63 61 6c 61 72 20 28 61 6e 64 20 22 73 63 61 6c  calar (and "scal
3180: 61 72 22 20 68 65 72 65 20 69 6e 63 6c 75 64 65  ar" here include
3190: 73 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20  s subqueries.** 
31a0: 74 68 61 74 20 72 65 74 75 72 6e 20 61 20 73 69  that return a si
31b0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68  ngle column!) th
31c0: 65 6e 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f  en return pVecto
31d0: 72 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a  r unmodified..**
31e0: 0a 2a 2a 20 70 56 65 63 74 6f 72 20 72 65 74 61  .** pVector reta
31f0: 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  ins ownership of
3200: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 75   the returned su
3210: 62 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a  bexpression..**.
3220: 2a 2a 20 49 66 20 74 68 65 20 76 65 63 74 6f 72  ** If the vector
3230: 20 69 73 20 61 20 28 53 45 4c 45 43 54 20 2e 2e   is a (SELECT ..
3240: 2e 29 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  .) then the expr
3250: 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  ession returned 
3260: 69 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20 65  is.** just the e
3270: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68  xpression for th
3280: 65 20 69 2d 74 68 20 74 65 72 6d 20 6f 66 20 74  e i-th term of t
3290: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61  he result set, a
32a0: 6e 64 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65  nd may.** not be
32b0: 20 72 65 61 64 79 20 66 6f 72 20 65 76 61 6c 75   ready for evalu
32c0: 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68  ation because th
32d0: 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 68  e table cursor h
32e0: 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65  as not yet.** be
32f0: 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a  en positioned..*
3300: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 56  /.Expr *sqlite3V
3310: 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
3320: 72 28 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c  r(Expr *pVector,
3330: 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72   int i){.  asser
3340: 74 28 20 69 3c 73 71 6c 69 74 65 33 45 78 70 72  t( i<sqlite3Expr
3350: 56 65 63 74 6f 72 53 69 7a 65 28 70 56 65 63 74  VectorSize(pVect
3360: 6f 72 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  or) );.  if( sql
3370: 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
3380: 28 70 56 65 63 74 6f 72 29 20 29 7b 0a 20 20 20  (pVector) ){.   
3390: 20 61 73 73 65 72 74 28 20 70 56 65 63 74 6f 72   assert( pVector
33a0: 2d 3e 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63  ->op2==0 || pVec
33b0: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  tor->op==TK_REGI
33c0: 53 54 45 52 20 29 3b 0a 20 20 20 20 69 66 28 20  STER );.    if( 
33d0: 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f  pVector->op==TK_
33e0: 53 45 4c 45 43 54 20 7c 7c 20 70 56 65 63 74 6f  SELECT || pVecto
33f0: 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43  r->op2==TK_SELEC
3400: 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T ){.      retur
3410: 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65  n pVector->x.pSe
3420: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
3430: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65  i].pExpr;.    }e
3440: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
3450: 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69  n pVector->x.pLi
3460: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
3470: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3480: 72 6e 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f  rn pVector;.}../
3490: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
34a0: 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20 45 78   return a new Ex
34b0: 70 72 20 6f 62 6a 65 63 74 20 77 68 69 63 68 20  pr object which 
34c0: 77 68 65 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a  when passed to.*
34d0: 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  * sqlite3ExprCod
34e0: 65 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  e() will generat
34f0: 65 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20  e all necessary 
3500: 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a  code to compute.
3510: 2a 2a 20 74 68 65 20 69 46 69 65 6c 64 2d 74 68  ** the iField-th
3520: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76   column of the v
3530: 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
3540: 20 70 56 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20   pVector..**.** 
3550: 49 74 20 69 73 20 6f 6b 20 66 6f 72 20 70 56 65  It is ok for pVe
3560: 63 74 6f 72 20 74 6f 20 62 65 20 61 20 73 63 61  ctor to be a sca
3570: 6c 61 72 20 28 61 73 20 6c 6f 6e 67 20 61 73 20  lar (as long as 
3580: 69 46 69 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a  iField==0).  .**
3590: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
35a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
35b0: 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78  s like sqlite3Ex
35c0: 70 72 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  prDup()..**.** T
35d0: 68 65 20 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74  he caller owns t
35e0: 68 65 20 72 65 74 75 72 6e 65 64 20 45 78 70 72  he returned Expr
35f0: 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 73 20 72   object and is r
3600: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a  esponsible for.*
3610: 2a 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  * ensuring that 
3620: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
3630: 75 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  ue eventually ge
3640: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
3650: 54 68 65 20 63 61 6c 6c 65 72 20 72 65 74 61 69  The caller retai
3660: 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  ns ownership of 
3670: 70 56 65 63 74 6f 72 2e 20 20 49 66 20 70 56 65  pVector.  If pVe
3680: 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c  ctor is a TK_SEL
3690: 45 43 54 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ECT,.** then the
36a0: 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74   returned object
36b0: 20 77 69 6c 6c 20 72 65 66 65 72 65 6e 63 65 20   will reference 
36c0: 70 56 65 63 74 6f 72 20 61 6e 64 20 73 6f 20 70  pVector and so p
36d0: 56 65 63 74 6f 72 20 6d 75 73 74 20 72 65 6d 61  Vector must rema
36e0: 69 6e 0a 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20  in.** valid for 
36f0: 74 68 65 20 6c 69 66 65 20 6f 66 20 74 68 65 20  the life of the 
3700: 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e  returned object.
3710: 20 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20    If pVector is 
3720: 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f  a TK_VECTOR.** o
3730: 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  r a scalar expre
3740: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63  ssion, then it c
3750: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 20 61 73  an be deleted as
3760: 20 73 6f 6f 6e 20 61 73 20 74 68 69 73 20 72 6f   soon as this ro
3770: 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
3780: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20  ..**.** A trick 
3790: 74 6f 20 63 61 75 73 65 20 61 20 54 4b 5f 53 45  to cause a TK_SE
37a0: 4c 45 43 54 20 70 56 65 63 74 6f 72 20 74 6f 20  LECT pVector to 
37b0: 62 65 20 64 65 6c 65 74 65 64 20 74 6f 67 65 74  be deleted toget
37c0: 68 65 72 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  her with.** the 
37d0: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
37e0: 6a 65 63 74 20 69 73 20 74 6f 20 61 74 74 61 63  ject is to attac
37f0: 68 20 74 68 65 20 70 56 65 63 74 6f 72 20 74 6f  h the pVector to
3800: 20 74 68 65 20 70 52 69 67 68 74 20 66 69 65 6c   the pRight fiel
3810: 64 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75  d.** of the retu
3820: 72 6e 65 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43  rned TK_SELECT_C
3830: 4f 4c 55 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63  OLUMN Expr objec
3840: 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  t..*/.Expr *sqli
3850: 74 65 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72  te3ExprForVector
3860: 46 69 65 6c 64 28 0a 20 20 50 61 72 73 65 20 2a  Field(.  Parse *
3870: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
3880: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
3890: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63   */.  Expr *pVec
38a0: 74 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  tor,       /* Th
38b0: 65 20 76 65 63 74 6f 72 2e 20 20 4c 69 73 74 20  e vector.  List 
38c0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  of expressions o
38d0: 72 20 61 20 73 75 62 2d 53 45 4c 45 43 54 20 2a  r a sub-SELECT *
38e0: 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 20 20  /.  int iField  
38f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
3900: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
3910: 76 65 63 74 6f 72 20 74 6f 20 72 65 74 75 72 6e  vector to return
3920: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
3930: 52 65 74 3b 0a 20 20 69 66 28 20 70 56 65 63 74  Ret;.  if( pVect
3940: 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  or->op==TK_SELEC
3950: 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  T ){.    assert(
3960: 20 70 56 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20   pVector->flags 
3970: 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
3980: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f  ;.    /* The TK_
3990: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78  SELECT_COLUMN Ex
39a0: 70 72 20 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a  pr node:.    **.
39b0: 20 20 20 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20      ** pLeft:   
39c0: 20 20 20 20 20 20 20 20 70 56 65 63 74 6f 72 20          pVector 
39d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45  containing TK_SE
39e0: 4c 45 43 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74  LECT.  Not delet
39f0: 65 64 2e 0a 20 20 20 20 2a 2a 20 70 52 69 67 68  ed..    ** pRigh
3a00: 74 3a 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20  t:          not 
3a10: 75 73 65 64 2e 20 20 42 75 74 20 72 65 63 75 72  used.  But recur
3a20: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a  sively deleted..
3a30: 20 20 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20      ** iColumn: 
3a40: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 6f 66          Index of
3a50: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65   a column in pVe
3a60: 63 74 6f 72 0a 20 20 20 20 2a 2a 20 69 54 61 62  ctor.    ** iTab
3a70: 6c 65 3a 20 20 20 20 20 20 20 20 20 20 30 20 6f  le:          0 o
3a80: 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
3a90: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c  columns on the L
3aa0: 48 53 20 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d  HS of an assignm
3ab0: 65 6e 74 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74  ent.    ** pLeft
3ac0: 2d 3e 69 54 61 62 6c 65 3a 20 20 20 46 69 72 73  ->iTable:   Firs
3ad0: 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  t in an array of
3ae0: 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
3af0: 67 20 72 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20  g result, or 0. 
3b00: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
3b10: 20 20 20 20 20 20 20 69 66 20 74 68 65 20 72 65         if the re
3b20: 73 75 6c 74 20 69 73 20 6e 6f 74 20 79 65 74 20  sult is not yet 
3b30: 63 6f 6d 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a  computed..    **
3b40: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45  .    ** sqlite3E
3b50: 78 70 72 44 65 6c 65 74 65 28 29 20 73 70 65 63  xprDelete() spec
3b60: 69 66 69 63 61 6c 6c 79 20 73 6b 69 70 73 20 74  ifically skips t
3b70: 68 65 20 72 65 63 75 72 73 69 76 65 20 64 65 6c  he recursive del
3b80: 65 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c  ete of.    ** pL
3b90: 65 66 74 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54  eft on TK_SELECT
3ba0: 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20  _COLUMN nodes.  
3bb0: 42 75 74 20 70 52 69 67 68 74 20 69 73 20 66 6f  But pRight is fo
3bc0: 6c 6c 6f 77 65 64 2c 20 73 6f 20 70 56 65 63 74  llowed, so pVect
3bd0: 6f 72 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  or.    ** can be
3be0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 70 52 69   attached to pRi
3bf0: 67 68 74 20 74 6f 20 63 61 75 73 65 20 74 68 69  ght to cause thi
3c00: 73 20 6e 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f  s node to take o
3c10: 77 6e 65 72 73 68 69 70 20 6f 66 0a 20 20 20 20  wnership of.    
3c20: 2a 2a 20 70 56 65 63 74 6f 72 2e 20 20 54 79 70  ** pVector.  Typ
3c30: 69 63 61 6c 6c 79 20 74 68 65 72 65 20 77 69 6c  ically there wil
3c40: 6c 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b  l be multiple TK
3c50: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e  _SELECT_COLUMN n
3c60: 6f 64 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68  odes.    ** with
3c70: 20 74 68 65 20 73 61 6d 65 20 70 4c 65 66 74 20   the same pLeft 
3c80: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
3c90: 56 65 63 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79  Vector, but only
3ca0: 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 20 20 20   one of them.   
3cb0: 20 2a 2a 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65   ** will own the
3cc0: 20 70 56 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f   pVector..    */
3cd0: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
3ce0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
3cf0: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
3d00: 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  N, 0, 0);.    if
3d10: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
3d20: 70 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pRet->iColumn = 
3d30: 69 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52  iField;.      pR
3d40: 65 74 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63  et->pLeft = pVec
3d50: 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
3d60: 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c  ssert( pRet==0 |
3d70: 7c 20 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d  | pRet->iTable==
3d80: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
3d90: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3da0: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70  p==TK_VECTOR ) p
3db0: 56 65 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72  Vector = pVector
3dc0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
3dd0: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
3de0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
3df0: 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
3e00: 2c 20 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20  , pVector, 0);. 
3e10: 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
3e20: 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73  TokenRemap(pPars
3e30: 65 2c 20 70 52 65 74 2c 20 70 56 65 63 74 6f 72  e, pRet, pVector
3e40: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
3e50: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pRet;.}../*.** I
3e60: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
3e70: 70 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b  pr is of type TK
3e80: 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74  _SELECT, generat
3e90: 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
3ea0: 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74 75 72 6e  te.** it. Return
3eb0: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
3ec0: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
3ed0: 74 20 69 73 20 73 74 6f 72 65 64 20 28 6f 72 2c  t is stored (or,
3ee0: 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d   if the .** sub-
3ef0: 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 6d  select returns m
3f00: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c  ore than one col
3f10: 75 6d 6e 2c 20 74 68 65 20 66 69 72 73 74 20 69  umn, the first i
3f20: 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20 6f 66  n an array.** of
3f30: 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 77 68   registers in wh
3f40: 69 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 69  ich the result i
3f50: 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a 2a 2a  s stored)..**.**
3f60: 20 49 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74   If pExpr is not
3f70: 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70   a TK_SELECT exp
3f80: 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20  ression, return 
3f90: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
3fa0: 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65   exprCodeSubsele
3fb0: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
3fc0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
3fd0: 20 20 69 6e 74 20 72 65 67 20 3d 20 30 3b 0a 23    int reg = 0;.#
3fe0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3ff0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
4000: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
4010: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65  SELECT ){.    re
4020: 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  g = sqlite3CodeS
4030: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
4040: 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 23 65 6e   pExpr);.  }.#en
4050: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67  dif.  return reg
4060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
4070: 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e  ent pVector poin
4080: 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65  ts to a vector e
4090: 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68  xpression - eith
40a0: 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a  er a TK_VECTOR.*
40b0: 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74  * or TK_SELECT t
40c0: 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65  hat returns more
40d0: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
40e0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
40f0: 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72  returns.** the r
4100: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f  egister number o
4110: 66 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  f a register tha
4120: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
4130: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65  alue of.** eleme
4140: 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65  nt iField of the
4150: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   vector..**.** I
4160: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
4170: 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73  K_SELECT express
4180: 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66  ion, then code f
4190: 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20  or it must have 
41a0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
41b0: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
41c0: 20 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62   the exprCodeSub
41d0: 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65  select() routine
41e0: 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
41f0: 65 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53  e parameter regS
4200: 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20  elect should be 
4210: 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
4220: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
4230: 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  rs.** containing
4240: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
4250: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  the sub-select. 
4260: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f  .**.** If pVecto
4270: 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f  r is of type TK_
4280: 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64  VECTOR, then cod
4290: 65 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73  e for the reques
42a0: 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20  ted field.** is 
42b0: 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68  generated. In th
42c0: 69 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72  is case (*pRegFr
42d0: 65 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74  ee) may be set t
42e0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
42f0: 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  ** a temporary r
4300: 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72  egister to be fr
4310: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
4320: 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
4330: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ng..**.** Before
4340: 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70   returning, outp
4350: 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  ut parameter (*p
4360: 70 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f  pExpr) is set to
4370: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
4380: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72   Expr object cor
4390: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c  responding to el
43a0: 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74  ement iElem of t
43b0: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74  he vector..*/.st
43c0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63  atic int exprVec
43d0: 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50  torRegister(.  P
43e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4400: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
4410: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74  */.  Expr *pVect
4420: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
4430: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74       /* Vector t
4440: 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e  o extract elemen
4450: 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
4460: 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20  iField,         
4470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4480: 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20  ield to extract 
4490: 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a  from pVector */.
44a0: 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c    int regSelect,
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44c0: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
44d0: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
44e0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
44f0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
4500: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78        /* OUT: Ex
4510: 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74  pression element
4520: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46   */.  int *pRegF
4530: 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
4540: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65        /* OUT: Te
4550: 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
4560: 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f  ree */.){.  u8 o
4570: 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b  p = pVector->op;
4580: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
4590: 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d  K_VECTOR || op==
45a0: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
45b0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
45c0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
45d0: 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70  ISTER ){.    *pp
45e0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65  Expr = sqlite3Ve
45f0: 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
4600: 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64  (pVector, iField
4610: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56  );.    return pV
4620: 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46  ector->iTable+iF
4630: 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ield;.  }.  if( 
4640: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
4650: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70  .    *ppExpr = p
4660: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
4670: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69  t->pEList->a[iFi
4680: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
4690: 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63   return regSelec
46a0: 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20  t+iField;.  }.  
46b0: 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f  *ppExpr = pVecto
46c0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46  r->x.pList->a[iF
46d0: 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72  ield].pExpr;.  r
46e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
46f0: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
4700: 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46  , *ppExpr, pRegF
4710: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ree);.}../*.** E
4720: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
4730: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
4740: 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74  between two vect
4750: 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75  or values. Compu
4760: 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  te.** the result
4770: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
4780: 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c  on (1, 0, or NUL
4790: 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  L) and write tha
47a0: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f  t.** result into
47b0: 20 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a   register dest..
47c0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
47d0: 20 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68   must satisfy th
47e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63  e following prec
47f0: 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  onditions:.**.**
4800: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
4810: 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70  ==TK_IS:      op
4820: 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d  ==TK_EQ and p5==
4830: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
4840: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
4850: 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70  ==TK_ISNOT:   op
4860: 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d  ==TK_NE and p5==
4870: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
4880: 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20      otherwise:  
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
48a0: 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  ==pExpr->op and 
48b0: 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20  p5==0.*/.static 
48c0: 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43  void codeVectorC
48d0: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
48e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
48f0: 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f  /* Code generato
4900: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
4910: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
4920: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
4930: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
4940: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
4950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
4960: 72 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74  rite results int
4970: 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
4980: 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20  */.  u8 op,     
4990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
49a0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
49b0: 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  r */.  u8 p5    
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49d0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72  SQLITE_NULLEQ or
49e0: 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64   zero */.){.  Vd
49f0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
4a00: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
4a10: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
4a20: 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69  eft;.  Expr *pRi
4a30: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
4a40: 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74  ght;.  int nLeft
4a50: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
4a60: 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
4a70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4a80: 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69  regLeft = 0;.  i
4a90: 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b  nt regRight = 0;
4aa0: 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a  .  u8 opx = op;.
4ab0: 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d    int addrDone =
4ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4ad0: 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  Label(pParse);..
4ae0: 20 20 69 66 28 20 6e 4c 65 66 74 21 3d 73 71 6c    if( nLeft!=sql
4af0: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
4b00: 7a 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  ze(pRight) ){.  
4b10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4b20: 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
4b30: 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
4b40: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
4b50: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
4b60: 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45  >op==TK_EQ || pE
4b70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 0a  xpr->op==TK_NE .
4b80: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
4b90: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45  >op==TK_IS || pE
4ba0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4bb0: 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78  T .       || pEx
4bc0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pr->op==TK_LT ||
4bd0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
4be0: 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78  T .       || pEx
4bf0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
4c00: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
4c10: 45 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  E .  );.  assert
4c20: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20  ( pExpr->op==op 
4c30: 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  || (pExpr->op==T
4c40: 4b 5f 49 53 20 26 26 20 6f 70 3d 3d 54 4b 5f 45  K_IS && op==TK_E
4c50: 51 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  Q).            |
4c60: 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  | (pExpr->op==TK
4c70: 5f 49 53 4e 4f 54 20 26 26 20 6f 70 3d 3d 54 4b  _ISNOT && op==TK
4c80: 5f 4e 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  _NE) );.  assert
4c90: 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78 70 72  ( p5==0 || pExpr
4ca0: 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20 61 73  ->op!=op );.  as
4cb0: 73 65 72 74 28 20 70 35 3d 3d 53 51 4c 49 54 45  sert( p5==SQLITE
4cc0: 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78 70 72  _NULLEQ || pExpr
4cd0: 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20 20 70  ->op==op );..  p
4ce0: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 53 54 4f 52  5 |= SQLITE_STOR
4cf0: 45 50 32 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d  EP2;.  if( opx==
4d00: 54 4b 5f 4c 45 20 29 20 6f 70 78 20 3d 20 54 4b  TK_LE ) opx = TK
4d10: 5f 4c 54 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d  _LT;.  if( opx==
4d20: 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20 54 4b  TK_GE ) opx = TK
4d30: 5f 47 54 3b 0a 0a 20 20 72 65 67 4c 65 66 74 20  _GT;..  regLeft 
4d40: 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c  = exprCodeSubsel
4d50: 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ect(pParse, pLef
4d60: 74 29 3b 0a 20 20 72 65 67 52 69 67 68 74 20 3d  t);.  regRight =
4d70: 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65   exprCodeSubsele
4d80: 63 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  ct(pParse, pRigh
4d90: 74 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t);..  for(i=0; 
4da0: 31 20 2f 2a 4c 6f 6f 70 20 65 78 69 74 73 20 62  1 /*Loop exits b
4db0: 79 20 22 62 72 65 61 6b 22 2a 2f 3b 20 69 2b 2b  y "break"*/; i++
4dc0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 46 72  ){.    int regFr
4dd0: 65 65 31 20 3d 20 30 2c 20 72 65 67 46 72 65 65  ee1 = 0, regFree
4de0: 32 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 72 20  2 = 0;.    Expr 
4df0: 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20 20 69  *pL, *pR; .    i
4e00: 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 61  nt r1, r2;.    a
4e10: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
4e20: 3c 6e 4c 65 66 74 20 29 3b 0a 20 20 20 20 72 31  <nLeft );.    r1
4e30: 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67   = exprVectorReg
4e40: 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c  ister(pParse, pL
4e50: 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c  eft, i, regLeft,
4e60: 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29   &pL, &regFree1)
4e70: 3b 0a 20 20 20 20 72 32 20 3d 20 65 78 70 72 56  ;.    r2 = exprV
4e80: 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50  ectorRegister(pP
4e90: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69 2c  arse, pRight, i,
4ea0: 20 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c 20   regRight, &pR, 
4eb0: 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
4ec0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
4ed0: 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f 70 78 2c  se, pL, pR, opx,
4ee0: 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 70   r1, r2, dest, p
4ef0: 35 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  5);.    testcase
4f00: 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
4f10: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4f20: 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 74 65  ==OP_Lt);.    te
4f30: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
4f40: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4f50: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
4f60: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4f70: 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
4f80: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f90: 5f 47 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Gt);.    testca
4fa0: 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
4fb0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4fc0: 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
4fd0: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4fe0: 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
4ff0: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
5000: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
5010: 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43  p==OP_Ne); VdbeC
5020: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
5030: 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71 6c 69  OP_Ne);.    sqli
5040: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5050: 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
5060: 65 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e1);.    sqlite3
5070: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5080: 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
5090: 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65  ;.    if( i==nLe
50a0: 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62 72  ft-1 ){.      br
50b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
50c0: 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29 7b  f( opx==TK_EQ ){
50d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
50e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
50f0: 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64 72  fNot, dest, addr
5100: 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Done); VdbeCover
5110: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35  age(v);.      p5
5120: 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e   |= SQLITE_KEEPN
5130: 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ULL;.    }else i
5140: 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b  f( opx==TK_NE ){
5150: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5160: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5170: 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e  f, dest, addrDon
5180: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
5190: 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d  (v);.      p5 |=
51a0: 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c   SQLITE_KEEPNULL
51b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
51c0: 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54     assert( op==T
51d0: 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LT || op==TK_G
51e0: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  T || op==TK_LE |
51f0: 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  | op==TK_GE );. 
5200: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5210: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c 73  AddOp2(v, OP_Els
5220: 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72 44  eNotEq, 0, addrD
5230: 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  one);.      Vdbe
5240: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
5250: 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20  ==TK_LT);.      
5260: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
5270: 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20  , op==TK_GT);.  
5280: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
5290: 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29  If(v, op==TK_LE)
52a0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
52b0: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
52c0: 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  _GE);.      if( 
52d0: 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70 78  i==nLeft-2 ) opx
52e0: 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d   = op;.    }.  }
52f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
5300: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
5310: 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66 20  drDone);.}..#if 
5320: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
5330: 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  DEPTH>0./*.** Ch
5340: 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e  eck that argumen
5350: 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73  t nHeight is les
5360: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
5370: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a  to the maximum.*
5380: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  * expression dep
5390: 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69  th allowed. If i
53a0: 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20  t is not, leave 
53b0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
53c0: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a   in.** pParse..*
53d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
53e0: 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72  rCheckHeight(Par
53f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
5400: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20  nHeight){.  int 
5410: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5420: 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d    int mxHeight =
5430: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
5440: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
5450: 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20  _EXPR_DEPTH];.  
5460: 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65  if( nHeight>mxHe
5470: 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
5480: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5490: 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70  se, .       "Exp
54a0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20  ression tree is 
54b0: 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d  too large (maxim
54c0: 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d  um depth %d)", m
54d0: 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20  xHeight.    );. 
54e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
54f0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
5500: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  rn rc;.}../* The
5510: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65   following three
5520: 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67   functions, heig
5530: 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67  htOfExpr(), heig
5540: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a  htOfExprList().*
5550: 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65  * and heightOfSe
5560: 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64  lect(), are used
5570: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
5580: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
5590: 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65  .** of any expre
55a0: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
55b0: 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72  enced by the str
55c0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
55d0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72   the.** first ar
55e0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
55f0: 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65   this maximum he
5600: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
5610: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
5620: 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a   value pointed.*
5630: 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74  * to by pnHeight
5640: 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  , the second par
5650: 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74  ameter, then set
5660: 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68   *pnHeight to th
5670: 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a  at.** value..*/.
5680: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5690: 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70  htOfExpr(Expr *p
56a0: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
56b0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
56c0: 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e   if( p->nHeight>
56d0: 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20  *pnHeight ){.   
56e0: 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70     *pnHeight = p
56f0: 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d  ->nHeight;.    }
5700: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
5710: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  id heightOfExprL
5720: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  ist(ExprList *p,
5730: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5740: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5750: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
5760: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
5770: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67  i++){.      heig
5780: 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d  htOfExpr(p->a[i]
5790: 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74  .pExpr, pnHeight
57a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  );.    }.  }.}.s
57b0: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
57c0: 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74  tOfSelect(Select
57d0: 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20 2a   *pSelect, int *
57e0: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53 65 6c  pnHeight){.  Sel
57f0: 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  ect *p;.  for(p=
5800: 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d 70 2d  pSelect; p; p=p-
5810: 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 68 65  >pPrior){.    he
5820: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57  ightOfExpr(p->pW
5830: 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b  here, pnHeight);
5840: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5850: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e  r(p->pHaving, pn
5860: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5870: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69  ghtOfExpr(p->pLi
5880: 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  mit, pnHeight);.
5890: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
58a0: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
58b0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
58c0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
58d0: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48  p->pGroupBy, pnH
58e0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
58f0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5900: 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67  pOrderBy, pnHeig
5910: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
5920: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
5930: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
5940: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
5950: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a   passed as an .*
5960: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65  * argument. An e
5970: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e  xpression with n
5980: 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72  o children, Expr
5990: 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78  .pList or .** Ex
59a0: 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65  pr.pSelect membe
59b0: 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f  r has a height o
59c0: 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65  f 1. Any other e
59d0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73  xpression.** has
59e0: 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20   a height equal 
59f0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  to the maximum h
5a00: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68  eight of any oth
5a10: 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  er .** reference
5a20: 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e  d Expr plus one.
5a30: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
5a40: 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61  agate EP_Propaga
5a50: 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d  te flags up from
5a60: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f   Expr.x.pList to
5a70: 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20   Expr.flags,.** 
5a80: 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  if appropriate..
5a90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5aa0: 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70  xprSetHeight(Exp
5ab0: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  r *p){.  int nHe
5ac0: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
5ad0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66  htOfExpr(p->pLef
5ae0: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5af0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5b00: 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74  pRight, &nHeight
5b10: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
5b20: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
5b30: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
5b40: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5b50: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e  p->x.pSelect, &n
5b60: 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  Height);.  }else
5b70: 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20   if( p->x.pList 
5b80: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
5b90: 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69  xprList(p->x.pLi
5ba0: 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  st, &nHeight);. 
5bb0: 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45     p->flags |= E
5bc0: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71  P_Propagate & sq
5bd0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
5be0: 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  gs(p->x.pList);.
5bf0: 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74    }.  p->nHeight
5c00: 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a   = nHeight + 1;.
5c10: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
5c20: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
5c30: 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65  riable using the
5c40: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29   exprSetHeight()
5c50: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a   function. If.**
5c60: 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67   the height is g
5c70: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
5c80: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  maximum allowed 
5c90: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
5ca0: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
5cb0: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
5cc0: 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67  *.** Also propag
5cd0: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
5ce0: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
5cf0: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
5d00: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
5d10: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
5d20: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
5d30: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
5d40: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
5d50: 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p){.  if( pParse
5d60: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
5d70: 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74  .  exprSetHeight
5d80: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (p);.  sqlite3Ex
5d90: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
5da0: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
5db0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
5dc0: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  rn the maximum h
5dd0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70  eight of any exp
5de0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5df0: 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68  erenced.** by th
5e00: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5e10: 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
5e20: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
5e30: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
5e40: 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20  prHeight(Select 
5e50: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
5e60: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
5e70: 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65  OfSelect(p, &nHe
5e80: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
5e90: 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65  nHeight;.}.#else
5ea0: 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67   /* ABOVE:  Heig
5eb0: 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65  ht enforcement e
5ec0: 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20  nabled.  BELOW: 
5ed0: 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65  Height enforceme
5ee0: 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20  nt off */./*.** 
5ef0: 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  Propagate all EP
5f00: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
5f10: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5f20: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5f30: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5f40: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5f50: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5f60: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5f70: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5f80: 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  p && p->x.pList 
5f90: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
5fa0: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
5fb0: 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66  ect) ){.    p->f
5fc0: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
5fd0: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
5fe0: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5ff0: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23  .pList);.  }.}.#
6000: 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65  define exprSetHe
6010: 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f  ight(y).#endif /
6020: 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  * SQLITE_MAX_EXP
6030: 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a  R_DEPTH>0 */../*
6040: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6050: 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c   is the core all
6060: 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20  ocator for Expr 
6070: 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e  nodes..**.** Con
6080: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
6090: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64  ression node and
60a0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
60b0: 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79  r to it.  Memory
60c0: 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64  .** for this nod
60d0: 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54  e and for the pT
60e0: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  oken argument is
60f0: 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   a single alloca
6100: 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  tion.** obtained
6110: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
6120: 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61  alloc().  The ca
6130: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
6140: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
6150: 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
6160: 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75   the node eventu
6170: 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e  ally gets freed.
6180: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74  .**.** If dequot
6190: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
61a0: 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74  the token (if it
61b0: 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75   exists) is dequ
61c0: 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75  oted..** If dequ
61d0: 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f  ote is false, no
61e0: 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65   dequoting is pe
61f0: 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64 65  rformed.  The de
6200: 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74  Quote.** paramet
6210: 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
6220: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20   pToken is NULL 
6230: 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20  or if the token 
6240: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65  does not.** appe
6250: 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ar to be quoted.
6260: 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20    If the quotes 
6270: 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  were of the form
6280: 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71   "..." (double-q
6290: 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74  uotes).** then t
62a0: 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20  he EP_DblQuoted 
62b0: 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
62c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
62d0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61  de..**.** Specia
62e0: 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d  l case:  If op==
62f0: 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70  TK_INTEGER and p
6300: 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Token points to 
6310: 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a  a string that.**
6320: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74   can be translat
6330: 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74  ed into a 32-bit
6340: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
6350: 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a  he token is not.
6360: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a  ** stored in u.z
6370: 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c  Token.  Instead,
6380: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
6390: 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ues is written.*
63a0: 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20  * into u.iValue 
63b0: 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61  and the EP_IntVa
63c0: 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e  lue flag is set.
63d0: 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61    No extra stora
63e0: 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74  ge.** is allocat
63f0: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69  ed to hold the i
6400: 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20  nteger text and 
6410: 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67  the dequote flag
6420: 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
6430: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
6440: 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65  rAlloc(.  sqlite
6450: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
6460: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
6470: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6480: 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  awNN() */.  int 
6490: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
64a0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
64b0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
64c0: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
64d0: 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61  n,    /* Token a
64e0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
64f0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
6500: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
6510: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
6520: 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20  dequote */.){.  
6530: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
6540: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
6550: 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a  int iValue = 0;.
6560: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
6570: 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e   );.  if( pToken
6580: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
6590: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
65a0: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
65b0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
65c0: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
65d0: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
65e0: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
65f0: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
6600: 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c      assert( iVal
6610: 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ue>=0 );.    }. 
6620: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
6630: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
6640: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
6650: 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  )+nExtra);.  if(
6660: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   pNew ){.    mem
6670: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
6680: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
6690: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
66a0: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
66b0: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
66c0: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
66d0: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
66e0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
66f0: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
6700: 6c 75 65 7c 45 50 5f 4c 65 61 66 7c 28 69 56 61  lue|EP_Leaf|(iVa
6710: 6c 75 65 3f 45 50 5f 49 73 54 72 75 65 3a 45 50  lue?EP_IsTrue:EP
6720: 5f 49 73 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  _IsFalse);.     
6730: 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
6740: 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20  e = iValue;.    
6750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6760: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
6770: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
6780: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
6790: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
67a0: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
67b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
67c0: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
67d0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
67e0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
67f0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
6800: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
6810: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
6820: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
6830: 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33 49 73  ote && sqlite3Is
6840: 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54  quote(pNew->u.zT
6850: 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20  oken[0]) ){.    
6860: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
6870: 75 6f 74 65 45 78 70 72 28 70 4e 65 77 29 3b 0a  uoteExpr(pNew);.
6880: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6890: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  }.    }.#if SQLI
68a0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
68b0: 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48  H>0.    pNew->nH
68c0: 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69  eight = 1;.#endi
68d0: 66 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f  .  }.  return
68e0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
68f0: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  Allocate a new e
6900: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
6910: 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69  rom a zero-termi
6920: 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74  nated token that
6930: 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   has.** already 
6940: 62 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a  been dequoted..*
6950: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
6960: 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
6970: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
6980: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c  * Handle for sql
6990: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
69a0: 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29  () (may be null)
69b0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
69d0: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
69e0: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
69f0: 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20  ar *zToken      
6a00: 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  /* Token argumen
6a10: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
6a20: 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20  L */.){.  Token 
6a30: 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65  x;.  x.z = zToke
6a40: 6e 3b 0a 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74  n;.  x.n = sqlit
6a50: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65  e3Strlen30(zToke
6a60: 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  n);.  return sql
6a70: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
6a80: 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a  , op, &x, 0);.}.
6a90: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75  ./*.** Attach su
6aa0: 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64  btrees pLeft and
6ab0: 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20 45   pRight to the E
6ac0: 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a  xpr node pRoot..
6ad0: 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d  **.** If pRoot==
6ae0: 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
6af0: 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c  that a memory al
6b00: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
6b10: 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  as occurred..** 
6b20: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 65  In that case, de
6b30: 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65 65  lete the subtree
6b40: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
6b50: 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ht..*/.void sqli
6b60: 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62  te3ExprAttachSub
6b70: 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33  trees(.  sqlite3
6b80: 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52   *db,.  Expr *pR
6b90: 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65  oot,.  Expr *pLe
6ba0: 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft,.  Expr *pRig
6bb0: 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f  ht.){.  if( pRoo
6bc0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  t==0 ){.    asse
6bd0: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
6be0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69  iled );.    sqli
6bf0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6c00: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  , pLeft);.    sq
6c10: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6c20: 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  db, pRight);.  }
6c30: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52  else{.    if( pR
6c40: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52  ight ){.      pR
6c50: 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 52  oot->pRight = pR
6c60: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  ight;.      pRoo
6c70: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  t->flags |= EP_P
6c80: 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67 68  ropagate & pRigh
6c90: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
6ca0: 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b      if( pLeft ){
6cb0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c  .      pRoot->pL
6cc0: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  eft = pLeft;.   
6cd0: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
6ce0: 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  |= EP_Propagate 
6cf0: 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a  & pLeft->flags;.
6d00: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
6d10: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
6d20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
6d30: 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e 6f  ocate an Expr no
6d40: 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61  de which joins a
6d50: 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75  s many as two su
6d60: 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  btrees..**.** On
6d70: 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
6d80: 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65   subtrees can be
6d90: 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61   NULL.  Return a
6da0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6db0: 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65  new.** Expr node
6dc0: 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d  .  Or, if an OOM
6dd0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
6de0: 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  et pParse->db->m
6df0: 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20  allocFailed,.** 
6e00: 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65  free the subtree
6e10: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
6e20: 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  L..*/.Expr *sqli
6e30: 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73  te3PExpr(.  Pars
6e40: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6e50: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
6e60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
6e70: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6e80: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6e90: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78  n opcode */.  Ex
6ea0: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
6eb0: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70        /* Left op
6ec0: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
6ed0: 2a 70 52 69 67 68 74 20 20 20 20 20 20 20 20 20  *pRight         
6ee0: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
6ef0: 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  and */.){.  Expr
6f00: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
6f10: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
6f20: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
6f30: 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 69 66 28  of(Expr));.  if(
6f40: 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74   p ){.    memset
6f50: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  (p, 0, sizeof(Ex
6f60: 70 72 29 29 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  pr));.    p->op 
6f70: 3d 20 6f 70 20 26 20 30 78 66 66 3b 0a 20 20 20  = op & 0xff;.   
6f80: 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20   p->iAgg = -1;. 
6f90: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74     sqlite3ExprAt
6fa0: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
6fb0: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
6fc0: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
6fd0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
6fe0: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
6ff0: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65  ->nHeight);.  }e
7000: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
7010: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
7020: 65 2d 3e 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20  e->db, pLeft);. 
7030: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
7040: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7050: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20   pRight);.  }.  
7060: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
7070: 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74 20 74  ** Add pSelect t
7080: 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70 53 65  o the Expr.x.pSe
7090: 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c  lect field.  Or,
70a0: 20 69 66 20 70 45 78 70 72 20 69 73 20 4e 55 4c   if pExpr is NUL
70b0: 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d  L (due.** do a m
70c0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
70d0: 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e 20 64   failure) then d
70e0: 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c 65 63  elete the pSelec
70f0: 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69  t object..*/.voi
7100: 64 20 73 71 6c 69 74 65 33 50 45 78 70 72 41 64  d sqlite3PExprAd
7110: 64 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  dSelect(Parse *p
7120: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7130: 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  pr, Select *pSel
7140: 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70  ect){.  if( pExp
7150: 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  r ){.    pExpr->
7160: 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  x.pSelect = pSel
7170: 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ect;.    ExprSet
7180: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
7190: 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50 5f  EP_xIsSelect|EP_
71a0: 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 73  Subquery);.    s
71b0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
71c0: 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72  ghtAndFlags(pPar
71d0: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 65  se, pExpr);.  }e
71e0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
71f0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
7200: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
7210: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
7220: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7230: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d   pSelect);.  }.}
7240: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  .../*.** Join tw
7250: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
7260: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
7270: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
7280: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
7290: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
72a0: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
72b0: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
72c0: 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20  .** If one side 
72d0: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
72e0: 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e  the AND is known
72f0: 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68   to be false, th
7300: 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  en instead.** of
7310: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e   returning an AN
7320: 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75  D expression, ju
7330: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73  st return a cons
7340: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
7350: 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20  with.** a value 
7360: 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70  of false..*/.Exp
7370: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e  r *sqlite3ExprAn
7380: 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
7390: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
73a0: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 73  pr *pRight){.  s
73b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
73c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
73d0: 4c 65 66 74 3d 3d 30 20 20 29 7b 0a 20 20 20 20  Left==0  ){.    
73e0: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
73f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
7400: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
7410: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
7420: 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73  e if( ExprAlways
7430: 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20  False(pLeft) || 
7440: 45 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  ExprAlwaysFalse(
7450: 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73  pRight) ){.    s
7460: 71 6c 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41  qlite3ExprUnmapA
7470: 6e 64 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c  ndDelete(pParse,
7480: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c   pLeft);.    sql
7490: 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41 6e 64  ite3ExprUnmapAnd
74a0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70  Delete(pParse, p
74b0: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
74c0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
74d0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
74e0: 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
74f0: 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20  okens[0], 0);.  
7500: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
7510: 6e 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  n sqlite3PExpr(p
7520: 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 70  Parse, TK_AND, p
7530: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
7540: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
7550: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
7560: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
7570: 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  a function with 
7580: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75  multiple.** argu
7590: 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ments..*/.Expr *
75a0: 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74  sqlite3ExprFunct
75b0: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
75c0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
75d0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
75e0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
75f0: 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 41 72  List,      /* Ar
7600: 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20  gument list */. 
7610: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20   Token *pToken, 
7620: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
7630: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  f the function *
7640: 2f 0a 20 20 69 6e 74 20 65 44 69 73 74 69 6e 63  /.  int eDistinc
7650: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 46 5f  t         /* SF_
7660: 44 69 73 74 69 6e 63 74 20 6f 72 20 53 46 5f 41  Distinct or SF_A
7670: 4c 4c 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20 20  LL or 0 */.){.  
7680: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71  Expr *pNew;.  sq
7690: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
76a0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
76b0: 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e  ( pToken );.  pN
76c0: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
76d0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e  Alloc(db, TK_FUN
76e0: 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31  CTION, pToken, 1
76f0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
7700: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
7710: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
7720: 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f  , pList); /* Avo
7730: 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77  id memory leak w
7740: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
7750: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
7760: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
7770: 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 45 78 70  t && pList->nExp
7780: 72 20 3e 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  r > pParse->db->
7790: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
77a0: 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MIT_FUNCTION_ARG
77b0: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
77c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
77d0: 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75 6d   "too many argum
77e0: 65 6e 74 73 20 6f 6e 20 66 75 6e 63 74 69 6f 6e  ents on function
77f0: 20 25 54 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20   %T", pToken);. 
7800: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
7810: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45 78  st = pList;.  Ex
7820: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e  prSetProperty(pN
7830: 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29 3b  ew, EP_HasFunc);
7840: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
7850: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
7860: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
7870: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
7880: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
7890: 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b  s(pParse, pNew);
78a0: 0a 20 20 69 66 28 20 65 44 69 73 74 69 6e 63 74  .  if( eDistinct
78b0: 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  ==SF_Distinct ) 
78c0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
78d0: 70 4e 65 77 2c 20 45 50 5f 44 69 73 74 69 6e 63  pNew, EP_Distinc
78e0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  t);.  return pNe
78f0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
7900: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
7910: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
7920: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
7930: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
7940: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
7950: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
7960: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
7970: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
7980: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
7990: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
79a0: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
79b0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
79c0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
79d0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
79e0: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
79f0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
7a00: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
7a10: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
7a20: 74 20 74 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f  t too big to avo
7a30: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
7a40: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
7a50: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
7a60: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
7a70: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
7a80: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
7a90: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
7aa0: 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61  rm ":aaa", "@aaa
7ab0: 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65  ", or "$aaa" are
7ac0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61   assigned the sa
7ad0: 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20  me number.** as 
7ae0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73  the previous ins
7af0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  tance of the sam
7b00: 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20  e wildcard.  Or 
7b10: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
7b20: 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65  irst.** instance
7b30: 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64   of the wildcard
7b40: 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  , the next seque
7b50: 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  ntial variable n
7b60: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
7b70: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
7b80: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
7b90: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
7ba0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
7bb0: 78 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73  xpr, u32 n){.  s
7bc0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7bd0: 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74  rse->db;.  const
7be0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61   char *z;.  ynVa
7bf0: 72 20 78 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  r x;..  if( pExp
7c00: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
7c10: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
7c20: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
7c30: 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f   EP_IntValue|EP_
7c40: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
7c50: 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70  Only) );.  z = p
7c60: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
7c70: 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
7c80: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d  ;.  assert( z[0]
7c90: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7ca0: 20 6e 3d 3d 28 75 33 32 29 73 71 6c 69 74 65 33   n==(u32)sqlite3
7cb0: 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20  Strlen30(z) );. 
7cc0: 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a   if( z[1]==0 ){.
7cd0: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
7ce0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e  of the form "?".
7cf0: 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78    Assign the nex
7d00: 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  t variable numbe
7d10: 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  r */.    assert(
7d20: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20   z[0]=='?' );.  
7d30: 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b    x = (ynVar)(++
7d40: 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20  pParse->nVar);. 
7d50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
7d60: 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20 20 69  doAdd = 0;.    i
7d70: 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[0]=='?' ){.
7d80: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
7d90: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
7da0: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
7db0: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
7dc0: 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  er and.      ** 
7dd0: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
7de0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
7df0: 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20  .      i64 i;.  
7e00: 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20      int bOk;.   
7e10: 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f     if( n==2 ){ /
7e20: 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46  *OPTIMIZATION-IF
7e30: 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 20 20  -TRUE*/.        
7e40: 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f  i = z[1]-'0';  /
7e50: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
7e60: 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73 69  e of ?N for a si
7e70: 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a  ngle digit N */.
7e80: 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b          bOk = 1;
7e90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7ea0: 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73        bOk = 0==s
7eb0: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b  qlite3Atoi64(&z[
7ec0: 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c  1], &i, n-1, SQL
7ed0: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
7ee0: 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
7ef0: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( i==0 );.     
7f00: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20   testcase( i==1 
7f10: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7f20: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
7f30: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7f40: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31  RIABLE_NUMBER]-1
7f50: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7f60: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
7f70: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7f80: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
7f90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b  );.      if( bOk
7fa0: 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e  ==0 || i<1 || i>
7fb0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7fc0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
7fd0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
7fe0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7ff0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
8000: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
8010: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
8020: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
8030: 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74        db->aLimit
8040: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
8050: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b  RIABLE_NUMBER]);
8060: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
8070: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 78  .      }.      x
8080: 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20   = (ynVar)i;.   
8090: 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d     if( x>pParse-
80a0: 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20  >nVar ){.       
80b0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
80c0: 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20 20 20  (int)x;.        
80d0: 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20  doAdd = 1;.     
80e0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
80f0: 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65  e3VListNumToName
8100: 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c  (pParse->pVList,
8110: 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   x)==0 ){.      
8120: 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20    doAdd = 1;.   
8130: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
8140: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
8150: 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20  ds like ":aaa", 
8160: 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61 22  "$aaa" or "@aaa"
8170: 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d  .  Reuse the sam
8180: 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20  e variable.     
8190: 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68   ** number as th
81a0: 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e  e prior appearan
81b0: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ce of the same n
81c0: 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e  ame, or if the n
81d0: 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ame.      ** has
81e0: 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20   never appeared 
81f0: 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68  before, reuse th
8200: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20  e same variable 
8210: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a  number.      */.
8220: 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72        x = (ynVar
8230: 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d  )sqlite3VListNam
8240: 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70  eToNum(pParse->p
8250: 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20  VList, z, n);.  
8260: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a      if( x==0 ){.
8270: 20 20 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56          x = (ynV
8280: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
8290: 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64 6f 41  ar);.        doA
82a0: 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  dd = 1;.      }.
82b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f      }.    if( do
82c0: 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Add ){.      pPa
82d0: 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71  rse->pVList = sq
82e0: 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28 64 62  lite3VListAdd(db
82f0: 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  , pParse->pVList
8300: 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20  , z, n, x);.    
8310: 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69  }.  }.  pExpr->i
8320: 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66  Column = x;.  if
8330: 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  ( x>db->aLimit[S
8340: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8350: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
8360: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8370: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
8380: 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62   many SQL variab
8390: 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  les");.  }.}../*
83a0: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
83b0: 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73  delete an expres
83c0: 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74  sion tree..*/.st
83d0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
83e0: 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65  LINE void sqlite
83f0: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71  3ExprDeleteNN(sq
8400: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
8410: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
8420: 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69  !=0 );.  /* Sani
8430: 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74  ty check: Assert
8440: 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c   that the IntVal
8450: 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  ue is non-negati
8460: 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  ve if it exists 
8470: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  */.  assert( !Ex
8480: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8490: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
84a0: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20   p->u.iValue>=0 
84b0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45  );..  assert( !E
84c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
84d0: 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 7c 7c  , EP_WinFunc) ||
84e0: 20 70 2d 3e 79 2e 70 57 69 6e 21 3d 30 20 7c 7c   p->y.pWin!=0 ||
84f0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
8500: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  d );.  assert( p
8510: 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op!=TK_FUNCTIO
8520: 4e 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  N || ExprHasProp
8530: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
8540: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
8550: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d  .          || p-
8560: 3e 79 2e 70 57 69 6e 3d 3d 30 20 7c 7c 20 45 78  >y.pWin==0 || Ex
8570: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8580: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a   EP_WinFunc) );.
8590: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
85a0: 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48 61  BUG.  if( ExprHa
85b0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
85c0: 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48 61  Leaf) && !ExprHa
85d0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
85e0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
85f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 65    assert( p->pLe
8600: 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ft==0 );.    ass
8610: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
8620: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8630: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30   p->x.pSelect==0
8640: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
8650: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
8660: 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f 6b  perty(p, (EP_Tok
8670: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29  enOnly|EP_Leaf))
8680: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45   ){.    /* The E
8690: 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e  xpr.x union is n
86a0: 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65  ever used at the
86b0: 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78   same time as Ex
86c0: 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20  pr.pRight */.   
86d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c   assert( p->x.pL
86e0: 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ist==0 || p->pRi
86f0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
8700: 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70 2d  ( p->pLeft && p-
8710: 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op!=TK_SELECT_C
8720: 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33 45  OLUMN ) sqlite3E
8730: 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20  xprDeleteNN(db, 
8740: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  p->pLeft);.    i
8750: 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a  f( p->pRight ){.
8760: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
8770: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8780: 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b  , EP_WinFunc) );
8790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
87a0: 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70  prDeleteNN(db, p
87b0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  ->pRight);.    }
87c0: 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73  else if( ExprHas
87d0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
87e0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
87f0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
8800: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8810: 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a 20 20  P_WinFunc) );.  
8820: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
8830: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
8840: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d  .pSelect);.    }
8850: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
8860: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
8870: 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  e(db, p->x.pList
8880: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
8890: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
88a0: 43 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  C.      if( Expr
88b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
88c0: 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20  P_WinFunc) ){.  
88d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e        sqlite3Win
88e0: 64 6f 77 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  dowDelete(db, p-
88f0: 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20 20 20 20  >y.pWin);.      
8900: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
8910: 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73   }.  if( ExprHas
8920: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
8930: 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74  emToken) ) sqlit
8940: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
8950: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  u.zToken);.  if(
8960: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
8970: 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20  y(p, EP_Static) 
8980: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
8990: 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20  FreeNN(db, p);. 
89a0: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
89b0: 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69  3ExprDelete(sqli
89c0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
89d0: 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71 6c  ){.  if( p ) sql
89e0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e  ite3ExprDeleteNN
89f0: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 20 49  (db, p);.}../* I
8a00: 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 52 65 6e  nvoke sqlite3Ren
8a10: 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 29 20 61  ameExprUnmap() a
8a20: 6e 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  nd sqlite3ExprDe
8a30: 6c 65 74 65 28 29 20 6f 6e 20 74 68 65 0a 2a 2a  lete() on the.**
8a40: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
8a50: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8a60: 55 6e 6d 61 70 41 6e 64 44 65 6c 65 74 65 28 50  UnmapAndDelete(P
8a70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
8a80: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  pr *p){.  if( p 
8a90: 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45  ){.    if( IN_RE
8aa0: 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
8ab0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61       sqlite3Rena
8ac0: 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50 61 72  meExprUnmap(pPar
8ad0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  se, p);.    }.  
8ae0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8af0: 65 74 65 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62  eteNN(pParse->db
8b00: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
8b10: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
8b20: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
8b30: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
8b40: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
8b50: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
8b60: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
8b70: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
8b80: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
8b90: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
8ba0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
8bb0: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
8bc0: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
8bd0: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
8be0: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
8bf0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
8c00: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
8c10: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
8c20: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8c30: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
8c40: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
8c50: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
8c60: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8c70: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
8c80: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
8c90: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
8ca0: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
8cb0: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
8cc0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
8cd0: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
8ce0: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
8cf0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
8d00: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8d10: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
8d20: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
8d30: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
8d40: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
8d50: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8d60: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
8d70: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
8d80: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
8d90: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
8da0: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
8db0: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
8dc0: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
8dd0: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
8de0: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
8df0: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
8e00: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
8e10: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
8e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
8e60: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
8e70: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
8e80: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
8e90: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
8ea0: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
8eb0: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
8ec0: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
8ed0: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
8ee0: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
8ef0: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
8f00: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
8f10: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
8f20: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
8f30: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
8f40: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
8f50: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
8f60: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
8f70: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
8f80: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
8f90: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
8fa0: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
8fb0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
8fc0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
8fd0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8fe0: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
8ff0: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
9000: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
9010: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
9020: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
9030: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
9040: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
9050: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
9060: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
9070: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
9080: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
9090: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
90a0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
90b0: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
90c0: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
90d0: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
90e0: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
90f0: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
9100: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
9110: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
9120: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
9130: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
9140: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
9150: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
9160: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
9170: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
9180: 20 74 68 65 20 45 78 70 72 20 6f 62 6a 65 63 74   the Expr object
9190: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
91a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
91b0: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
91c0: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
91d0: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
91e0: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
91f0: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
9200: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
9210: 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  n EXPRDUP_REDUCE
9220: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
9230: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
9240: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
9250: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
9260: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
9270: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
9280: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
9290: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
92a0: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
92b0: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
92c0: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
92d0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
92e0: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
92f0: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
9300: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
9310: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
9320: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
9330: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
9340: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
9350: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
9360: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
9370: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
9380: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
9390: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
93a0: 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46    assert( EXPR_F
93b0: 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29  ULLSIZE<=0xfff )
93c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66  ;.  assert( (0xf
93d0: 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ff & (EP_Reduced
93e0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d  |EP_TokenOnly))=
93f0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66  =0 );.  if( 0==f
9400: 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  lags || p->op==T
9410: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
9420: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9430: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
9440: 20 20 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f     || ExprHasPro
9450: 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46  perty(p, EP_WinF
9460: 75 6e 63 29 0a 23 65 6e 64 69 66 0a 20 20 29 7b  unc).#endif.  ){
9470: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50  .    nSize = EXP
9480: 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65  R_FULLSIZE;.  }e
9490: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
94a0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
94b0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
94c0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
94d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
94e0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
94f0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b   EP_FromJoin) );
9500: 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45   .    assert( !E
9510: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9520: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
9530: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
9540: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9550: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29  , EP_NoReduce) )
9560: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65  ;.    if( p->pLe
9570: 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74  ft || p->x.pList
9580: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
9590: 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  = EXPR_REDUCEDSI
95a0: 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b  ZE | EP_Reduced;
95b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
95c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
95d0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
95e0: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b  nSize = EXPR_TOK
95f0: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
9600: 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d  TokenOnly;.    }
9610: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53  .  }.  return nS
9620: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
9630: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
9640: 72 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e  rns the space in
9650: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
9660: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
9670: 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70  y .** of the Exp
9680: 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
9690: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
96a0: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  pr.u.zToken stri
96b0: 6e 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73  ng (if that.** s
96c0: 74 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64  tring is defined
96d0: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
96e0: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
96f0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
9700: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
9710: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53  yte = dupedExprS
9720: 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61  tructSize(p, fla
9730: 67 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69  gs) & 0xfff;.  i
9740: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
9750: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
9760: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
9770: 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  en ){.    nByte 
9780: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
9790: 33 30 4e 4e 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  30NN(p->u.zToken
97a0: 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  )+1;.  }.  retur
97b0: 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  n ROUND8(nByte);
97c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
97d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
97e0: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
97f0: 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69 63   create a duplic
9800: 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65  ate of the .** e
9810: 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64  xpression passed
9820: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
9830: 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f  gument. The seco
9840: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
9850: 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  .** mask contain
9860: 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58 20  ing EXPRDUP_XXX 
9870: 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
9880: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
9890: 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20 74  includes space t
98a0: 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  o create a copy 
98b0: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
98c0: 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64  ct.** itself and
98d0: 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66 65   the buffer refe
98e0: 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e  rred to by Expr.
98f0: 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79  u.zToken, if any
9900: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
9910: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c  XPRDUP_REDUCE fl
9920: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
9930: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
9940: 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70   includes .** sp
9950: 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65  ace to duplicate
9960: 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20   all Expr nodes 
9970: 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d  in the tree form
9980: 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74  ed by Expr.pLeft
9990: 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52   .** and Expr.pR
99a0: 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20 28  ight variables (
99b0: 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20  but not for any 
99c0: 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74  structures point
99d0: 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73  ed to or .** des
99e0: 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cended from the 
99f0: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20  Expr.x.pList or 
9a00: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76  Expr.x.pSelect v
9a10: 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74  ariables)..*/.st
9a20: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
9a30: 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  prSize(Expr *p, 
9a40: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
9a50: 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69  t nByte = 0;.  i
9a60: 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74  f( p ){.    nByt
9a70: 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64  e = dupedExprNod
9a80: 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  eSize(p, flags);
9a90: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 45  .    if( flags&E
9aa0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b  XPRDUP_REDUCE ){
9ab0: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
9ac0: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d  dupedExprSize(p-
9ad0: 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b  >pLeft, flags) +
9ae0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
9af0: 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29  ->pRight, flags)
9b00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9b10: 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f  turn nByte;.}../
9b20: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9b30: 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
9b40: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9b50: 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
9b60: 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69  f pzBuffer .** i
9b70: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
9b80: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73 73  *pzBuffer is ass
9b90: 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  umed to point to
9ba0: 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20   a buffer large 
9bb0: 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74  enough .** to st
9bc0: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20  ore the copy of 
9bd0: 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68  expression p, th
9be0: 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75  e copies of p->u
9bf0: 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61  .zToken.** (if a
9c00: 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20  pplicable), and 
9c10: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  the copies of th
9c20: 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  e p->pLeft and p
9c30: 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73 73  ->pRight express
9c40: 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  ions,.** if any.
9c50: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
9c60: 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  g, *pzBuffer is 
9c70: 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  set to the first
9c80: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a   byte past the.*
9c90: 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  * portion of the
9ca0: 20 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69   buffer copied i
9cb0: 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63  nto by this func
9cc0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
9cd0: 45 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71  Expr *exprDup(sq
9ce0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
9cf0: 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67 73  *p, int dupFlags
9d00: 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29  , u8 **pzBuffer)
9d10: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20  {.  Expr *pNew; 
9d20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
9d30: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
9d40: 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20    u8 *zAlloc;   
9d50: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
9d60: 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68 69  y space from whi
9d70: 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70 72  ch to build Expr
9d80: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32   object */.  u32
9d90: 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20 20   staticFlag;    
9da0: 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63 20     /* EP_Static 
9db0: 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62 74  if space not obt
9dc0: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
9dd0: 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  c */..  assert( 
9de0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
9df0: 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74  t( p );.  assert
9e00: 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c  ( dupFlags==0 ||
9e10: 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44   dupFlags==EXPRD
9e20: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 61  UP_REDUCE );.  a
9e30: 73 73 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d  ssert( pzBuffer=
9e40: 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d  =0 || dupFlags==
9e50: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
9e60: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
9e70: 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74  ut where to writ
9e80: 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73  e the new Expr s
9e90: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69  tructure. */.  i
9ea0: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
9eb0: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42     zAlloc = *pzB
9ec0: 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74 69  uffer;.    stati
9ed0: 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69  cFlag = EP_Stati
9ee0: 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
9ef0: 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  zAlloc = sqlite3
9f00: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
9f10: 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  , dupedExprSize(
9f20: 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a 20  p, dupFlags));. 
9f30: 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20     staticFlag = 
9f40: 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20  0;.  }.  pNew = 
9f50: 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a  (Expr *)zAlloc;.
9f60: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
9f70: 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69     /* Set nNewSi
9f80: 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61  ze to the size a
9f90: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
9fa0: 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
9fb0: 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20  ed to.    ** by 
9fc0: 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69  pNew. This is ei
9fd0: 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49  ther EXPR_FULLSI
9fe0: 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44  ZE, EXPR_REDUCED
9ff0: 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45  SIZE or.    ** E
a000: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
a010: 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74  E. nToken is set
a020: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
a030: 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64  f bytes consumed
a040: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63  .    ** by the c
a050: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
a060: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
a070: 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20  f any)..    */. 
a080: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
a090: 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20  d nStructSize = 
a0a0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
a0b0: 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29  ize(p, dupFlags)
a0c0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
a0d0: 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75  nNewSize = nStru
a0e0: 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a  ctSize & 0xfff;.
a0f0: 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a      int nToken;.
a100: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a110: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
a120: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
a130: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20  .zToken ){.     
a140: 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65   nToken = sqlite
a150: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
a160: 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20  Token) + 1;.    
a170: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f  }else{.      nTo
a180: 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ken = 0;.    }. 
a190: 20 20 20 69 66 28 20 64 75 70 46 6c 61 67 73 20     if( dupFlags 
a1a0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
a1b0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a1c0: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d  (p, EP_Reduced)=
a1d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  =0 );.      memc
a1e0: 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e  py(zAlloc, p, nN
a1f0: 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  ewSize);.    }el
a200: 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 53  se{.      u32 nS
a210: 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72 53  ize = (u32)exprS
a220: 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20 20  tructSize(p);.  
a230: 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f      memcpy(zAllo
a240: 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  c, p, nSize);.  
a250: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45 58      if( nSize<EX
a260: 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a  PR_FULLSIZE ){ .
a270: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
a280: 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30  zAlloc[nSize], 0
a290: 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d  , EXPR_FULLSIZE-
a2a0: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nSize);.      }.
a2b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
a2c0: 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64  t the EP_Reduced
a2d0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20  , EP_TokenOnly, 
a2e0: 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c  and EP_Static fl
a2f0: 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ags appropriatel
a300: 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  y. */.    pNew->
a310: 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65  flags &= ~(EP_Re
a320: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
a330: 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f  ly|EP_Static|EP_
a340: 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70  MemToken);.    p
a350: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53  New->flags |= nS
a360: 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f  tructSize & (EP_
a370: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a380: 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d  Only);.    pNew-
a390: 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63  >flags |= static
a3a0: 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  Flag;..    /* Co
a3b0: 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  py the p->u.zTok
a3c0: 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e  en string, if an
a3d0: 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54  y. */.    if( nT
a3e0: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 68  oken ){.      ch
a3f0: 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65  ar *zToken = pNe
a400: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
a410: 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65  har*)&zAlloc[nNe
a420: 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65  wSize];.      me
a430: 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e  mcpy(zToken, p->
a440: 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  u.zToken, nToken
a450: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
a460: 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c  ( 0==((p->flags|
a470: 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 28  pNew->flags) & (
a480: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
a490: 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20 20  Leaf)) ){.      
a4a0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
a4b0: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f  New->x.pSelect o
a4c0: 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20  r pNew->x.pList 
a4d0: 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20  member. */.     
a4e0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
a4f0: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
a500: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
a510: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
a520: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
a530: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  Dup(db, p->x.pSe
a540: 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29 3b  lect, dupFlags);
a550: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a560: 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c        pNew->x.pL
a570: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
a580: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
a590: 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61 67  x.pList, dupFlag
a5a0: 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
a5b0: 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69  }..    /* Fill i
a5c0: 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e  n pNew->pLeft an
a5d0: 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20  d pNew->pRight. 
a5e0: 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  */.    if( ExprH
a5f0: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
a600: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
a610: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 57 69 6e 46  okenOnly|EP_WinF
a620: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  unc) ){.      zA
a630: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a640: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a650: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a660: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a670: 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65  ty(pNew, EP_Toke
a680: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29  nOnly|EP_Leaf) )
a690: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a6a0: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a6b0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a6c0: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a6d0: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
a6e0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a6f0: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a700: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
a710: 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a  t = p->pRight ?.
a720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a730: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a740: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58  b, p->pRight, EX
a750: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a760: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a770: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
a780: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
a790: 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  NC.      if( Exp
a7a0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
a7b0: 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20  EP_WinFunc) ){. 
a7c0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70         pNew->y.p
a7d0: 57 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e  Win = sqlite3Win
a7e0: 64 6f 77 44 75 70 28 64 62 2c 20 70 4e 65 77 2c  dowDup(db, pNew,
a7f0: 20 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20   p->y.pWin);.   
a800: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
a810: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
a820: 77 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  w, EP_WinFunc) )
a830: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
a840: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
a850: 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20  WINDOWFUNC */.  
a860: 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72      if( pzBuffer
a870: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 42   ){.        *pzB
a880: 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a  uffer = zAlloc;.
a890: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
a8a0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  e{.      if( !Ex
a8b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
a8c0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
a8d0: 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20  _Leaf) ){.      
a8e0: 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d    if( pNew->op==
a8f0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
a900: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
a910: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70  ew->pLeft = p->p
a920: 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
a930: 61 73 73 65 72 74 28 20 70 2d 3e 69 43 6f 6c 75  assert( p->iColu
a940: 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  mn==0 || p->pRig
a950: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
a960: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
a970: 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d 3e 70  ight==0  || p->p
a980: 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66 74 20  Right==p->pLeft 
a990: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
a9a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
a9b0: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
a9c0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
a9d0: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
a9e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65     }.        pNe
a9f0: 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  w->pRight = sqli
aa00: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
aa10: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
aa20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
aa30: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
aa40: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
aa50: 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 65 70  nd return a deep
aa60: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62 6a   copy of the obj
aa70: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
aa80: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67  e second .** arg
aa90: 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d  ument. If an OOM
aaa0: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e   condition is en
aab0: 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20  countered, NULL 
aac0: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
aad0: 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  nd the db->mallo
aae0: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  cFailed flag set
aaf0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
ab00: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61  ITE_OMIT_CTE.sta
ab10: 74 69 63 20 57 69 74 68 20 2a 77 69 74 68 44 75  tic With *withDu
ab20: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  p(sqlite3 *db, W
ab30: 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68 20  ith *p){.  With 
ab40: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
ab50: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
ab60: 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20  3_int64 nByte = 
ab70: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a  sizeof(*p) + siz
ab80: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
ab90: 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20  p->nCte-1);.    
aba0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  pRet = sqlite3Db
abb0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
abc0: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
abd0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Ret ){.      int
abe0: 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   i;.      pRet->
abf0: 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a  nCte = p->nCte;.
ac00: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ac10: 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
ac20: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
ac30: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
ac40: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
ac50: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  , p->a[i].pSelec
ac60: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 0);.        p
ac70: 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20  Ret->a[i].pCols 
ac80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
ac90: 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  tDup(db, p->a[i]
aca0: 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20  .pCols, 0);.    
acb0: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a      pRet->a[i].z
acc0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
acd0: 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  StrDup(db, p->a[
ace0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
acf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
ad00: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
ad10: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74  lse.# define wit
ad20: 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64  hDup(x,y) 0.#end
ad30: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
ad40: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
ad50: 4e 43 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 61 74  NC./*.** The gat
ad60: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
ad70: 28 29 20 70 72 6f 63 65 64 75 72 65 20 61 6e 64  () procedure and
ad80: 20 69 74 73 20 68 65 6c 70 65 72 20 72 6f 75 74   its helper rout
ad90: 69 6e 65 0a 2a 2a 20 67 61 74 68 65 72 53 65 6c  ine.** gatherSel
ada0: 65 63 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62 61  ectWindowsCallba
adb0: 63 6b 28 29 20 61 72 65 20 75 73 65 64 20 74 6f  ck() are used to
adc0: 20 73 63 61 6e 20 61 6c 6c 20 74 68 65 20 65 78   scan all the ex
add0: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 6e 20  pressions.** an 
ade0: 61 20 6e 65 77 6c 79 20 64 75 70 6c 69 63 61 74  a newly duplicat
adf0: 65 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ed SELECT statem
ae00: 65 6e 74 20 61 6e 64 20 67 61 74 68 65 72 20 61  ent and gather a
ae10: 6c 6c 20 6f 66 20 74 68 65 20 57 69 6e 64 6f 77  ll of the Window
ae20: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 66 6f 75 6e  .** objects foun
ae30: 64 20 74 68 65 72 65 2c 20 61 73 73 65 6d 62 6c  d there, assembl
ae40: 69 6e 67 20 74 68 65 6d 20 6f 6e 74 6f 20 74 68  ing them onto th
ae50: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 61 74  e linked list at
ae60: 20 53 65 6c 65 63 74 2d 3e 70 57 69 6e 2e 0a 2a   Select->pWin..*
ae70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 61 74  /.static int gat
ae80: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
ae90: 43 61 6c 6c 62 61 63 6b 28 57 61 6c 6b 65 72 20  Callback(Walker 
aea0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
aeb0: 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
aec0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
aed0: 54 49 4f 4e 20 26 26 20 45 78 70 72 48 61 73 50  TION && ExprHasP
aee0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
aef0: 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20  P_WinFunc) ){.  
af00: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
af10: 3e 79 2e 70 57 69 6e 20 29 3b 0a 20 20 20 20 61  >y.pWin );.    a
af20: 73 73 65 72 74 28 20 49 73 57 69 6e 64 6f 77 46  ssert( IsWindowF
af30: 75 6e 63 28 70 45 78 70 72 29 20 29 3b 0a 20 20  unc(pExpr) );.  
af40: 20 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d    pExpr->y.pWin-
af50: 3e 70 4e 65 78 74 57 69 6e 20 3d 20 70 57 61 6c  >pNextWin = pWal
af60: 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 2d 3e  ker->u.pSelect->
af70: 70 57 69 6e 3b 0a 20 20 20 20 70 57 61 6c 6b 65  pWin;.    pWalke
af80: 72 2d 3e 75 2e 70 53 65 6c 65 63 74 2d 3e 70 57  r->u.pSelect->pW
af90: 69 6e 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 57  in = pExpr->y.pW
afa0: 69 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  in;.  }.  return
afb0: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
afc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 61 74 68  .static int gath
afd0: 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 53  erSelectWindowsS
afe0: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 28 57 61  electCallback(Wa
aff0: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
b000: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 72 65 74  elect *p){.  ret
b010: 75 72 6e 20 70 3d 3d 70 57 61 6c 6b 65 72 2d 3e  urn p==pWalker->
b020: 75 2e 70 53 65 6c 65 63 74 20 3f 20 57 52 43 5f  u.pSelect ? WRC_
b030: 43 6f 6e 74 69 6e 75 65 20 3a 20 57 52 43 5f 50  Continue : WRC_P
b040: 72 75 6e 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76  rune;.}.static v
b050: 6f 69 64 20 67 61 74 68 65 72 53 65 6c 65 63 74  oid gatherSelect
b060: 57 69 6e 64 6f 77 73 28 53 65 6c 65 63 74 20 2a  Windows(Select *
b070: 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  p){.  Walker w;.
b080: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
b090: 6b 20 3d 20 67 61 74 68 65 72 53 65 6c 65 63 74  k = gatherSelect
b0a0: 57 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63 6b 3b  WindowsCallback;
b0b0: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
b0c0: 62 61 63 6b 20 3d 20 67 61 74 68 65 72 53 65 6c  back = gatherSel
b0d0: 65 63 74 57 69 6e 64 6f 77 73 53 65 6c 65 63 74  ectWindowsSelect
b0e0: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 77 2e 78 53  Callback;.  w.xS
b0f0: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
b100: 20 30 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d   0;.  w.pParse =
b110: 20 30 3b 0a 20 20 77 2e 75 2e 70 53 65 6c 65 63   0;.  w.u.pSelec
b120: 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
b130: 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
b140: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  );.}.#endif.../*
b150: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
b160: 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69  g group of routi
b170: 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f  nes make deep co
b180: 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69  pies of expressi
b190: 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69  ons,.** expressi
b1a0: 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73  on lists, ID lis
b1b0: 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73  ts, and select s
b1c0: 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20  tatements.  The 
b1d0: 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65  copies can.** be
b1e0: 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69   deleted (by bei
b1f0: 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ng passed to the
b200: 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e  ir respective ..
b210: 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e  .Delete() routin
b220: 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65  es).** without e
b230: 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69  ffecting the ori
b240: 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ginals..**.** Th
b250: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
b260: 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63  t, ID, and sourc
b270: 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62  e lists return b
b280: 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  y sqlite3ExprLis
b290: 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74  tDup(),.** sqlit
b2a0: 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61  e3IdListDup(), a
b2b0: 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  nd sqlite3SrcLis
b2c0: 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62  tDup() can not b
b2d0: 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64  e further expand
b2e0: 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71  ed .** by subseq
b2f0: 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
b300: 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28  lite*ListAppend(
b310: 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a  ) routines..**.*
b320: 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61  * Any tables tha
b330: 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69  t the SrcList mi
b340: 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65  ght point to are
b350: 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e   not duplicated.
b360: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
b370: 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61   parameter conta
b380: 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f  ins a combinatio
b390: 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50  n of the EXPRDUP
b3a0: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49  _XXX flags..** I
b3b0: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
b3c0: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
b3d0: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63  , then the struc
b3e0: 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73  ture returned is
b3f0: 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20   a.** truncated 
b400: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75  version of the u
b410: 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74  sual Expr struct
b420: 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ure that will be
b430: 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61   stored as.** pa
b440: 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  rt of the in-mem
b450: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
b460: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
b470: 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78  se schema..*/.Ex
b480: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44  pr *sqlite3ExprD
b490: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
b4a0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
b4b0: 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66  gs){.  assert( f
b4c0: 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
b4d0: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
b4e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f   );.  return p ?
b4f0: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20   exprDup(db, p, 
b500: 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d  flags, 0) : 0;.}
b510: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
b520: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71  e3ExprListDup(sq
b530: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
b540: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
b550: 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  s){.  ExprList *
b560: 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45  pNew;.  struct E
b570: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
b580: 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a  tem, *pOldItem;.
b590: 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20    int i;.  Expr 
b5a0: 2a 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c  *pPriorSelectCol
b5b0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
b5c0: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
b5d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b5e0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
b5f0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
b600: 2c 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  , sqlite3DbMallo
b610: 63 53 69 7a 65 28 64 62 2c 20 70 29 29 3b 0a 20  cSize(db, p));. 
b620: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
b630: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
b640: 3e 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78 70  >nExpr = p->nExp
b650: 72 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e 65  r;.  pItem = pNe
b660: 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65 6d  w->a;.  pOldItem
b670: 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69   = p->a;.  for(i
b680: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
b690: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f  i++, pItem++, pO
b6a0: 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  ldItem++){.    E
b6b0: 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20  xpr *pOldExpr = 
b6c0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b  pOldItem->pExpr;
b6d0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
b6e0: 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  xpr;.    pItem->
b6f0: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
b700: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45  xprDup(db, pOldE
b710: 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  xpr, flags);.   
b720: 20 69 66 28 20 70 4f 6c 64 45 78 70 72 20 0a 20   if( pOldExpr . 
b730: 20 20 20 20 26 26 20 70 4f 6c 64 45 78 70 72 2d      && pOldExpr-
b740: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op==TK_SELECT_C
b750: 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 28 70  OLUMN.     && (p
b760: 4e 65 77 45 78 70 72 20 3d 20 70 49 74 65 6d 2d  NewExpr = pItem-
b770: 3e 70 45 78 70 72 29 21 3d 30 20 0a 20 20 20 20  >pExpr)!=0 .    
b780: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b790: 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75   pNewExpr->iColu
b7a0: 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a  mn==0 || i>0 );.
b7b0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 45 78        if( pNewEx
b7c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29  pr->iColumn==0 )
b7d0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
b7e0: 28 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66  ( pOldExpr->pLef
b7f0: 74 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69  t==pOldExpr->pRi
b800: 67 68 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ght );.        p
b810: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d  PriorSelectCol =
b820: 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74   pNewExpr->pLeft
b830: 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 52 69   = pNewExpr->pRi
b840: 67 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ght;.      }else
b850: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
b860: 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ( i>0 );.       
b870: 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 5b 2d   assert( pItem[-
b880: 31 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  1].pExpr!=0 );. 
b890: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b8a0: 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  NewExpr->iColumn
b8b0: 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70  ==pItem[-1].pExp
b8c0: 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a  r->iColumn+1 );.
b8d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b8e0: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d  pPriorSelectCol=
b8f0: 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72  =pItem[-1].pExpr
b900: 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ->pLeft );.     
b910: 20 20 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65     pNewExpr->pLe
b920: 66 74 20 3d 20 70 50 72 69 6f 72 53 65 6c 65 63  ft = pPriorSelec
b930: 74 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tCol;.      }.  
b940: 20 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a    }.    pItem->z
b950: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
b960: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
b970: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
b980: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20   pItem->zSpan = 
b990: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
b9a0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53  db, pOldItem->zS
b9b0: 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  pan);.    pItem-
b9c0: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c  >sortOrder = pOl
b9d0: 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  dItem->sortOrder
b9e0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e  ;.    pItem->don
b9f0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d  e = 0;.    pItem
ba00: 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70  ->bSpanIsTab = p
ba10: 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73  OldItem->bSpanIs
ba20: 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  Tab;.    pItem->
ba30: 62 53 6f 72 74 65 72 52 65 66 20 3d 20 70 4f 6c  bSorterRef = pOl
ba40: 64 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65  dItem->bSorterRe
ba50: 66 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20  f;.    pItem->u 
ba60: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20  = pOldItem->u;. 
ba70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
ba80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75  ;.}../*.** If cu
ba90: 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c  rsors, triggers,
baa0: 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75   views and subqu
bab0: 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d  eries are all om
bac0: 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  itted from.** th
bad0: 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f  e build, then no
bae0: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
baf0: 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78  ing routines, ex
bb00: 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c  cept for .** sql
bb10: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c  ite3SelectDup(),
bb20: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
bb30: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
bb40: 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a  () is sometimes.
bb50: 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  ** called with a
bb60: 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a   NULL argument..
bb70: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
bb80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
bb90: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
bba0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
bbb0: 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65  R) \. || !define
bbc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
bbd0: 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20  BQUERY).SrcList 
bbe0: 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44  *sqlite3SrcListD
bbf0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
bc00: 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  SrcList *p, int 
bc10: 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73  flags){.  SrcLis
bc20: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
bc30: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
bc40: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
bc50: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
bc60: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65  eturn 0;.  nByte
bc70: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20   = sizeof(*p) + 
bc80: 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a  (p->nSrc>0 ? siz
bc90: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
bca0: 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b  p->nSrc-1) : 0);
bcb0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
bcc0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
bcd0: 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
bce0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
bcf0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  rn 0;.  pNew->nS
bd00: 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  rc = pNew->nAllo
bd10: 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66  c = p->nSrc;.  f
bd20: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72  or(i=0; i<p->nSr
bd30: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
bd40: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
bd50: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
bd60: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
bd70: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
bd80: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
bd90: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c  ->a[i];.    Tabl
bda0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65  e *pTab;.    pNe
bdb0: 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d  wItem->pSchema =
bdc0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65   pOldItem->pSche
bdd0: 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ma;.    pNewItem
bde0: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
bdf0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
be00: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74  , pOldItem->zDat
be10: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77  abase);.    pNew
be20: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
be30: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
be40: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
be50: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
be60: 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
be70: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
be80: 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  OldItem->zAlias)
be90: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
bea0: 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66  fg = pOldItem->f
beb0: 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  g;.    pNewItem-
bec0: 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49  >iCursor = pOldI
bed0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
bee0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72    pNewItem->addr
bef0: 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74  FillSub = pOldIt
bf00: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b  em->addrFillSub;
bf10: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72  .    pNewItem->r
bf20: 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49  egReturn = pOldI
bf30: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
bf40: 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d      if( pNewItem
bf50: 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
bf60: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74   ){.      pNewIt
bf70: 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
bf80: 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  y = sqlite3DbStr
bf90: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
bfa0: 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29  ->u1.zIndexedBy)
bfb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
bfc0: 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d  Item->pIBIndex =
bfd0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e   pOldItem->pIBIn
bfe0: 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  dex;.    if( pNe
bff0: 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  wItem->fg.isTabF
c000: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  unc ){.      pNe
c010: 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  wItem->u1.pFuncA
c020: 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  rg = .          
c030: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
c040: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
c050: 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c  >u1.pFuncArg, fl
c060: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
c070: 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d  pTab = pNewItem-
c080: 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  >pTab = pOldItem
c090: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
c0a0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54  pTab ){.      pT
c0b0: 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
c0c0: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65     }.    pNewIte
c0d0: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
c0e0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
c0f0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c  , pOldItem->pSel
c100: 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ect, flags);.   
c110: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d   pNewItem->pOn =
c120: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
c130: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f  db, pOldItem->pO
c140: 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  n, flags);.    p
c150: 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20  NewItem->pUsing 
c160: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  = sqlite3IdListD
c170: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
c180: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e  >pUsing);.    pN
c190: 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  ewItem->colUsed 
c1a0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55  = pOldItem->colU
c1b0: 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sed;.  }.  retur
c1c0: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
c1d0: 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   *sqlite3IdListD
c1e0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
c1f0: 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64  IdList *p){.  Id
c200: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
c210: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64  t i;.  assert( d
c220: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
c230: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
c240: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
c250: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
c260: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
c270: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
c280: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
c290: 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64  ew->nId = p->nId
c2a0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
c2b0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
c2c0: 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69  NN(db, p->nId*si
c2d0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
c2e0: 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d  .  if( pNew->a==
c2f0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c300: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e 65  DbFreeNN(db, pNe
c310: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
c320: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20  ;.  }.  /* Note 
c330: 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65  that because the
c340: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
c350: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61  ocation for p->a
c360: 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  [] is not.  ** n
c370: 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77  ecessarily a pow
c380: 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74  er of two, sqlit
c390: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29  e3IdListAppend()
c3a0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
c3b0: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ed.  ** on the d
c3c0: 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64  uplicate created
c3d0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
c3e0: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
c3f0: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
c400: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
c410: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
c420: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
c430: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
c440: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
c450: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
c460: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
c470: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
c480: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c490: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
c4a0: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
c4b0: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
c4c0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
c4d0: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
c4e0: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
c4f0: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
c500: 70 44 75 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  pDup, int flags)
c510: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 65 74  {.  Select *pRet
c520: 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a   = 0;.  Select *
c530: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53 65 6c  pNext = 0;.  Sel
c540: 65 63 74 20 2a 2a 70 70 20 3d 20 26 70 52 65 74  ect **pp = &pRet
c550: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 0a  ;.  Select *p;..
c560: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
c570: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75 70 3b  );.  for(p=pDup;
c580: 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29   p; p=p->pPrior)
c590: 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e  {.    Select *pN
c5a0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
c5b0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
c5c0: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 20  zeof(*p) );.    
c5d0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 62 72  if( pNew==0 ) br
c5e0: 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  eak;.    pNew->p
c5f0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
c600: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
c610: 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29  ->pEList, flags)
c620: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 72 63  ;.    pNew->pSrc
c630: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
c640: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63  tDup(db, p->pSrc
c650: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c660: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ew->pWhere = sql
c670: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
c680: 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73  p->pWhere, flags
c690: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72  );.    pNew->pGr
c6a0: 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
c6b0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
c6c0: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67  ->pGroupBy, flag
c6d0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48  s);.    pNew->pH
c6e0: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
c6f0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48  xprDup(db, p->pH
c700: 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20  aving, flags);. 
c710: 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42     pNew->pOrderB
c720: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
c730: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  istDup(db, p->pO
c740: 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a  rderBy, flags);.
c750: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70      pNew->op = p
c760: 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ->op;.    pNew->
c770: 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20  pNext = pNext;. 
c780: 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20     pNew->pPrior 
c790: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  = 0;.    pNew->p
c7a0: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
c7b0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
c7c0: 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  imit, flags);.  
c7d0: 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d    pNew->iLimit =
c7e0: 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f   0;.    pNew->iO
c7f0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
c800: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
c810: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53  p->selFlags & ~S
c820: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
c830: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  .    pNew->addrO
c840: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
c850: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  .    pNew->addrO
c860: 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b  penEphm[1] = -1;
c870: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65  .    pNew->nSele
c880: 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65  ctRow = p->nSele
c890: 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d  ctRow;.    pNew-
c8a0: 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70  >pWith = withDup
c8b0: 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a  (db, p->pWith);.
c8c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c8d0: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
c8e0: 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20     pNew->pWin = 
c8f0: 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69  0;.    pNew->pWi
c900: 6e 44 65 66 6e 20 3d 20 73 71 6c 69 74 65 33 57  nDefn = sqlite3W
c910: 69 6e 64 6f 77 4c 69 73 74 44 75 70 28 64 62 2c  indowListDup(db,
c920: 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20   p->pWinDefn);. 
c930: 20 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 29     if( p->pWin )
c940: 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e   gatherSelectWin
c950: 64 6f 77 73 28 70 4e 65 77 29 3b 0a 23 65 6e 64  dows(pNew);.#end
c960: 69 66 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c  if.    pNew->sel
c970: 49 64 20 3d 20 70 2d 3e 73 65 6c 49 64 3b 0a 20  Id = p->selId;. 
c980: 20 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20     *pp = pNew;. 
c990: 20 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70     pp = &pNew->p
c9a0: 50 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74  Prior;.    pNext
c9b0: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20   = pNew;.  }..  
c9c0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
c9d0: 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c  else.Select *sql
c9e0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
c9f0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
ca00: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
ca10: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
ca20: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   );.  return 0;.
ca30: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
ca40: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
ca50: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
ca60: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
ca70: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
ca80: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
ca90: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
caa0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
cab0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  n list..**.** Th
cac0: 65 20 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74  e pList argument
cad0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
cae0: 4e 55 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65  NULL or a pointe
caf0: 72 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74  r to an ExprList
cb00: 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  .** obtained fro
cb10: 6d 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  m a prior call t
cb20: 6f 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  o sqlite3ExprLis
cb30: 74 41 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73  tAppend().  This
cb40: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20   routine.** may 
cb50: 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68  not be used with
cb60: 20 61 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74   an ExprList obt
cb70: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
cb80: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e  e3ExprListDup().
cb90: 0a 2a 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69  .** Reason:  Thi
cba0: 73 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65  s routine assume
cbb0: 73 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  s that the numbe
cbc0: 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c  r of slots in pL
cbd0: 69 73 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61  ist->a[].** is a
cbe0: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20   power of two.  
cbf0: 54 68 61 74 20 69 73 20 74 72 75 65 20 66 6f 72  That is true for
cc00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
cc10: 41 70 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73  Append() returns
cc20: 0a 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e  .** but is not n
cc30: 65 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 20  ecessarily true 
cc40: 66 72 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20  from the return 
cc50: 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33  value of sqlite3
cc60: 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a  ExprListDup()..*
cc70: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
cc80: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
cc90: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e  r occurs, the en
cca0: 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65  tire list is fre
ccb0: 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69  ed and.** NULL i
ccc0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
ccd0: 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75  non-NULL is retu
cce0: 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  rned, then it is
ccf0: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
cd00: 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hat the new entr
cd10: 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  y was successful
cd20: 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a  ly appended..*/.
cd30: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
cd40: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
cd50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
cd60: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
cd70: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
cd80: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
cd90: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
cda0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
cdb0: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
cdc0: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
cdd0: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
cde0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
cdf0: 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20  to be appended. 
ce00: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
ce10: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
ce20: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
ce30: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
ce40: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
ce50: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
ce60: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
ce70: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
ce80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
ce90: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
cea0: 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20  ExprList) );.   
ceb0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
cec0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
ced0: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
cee0: 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a  ist->nExpr = 0;.
cef0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69    }else if( (pLi
cf00: 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69  st->nExpr & (pLi
cf10: 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30  st->nExpr-1))==0
cf20: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
cf30: 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77   *pNew;.    pNew
cf40: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
cf50: 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a  loc(db, pList, .
cf60: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
cf70: 2a 70 4c 69 73 74 29 2b 28 32 2a 28 73 71 6c 69  *pList)+(2*(sqli
cf80: 74 65 33 5f 69 6e 74 36 34 29 70 4c 69 73 74 2d  te3_int64)pList-
cf90: 3e 6e 45 78 70 72 2d 31 29 2a 73 69 7a 65 6f 66  >nExpr-1)*sizeof
cfa0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
cfb0: 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
cfc0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
cfd0: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
cfe0: 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pList = pNew;.  
cff0: 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
d000: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
d010: 70 72 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28  pr++];.  assert(
d020: 20 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74   offsetof(struct
d030: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a   ExprList_item,z
d040: 4e 61 6d 65 29 3d 3d 73 69 7a 65 6f 66 28 70 49  Name)==sizeof(pI
d050: 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 3b 0a 20  tem->pExpr) );. 
d060: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f   assert( offseto
d070: 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69 73  f(struct ExprLis
d080: 74 5f 69 74 65 6d 2c 70 45 78 70 72 29 3d 3d 30  t_item,pExpr)==0
d090: 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 49   );.  memset(&pI
d0a0: 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69 7a  tem->zName,0,siz
d0b0: 65 6f 66 28 2a 70 49 74 65 6d 29 2d 6f 66 66 73  eof(*pItem)-offs
d0c0: 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70 72  etof(struct Expr
d0d0: 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29  List_item,zName)
d0e0: 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  );.  pItem->pExp
d0f0: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 72 65 74  r = pExpr;.  ret
d100: 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d  urn pList;..no_m
d110: 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76  em:     .  /* Av
d120: 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f  oid leaking memo
d130: 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73  ry if malloc has
d140: 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71   failed. */.  sq
d150: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
d160: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71  db, pExpr);.  sq
d170: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
d180: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
d190: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
d1a0: 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e  *.** pColumns an
d1b0: 64 20 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76  d pExpr form a v
d1c0: 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74  ector assignment
d1d0: 20 77 68 69 63 68 20 69 73 20 70 61 72 74 20 6f   which is part o
d1e0: 66 20 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61  f the SET.** cla
d1f0: 75 73 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45  use of an UPDATE
d200: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b   statement.  Lik
d210: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
d220: 20 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28       (a,b,c) = (
d230: 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72  expr1,expr2,expr
d240: 33 29 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c  3).** Or:    (a,
d250: 62 2c 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78  b,c) = (SELECT x
d260: 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a  ,y,z FROM ....).
d270: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74  **.** For each t
d280: 65 72 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f  erm of the vecto
d290: 72 20 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70  r assignment, ap
d2a0: 70 65 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73  pend new entries
d2b0: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   to the.** expre
d2c0: 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74  ssion list pList
d2d0: 2e 20 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f  .  In the case o
d2e0: 66 20 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20  f a subquery on 
d2f0: 74 68 65 20 52 48 53 2c 20 61 70 70 65 6e 64 0a  the RHS, append.
d300: 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  ** TK_SELECT_COL
d310: 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  UMN expressions.
d320: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
d330: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
d340: 65 6e 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72  endVector(.  Par
d350: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d360: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
d370: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
d380: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
d390: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
d3a0: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
d3b0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
d3c0: 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d    IdList *pColum
d3d0: 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ns,      /* List
d3e0: 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53   of names of LHS
d3f0: 20 6f 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65   of the assignme
d400: 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  nt */.  Expr *pE
d410: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
d420: 2a 20 56 65 63 74 6f 72 20 65 78 70 72 65 73 73  * Vector express
d430: 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ion to be append
d440: 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  ed. Might be NUL
d450: 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  L */.){.  sqlite
d460: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d470: 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  db;.  int n;.  i
d480: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72  nt i;.  int iFir
d490: 73 74 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69  st = pList ? pLi
d4a0: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  st->nExpr : 0;. 
d4b0: 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e   /* pColumns can
d4c0: 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75   only be NULL du
d4d0: 65 20 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20  e to an OOM but 
d4e0: 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73  an OOM will caus
d4f0: 65 20 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70  e an.  ** exit p
d500: 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
d510: 74 69 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b  tine being invok
d520: 65 64 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  ed */.  if( NEVE
d530: 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29  R(pColumns==0) )
d540: 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70   goto vector_app
d550: 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28  end_error;.  if(
d560: 20 70 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f   pExpr==0 ) goto
d570: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
d580: 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  rror;..  /* If t
d590: 68 65 20 52 48 53 20 69 73 20 61 20 76 65 63 74  he RHS is a vect
d5a0: 6f 72 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  or, then we can 
d5b0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 63 68 65 63  immediately chec
d5c0: 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 0a 20  k to see that . 
d5d0: 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20   ** the size of 
d5e0: 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20  the RHS and LHS 
d5f0: 6d 61 74 63 68 2e 20 20 42 75 74 20 69 66 20 74  match.  But if t
d600: 68 65 20 52 48 53 20 69 73 20 61 20 53 45 4c 45  he RHS is a SELE
d610: 43 54 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61  CT, .  ** wildca
d620: 72 64 73 20 28 22 2a 22 29 20 69 6e 20 74 68 65  rds ("*") in the
d630: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
d640: 68 65 20 53 45 4c 45 43 54 20 6d 75 73 74 20 62  he SELECT must b
d650: 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72  e expanded befor
d660: 65 0a 20 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f  e.  ** we can do
d670: 20 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 2c   the size check,
d680: 20 73 6f 20 64 65 66 65 72 20 74 68 65 20 73 69   so defer the si
d690: 7a 65 20 63 68 65 63 6b 20 75 6e 74 69 6c 20 63  ze check until c
d6a0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a  ode generation..
d6b0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
d6c0: 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op!=TK_SELECT 
d6d0: 26 26 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64  && pColumns->nId
d6e0: 21 3d 28 6e 3d 73 71 6c 69 74 65 33 45 78 70 72  !=(n=sqlite3Expr
d6f0: 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
d700: 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
d710: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d720: 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73  , "%d columns as
d730: 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73  signed %d values
d740: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
d750: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d         pColumns-
d760: 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f  >nId, n);.    go
d770: 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  to vector_append
d780: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66  _error;.  }..  f
d790: 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d  or(i=0; i<pColum
d7a0: 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  ns->nId; i++){. 
d7b0: 20 20 20 45 78 70 72 20 2a 70 53 75 62 45 78 70     Expr *pSubExp
d7c0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46  r = sqlite3ExprF
d7d0: 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50  orVectorField(pP
d7e0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b  arse, pExpr, i);
d7f0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
d800: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
d810: 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  nd(pParse, pList
d820: 2c 20 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20  , pSubExpr);.   
d830: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
d840: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
d850: 74 2d 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74  t->nExpr==iFirst
d860: 2b 69 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c  +i+1 );.      pL
d870: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
d880: 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70  xpr-1].zName = p
d890: 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e  Columns->a[i].zN
d8a0: 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75  ame;.      pColu
d8b0: 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  mns->a[i].zName 
d8c0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
d8d0: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
d8e0: 63 46 61 69 6c 65 64 20 26 26 20 70 45 78 70 72  cFailed && pExpr
d8f0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
d900: 26 26 20 41 4c 57 41 59 53 28 70 4c 69 73 74 21  && ALWAYS(pList!
d910: 3d 30 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20  =0) ){.    Expr 
d920: 2a 70 46 69 72 73 74 20 3d 20 70 4c 69 73 74 2d  *pFirst = pList-
d930: 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72  >a[iFirst].pExpr
d940: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
d950: 69 72 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  irst!=0 );.    a
d960: 73 73 65 72 74 28 20 70 46 69 72 73 74 2d 3e 6f  ssert( pFirst->o
d970: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
d980: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20 20  UMN );.     .   
d990: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 53 45   /* Store the SE
d9a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
d9b0: 6e 20 70 52 69 67 68 74 20 73 6f 20 69 74 20 77  n pRight so it w
d9c0: 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77  ill be deleted w
d9d0: 68 65 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  hen.    ** sqlit
d9e0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
d9f0: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a  () is called */.
da00: 20 20 20 20 70 46 69 72 73 74 2d 3e 70 52 69 67      pFirst->pRig
da10: 68 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  ht = pExpr;.    
da20: 70 45 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20  pExpr = 0;..    
da30: 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  /* Remember the 
da40: 73 69 7a 65 20 6f 66 20 74 68 65 20 4c 48 53 20  size of the LHS 
da50: 69 6e 20 69 54 61 62 6c 65 20 73 6f 20 74 68 61  in iTable so tha
da60: 74 20 77 65 20 63 61 6e 20 63 68 65 63 6b 20 74  t we can check t
da70: 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  hat.    ** the R
da80: 48 53 20 61 6e 64 20 4c 48 53 20 73 69 7a 65 73  HS and LHS sizes
da90: 20 6d 61 74 63 68 20 64 75 72 69 6e 67 20 63 6f   match during co
daa0: 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a  de generation. *
dab0: 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 69 54  /.    pFirst->iT
dac0: 61 62 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d  able = pColumns-
dad0: 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f  >nId;.  }..vecto
dae0: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a  r_append_error:.
daf0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 55 6e 6d    sqlite3ExprUnm
db00: 61 70 41 6e 64 44 65 6c 65 74 65 28 70 50 61 72  apAndDelete(pPar
db10: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71  se, pExpr);.  sq
db20: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
db30: 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b  e(db, pColumns);
db40: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
db50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
db60: 65 20 73 6f 72 74 20 6f 72 64 65 72 20 66 6f 72  e sort order for
db70: 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e   the last elemen
db80: 74 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 45  t on the given E
db90: 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  xprList..*/.void
dba0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
dbb0: 53 65 74 53 6f 72 74 4f 72 64 65 72 28 45 78 70  SetSortOrder(Exp
dbc0: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 69 53  rList *p, int iS
dbd0: 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20 69 66 28  ortOrder){.  if(
dbe0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
dbf0: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
dc00: 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30 20  _SO_UNDEFINED<0 
dc10: 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  && SQLITE_SO_ASC
dc20: 3e 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f  >=0 && SQLITE_SO
dc30: 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73 73  _DESC>0 );.  ass
dc40: 65 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30 20  ert( p->nExpr>0 
dc50: 29 3b 0a 20 20 69 66 28 20 69 53 6f 72 74 4f 72  );.  if( iSortOr
dc60: 64 65 72 3c 30 20 29 7b 0a 20 20 20 20 61 73 73  der<0 ){.    ass
dc70: 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78  ert( p->a[p->nEx
dc80: 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 3d  pr-1].sortOrder=
dc90: 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29  =SQLITE_SO_ASC )
dca0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
dcb0: 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70  }.  p->a[p->nExp
dcc0: 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  r-1].sortOrder =
dcd0: 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65 72 3b   (u8)iSortOrder;
dce0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
dcf0: 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a  e ExprList.a[].z
dd00: 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20  Name element of 
dd10: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
dd20: 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20  y added item.** 
dd30: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
dd40: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  n list..**.** pL
dd50: 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ist might be NUL
dd60: 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f  L following an O
dd70: 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70  OM error.  But p
dd80: 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  Name should neve
dd90: 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49  r be.** NULL.  I
dda0: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
ddb0: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65  ation fails, the
ddc0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
ddd0: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a  locFailed flag.*
dde0: 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  * is set..*/.voi
ddf0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
de00: 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73  tSetName(.  Pars
de10: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
de20: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
de30: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
de40: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
de50: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
de60: 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20  hich to add the 
de70: 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  span. */.  Token
de80: 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *pName,        
de90: 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65     /* Name to be
dea0: 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   added */.  int 
deb0: 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20  dequote         
dec0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63      /* True to c
ded0: 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f  ause the name to
dee0: 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a   be dequoted */.
def0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  ){.  assert( pLi
df00: 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  st!=0 || pParse-
df10: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
df20: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  d!=0 );.  if( pL
df30: 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ist ){.    struc
df40: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
df50: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65  *pItem;.    asse
df60: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
df70: 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20  >0 );.    pItem 
df80: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
df90: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
dfa0: 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
dfb0: 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20  zName==0 );.    
dfc0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
dfd0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
dfe0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
dff0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
e000: 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65  .    if( dequote
e010: 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74   ) sqlite3Dequot
e020: 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  e(pItem->zName);
e030: 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  .    if( IN_RENA
e040: 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
e050: 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
e060: 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c  TokenMap(pParse,
e070: 20 28 76 6f 69 64 2a 29 70 49 74 65 6d 2d 3e 7a   (void*)pItem->z
e080: 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  Name, pName);.  
e090: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
e0a0: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
e0b0: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d  t.a[].zSpan elem
e0c0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
e0d0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
e0e0: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
e0f0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
e100: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
e110: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
e120: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
e130: 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75    But pSpan shou
e140: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
e150: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
e160: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
e170: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
e180: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e190: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
e1a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e1b0: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
e1c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e1d0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
e1e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
e1f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
e200: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
e210: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
e220: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
e230: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
e240: 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 53 74 61  tart,     /* Sta
e250: 72 74 20 6f 66 20 74 68 65 20 73 70 61 6e 20 2a  rt of the span *
e260: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
e270: 7a 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20 45  zEnd        /* E
e280: 6e 64 20 6f 66 20 74 68 65 20 73 70 61 6e 20 2a  nd of the span *
e290: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
e2a0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
e2b0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
e2c0: 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
e2d0: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
e2e0: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
e2f0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
e300: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
e310: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
e320: 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73  nExpr-1];.    as
e330: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
e340: 70 72 3e 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  pr>0 );.    sqli
e350: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
e360: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20  tem->zSpan);.   
e370: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20   pItem->zSpan = 
e380: 73 71 6c 69 74 65 33 44 62 53 70 61 6e 44 75 70  sqlite3DbSpanDup
e390: 28 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e  (db, zStart, zEn
e3a0: 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  d);.  }.}../*.**
e3b0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
e3c0: 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63  on list pEList c
e3d0: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61  ontains more tha
e3e0: 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74  n iLimit element
e3f0: 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  s,.** leave an e
e400: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
e410: 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  pParse..*/.void 
e420: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
e430: 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61  heckLength(.  Pa
e440: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45  rse *pParse,.  E
e450: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
e460: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e470: 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20  Object.){.  int 
e480: 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  mx = pParse->db-
e490: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
e4a0: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20  IMIT_COLUMN];.  
e4b0: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
e4c0: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
e4d0: 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63  r==mx );.  testc
e4e0: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
e4f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
e500: 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69  +1 );.  if( pELi
e510: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
e520: 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71  xpr>mx ){.    sq
e530: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e540: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
e550: 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20  columns in %s", 
e560: 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a  zObject);.  }.}.
e570: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
e580: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
e590: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  on list..*/.stat
e5a0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
e5b0: 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73 74  NE void exprList
e5c0: 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33  DeleteNN(sqlite3
e5d0: 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a   *db, ExprList *
e5e0: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 20  pList){.  int i 
e5f0: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
e600: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
e610: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
e620: 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 61 73 73   pList->a;.  ass
e630: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
e640: 72 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  r>0 );.  do{.   
e650: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
e660: 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45  te(db, pItem->pE
e670: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
e680: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
e690: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
e6a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e6b0: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
e6c0: 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 7d      pItem++;.  }
e6d0: 77 68 69 6c 65 28 20 2d 2d 69 3e 30 20 29 3b 0a  while( --i>0 );.
e6e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
e6f0: 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  N(db, pList);.}.
e700: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
e710: 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
e720: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
e730: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20   *pList){.  if( 
e740: 70 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73 74  pList ) exprList
e750: 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69  DeleteNN(db, pLi
e760: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
e770: 74 75 72 6e 20 74 68 65 20 62 69 74 77 69 73 65  turn the bitwise
e780: 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e  -OR of all Expr.
e790: 66 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e 20  flags fields in 
e7a0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70  the given.** Exp
e7b0: 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71  rList..*/.u32 sq
e7c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
e7d0: 67 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69 73  gs(const ExprLis
e7e0: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
e7f0: 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b   i;.  u32 m = 0;
e800: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
e810: 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
e820: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
e830: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 45 78 70  ; i++){.     Exp
e840: 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74  r *pExpr = pList
e850: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
e860: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
e870: 21 3d 30 20 29 3b 0a 20 20 20 20 20 6d 20 7c 3d  !=0 );.     m |=
e880: 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20   pExpr->flags;. 
e890: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d   }.  return m;.}
e8a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
e8b0: 61 20 53 45 4c 45 43 54 2d 6e 6f 64 65 20 63 61  a SELECT-node ca
e8c0: 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 65  llback for the e
e8d0: 78 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72  xpression walker
e8e0: 20 74 68 61 74 0a 2a 2a 20 61 6c 77 61 79 73 20   that.** always 
e8f0: 22 66 61 69 6c 73 22 2e 20 20 42 79 20 22 66 61  "fails".  By "fa
e900: 69 6c 22 20 69 6e 20 74 68 69 73 20 63 61 73 65  il" in this case
e910: 2c 20 77 65 20 6d 65 61 6e 20 73 65 74 0a 2a 2a  , we mean set.**
e920: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
e930: 74 6f 20 7a 65 72 6f 20 61 6e 64 20 61 62 6f 72  to zero and abor
e940: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  t..**.** This ca
e950: 6c 6c 62 61 63 6b 20 69 73 20 75 73 65 64 20 62  llback is used b
e960: 79 20 6d 75 6c 74 69 70 6c 65 20 65 78 70 72 65  y multiple expre
e970: 73 73 69 6f 6e 20 77 61 6c 6b 65 72 73 2e 0a 2a  ssion walkers..*
e980: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
e990: 65 63 74 57 61 6c 6b 46 61 69 6c 28 57 61 6c 6b  ectWalkFail(Walk
e9a0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
e9b0: 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ect *NotUsed){. 
e9c0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
e9d0: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57  R(NotUsed);.  pW
e9e0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
e9f0: 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ;.  return WRC_A
ea00: 62 6f 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  bort;.}../*.** I
ea10: 66 20 74 68 65 20 69 6e 70 75 74 20 65 78 70 72  f the input expr
ea20: 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 49 44 20  ession is an ID 
ea30: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 22 74  with the name "t
ea40: 72 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22 0a  rue" or "false".
ea50: 2a 2a 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  ** then convert 
ea60: 69 74 20 69 6e 74 6f 20 61 6e 20 54 4b 5f 54 52  it into an TK_TR
ea70: 55 45 46 41 4c 53 45 20 74 65 72 6d 2e 20 20 52  UEFALSE term.  R
ea80: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
ea90: 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 76 65 72 73  f.** the convers
eaa0: 69 6f 6e 20 68 61 70 70 65 6e 65 64 2c 20 61 6e  ion happened, an
eab0: 64 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  d zero if the ex
eac0: 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 61 6c  pression is unal
ead0: 74 65 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tered..*/.int sq
eae0: 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54 72 75  lite3ExprIdToTru
eaf0: 65 46 61 6c 73 65 28 45 78 70 72 20 2a 70 45 78  eFalse(Expr *pEx
eb00: 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  pr){.  assert( p
eb10: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
eb20: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
eb30: 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 69 66 28  _STRING );.  if(
eb40: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
eb50: 79 28 70 45 78 70 72 2c 20 45 50 5f 51 75 6f 74  y(pExpr, EP_Quot
eb60: 65 64 29 0a 20 20 20 26 26 20 28 73 71 6c 69 74  ed).   && (sqlit
eb70: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
eb80: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 74 72 75 65  >u.zToken, "true
eb90: 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ")==0.       || 
eba0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
ebb0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
ebc0: 22 66 61 6c 73 65 22 29 3d 3d 30 29 0a 20 20 29  "false")==0).  )
ebd0: 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  {.    pExpr->op 
ebe0: 3d 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3b 0a  = TK_TRUEFALSE;.
ebf0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
ec00: 72 74 79 28 70 45 78 70 72 2c 20 70 45 78 70 72  rty(pExpr, pExpr
ec10: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30  ->u.zToken[4]==0
ec20: 20 3f 20 45 50 5f 49 73 54 72 75 65 20 3a 20 45   ? EP_IsTrue : E
ec30: 50 5f 49 73 46 61 6c 73 65 29 3b 0a 20 20 20 20  P_IsFalse);.    
ec40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
ec50: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
ec60: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
ec70: 6d 75 73 74 20 62 65 20 61 20 54 4b 5f 54 52 55  must be a TK_TRU
ec80: 45 46 41 4c 53 45 20 45 78 70 72 20 6e 6f 64 65  EFALSE Expr node
ec90: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 69  .  Return 1 if i
eca0: 74 20 69 73 20 54 52 55 45 0a 2a 2a 20 61 6e 64  t is TRUE.** and
ecb0: 20 30 20 69 66 20 69 74 20 69 73 20 46 41 4c 53   0 if it is FALS
ecc0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
ecd0: 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28  3ExprTruthValue(
ece0: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70  const Expr *pExp
ecf0: 72 29 7b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  r){.  pExpr = sq
ed00: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
ed10: 6c 61 74 65 28 28 45 78 70 72 2a 29 70 45 78 70  late((Expr*)pExp
ed20: 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  r);.  assert( pE
ed30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45  xpr->op==TK_TRUE
ed40: 46 41 4c 53 45 20 29 3b 0a 20 20 61 73 73 65 72  FALSE );.  asser
ed50: 74 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  t( sqlite3StrICm
ed60: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
ed70: 6e 2c 22 74 72 75 65 22 29 3d 3d 30 0a 20 20 20  n,"true")==0.   
ed80: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 74      || sqlite3St
ed90: 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
eda0: 54 6f 6b 65 6e 2c 22 66 61 6c 73 65 22 29 3d 3d  Token,"false")==
edb0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 45  0 );.  return pE
edc0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d  xpr->u.zToken[4]
edd0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  ==0;.}../*.** If
ede0: 20 70 45 78 70 72 20 69 73 20 61 6e 20 41 4e 44   pExpr is an AND
edf0: 20 6f 72 20 4f 52 20 65 78 70 72 65 73 73 69 6f   or OR expressio
ee00: 6e 2c 20 74 72 79 20 74 6f 20 73 69 6d 70 6c 69  n, try to simpli
ee10: 66 79 20 69 74 20 62 79 20 65 6c 69 6d 69 6e 61  fy it by elimina
ee20: 74 69 6e 67 0a 2a 2a 20 74 65 72 6d 73 20 74 68  ting.** terms th
ee30: 61 74 20 61 72 65 20 61 6c 77 61 79 73 20 74 72  at are always tr
ee40: 75 65 20 6f 72 20 66 61 6c 73 65 2e 20 20 52 65  ue or false.  Re
ee50: 74 75 72 6e 20 74 68 65 20 73 69 6d 70 6c 69 66  turn the simplif
ee60: 69 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ied expression..
ee70: 2a 2a 20 4f 72 20 72 65 74 75 72 6e 20 74 68 65  ** Or return the
ee80: 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73   original expres
ee90: 73 69 6f 6e 20 69 66 20 6e 6f 20 73 69 6d 70 6c  sion if no simpl
eea0: 69 66 69 63 61 74 69 6f 6e 20 69 73 20 70 6f 73  ification is pos
eeb0: 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  sible..**.** Exa
eec0: 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
eed0: 20 28 78 3c 31 30 29 20 41 4e 44 20 74 72 75 65   (x<10) AND true
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eef0: 3d 3e 20 20 20 28 78 3c 31 30 29 0a 2a 2a 20 20  =>   (x<10).**  
ef00: 20 20 20 28 78 3c 31 30 29 20 41 4e 44 20 66 61     (x<10) AND fa
ef10: 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
ef20: 20 20 3d 3e 20 20 20 66 61 6c 73 65 0a 2a 2a 20    =>   false.** 
ef30: 20 20 20 20 28 78 3c 31 30 29 20 41 4e 44 20 28      (x<10) AND (
ef40: 79 3d 32 32 20 4f 52 20 66 61 6c 73 65 29 20 20  y=22 OR false)  
ef50: 20 20 20 3d 3e 20 20 20 28 78 3c 31 30 29 20 41     =>   (x<10) A
ef60: 4e 44 20 28 79 3d 32 32 29 0a 2a 2a 20 20 20 20  ND (y=22).**    
ef70: 20 28 78 3c 31 30 29 20 41 4e 44 20 28 79 3d 32   (x<10) AND (y=2
ef80: 32 20 4f 52 20 74 72 75 65 29 20 20 20 20 20 20  2 OR true)      
ef90: 3d 3e 20 20 20 28 78 3c 31 30 29 0a 2a 2a 20 20  =>   (x<10).**  
efa0: 20 20 20 28 79 3d 32 32 29 20 4f 52 20 74 72 75     (y=22) OR tru
efb0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
efc0: 20 20 3d 3e 20 20 20 74 72 75 65 0a 2a 2f 0a 45    =>   true.*/.E
efd0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
efe0: 53 69 6d 70 6c 69 66 69 65 64 41 6e 64 4f 72 28  SimplifiedAndOr(
eff0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
f000: 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30  assert( pExpr!=0
f010: 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   );.  if( pExpr-
f020: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 7c 7c 20 70  >op==TK_AND || p
f030: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
f040: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  ){.    Expr *pRi
f050: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
f060: 72 53 69 6d 70 6c 69 66 69 65 64 41 6e 64 4f 72  rSimplifiedAndOr
f070: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
f080: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
f090: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 69   = sqlite3ExprSi
f0a0: 6d 70 6c 69 66 69 65 64 41 6e 64 4f 72 28 70 45  mplifiedAndOr(pE
f0b0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
f0c0: 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73 54   if( ExprAlwaysT
f0d0: 72 75 65 28 70 4c 65 66 74 29 20 7c 7c 20 45 78  rue(pLeft) || Ex
f0e0: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 52  prAlwaysFalse(pR
f0f0: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 70  ight) ){.      p
f100: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 6f 70  Expr = pExpr->op
f110: 3d 3d 54 4b 5f 41 4e 44 20 3f 20 70 52 69 67 68  ==TK_AND ? pRigh
f120: 74 20 3a 20 70 4c 65 66 74 3b 0a 20 20 20 20 7d  t : pLeft;.    }
f130: 65 6c 73 65 20 69 66 28 20 45 78 70 72 41 6c 77  else if( ExprAlw
f140: 61 79 73 54 72 75 65 28 70 52 69 67 68 74 29 20  aysTrue(pRight) 
f150: 7c 7c 20 45 78 70 72 41 6c 77 61 79 73 46 61 6c  || ExprAlwaysFal
f160: 73 65 28 70 4c 65 66 74 29 20 29 7b 0a 20 20 20  se(pLeft) ){.   
f170: 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
f180: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 3f 20 70  ->op==TK_AND ? p
f190: 4c 65 66 74 20 3a 20 70 52 69 67 68 74 3b 0a 20  Left : pRight;. 
f1a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
f1b0: 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pExpr;.}.../*.
f1c0: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
f1d0: 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c  s are Walker cal
f1e0: 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63  lbacks used to c
f1f0: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73  heck expressions
f200: 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68   to.** see if th
f210: 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74  ey are "constant
f220: 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e  " for some defin
f230: 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e  ition of constan
f240: 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65  t.  The.** Walke
f250: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65  r.eCode value de
f260: 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70  termines the typ
f270: 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20  e of "constant" 
f280: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a  we are looking.*
f290: 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  * for..**.** The
f2a0: 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  se callback rout
f2b0: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
f2c0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66   implement the f
f2d0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
f2e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
f2f0: 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20  sConstant()     
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
f310: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a  lker->eCode==1.*
f320: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
f330: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
f340: 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20 70  in()           p
f350: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32  Walker->eCode==2
f360: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
f370: 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
f380: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
f390: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f3a0: 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =3.**     sqlite
f3b0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
f3c0: 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20  rFunction()     
f3d0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
f3e0: 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20  e==4 or 5.**.** 
f3f0: 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68  In all cases, th
f400: 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20  e callbacks set 
f410: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61  Walker.eCode=0 a
f420: 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65 20  nd abort if the 
f430: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
f440: 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65   found to not be
f450: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a   a constant..**.
f460: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78  ** The sqlite3Ex
f470: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
f480: 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64  nction() is used
f490: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
f4a0: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69  expressions.** i
f4b0: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
f4c0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
f4d0: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
f4e0: 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70 61  lue is 5 when pa
f4f0: 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73  rsing.** an exis
f500: 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20  ting schema and 
f510: 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  4 when processin
f520: 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  g a new statemen
f530: 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70  t.  A bound.** p
f540: 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73 20  arameter raises 
f550: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77  an error for new
f560: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74   statements, but
f570: 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e   is silently con
f580: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c  verted.** to NUL
f590: 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73  L for existing s
f5a0: 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c  chemas.  This al
f5b0: 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74  lows sqlite_mast
f5c0: 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a  er tables that .
f5d0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75  ** contain a bou
f5e0: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65 63  nd parameter bec
f5f0: 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20 67  ause they were g
f600: 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65  enerated by olde
f610: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
f620: 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61   SQLite to be pa
f630: 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  rsed by newer ve
f640: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
f650: 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67   without raising
f660: 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20   a.** malformed 
f670: 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f  schema error..*/
f680: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
f690: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
f6a0: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
f6b0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20  Expr *pExpr){.. 
f6c0: 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e   /* If pWalker->
f6d0: 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20  eCode is 2 then 
f6e0: 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  any term of the 
f6f0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
f700: 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  comes from.  ** 
f710: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
f720: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66  clauses of a lef
f730: 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66  t join disqualif
f740: 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  ies the expressi
f750: 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69  on.  ** from bei
f760: 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  ng considered co
f770: 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  nstant. */.  if(
f780: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f790: 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =2 && ExprHasPro
f7a0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
f7b0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
f7c0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
f7d0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
f7e0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
f7f0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
f800: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
f810: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
f820: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
f830: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
f840: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
f850: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65  ant.    ** and e
f860: 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65  ither pWalker->e
f870: 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20  Code==4 or 5 or 
f880: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  the function has
f890: 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49   the.    ** SQLI
f8a0: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c  TE_FUNC_CONST fl
f8b0: 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ag. */.    case 
f8c0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
f8d0: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
f8e0: 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72  eCode>=4 || Expr
f8f0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
f900: 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20  r,EP_ConstFunc) 
f910: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
f920: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
f930: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f940: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f950: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
f960: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
f970: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
f980: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 20  ase TK_ID:.     
f990: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22 74 72 75   /* Convert "tru
f9a0: 65 22 20 6f 72 20 22 66 61 6c 73 65 22 20 69 6e  e" or "false" in
f9b0: 20 61 20 44 45 46 41 55 4c 54 20 63 6c 61 75 73   a DEFAULT claus
f9c0: 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  e into the.     
f9d0: 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20   ** appropriate 
f9e0: 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 6f 70 65  TK_TRUEFALSE ope
f9f0: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69  rator */.      i
fa00: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 64  f( sqlite3ExprId
fa10: 54 6f 54 72 75 65 46 61 6c 73 65 28 70 45 78 70  ToTrueFalse(pExp
fa20: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  r) ){.        re
fa30: 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
fa40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
fa50: 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   Fall thru */.  
fa60: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
fa70: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
fa80: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
fa90: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
faa0: 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  MN:.      testca
fab0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
fac0: 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65  K_ID );.      te
fad0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
fae0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
faf0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
fb00: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
fb10: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
fb20: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
fb30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
fb40: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
fb50: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
fb60: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 69  rty(pExpr, EP_Fi
fb70: 78 65 64 43 6f 6c 29 20 26 26 20 70 57 61 6c 6b  xedCol) && pWalk
fb80: 65 72 2d 3e 65 43 6f 64 65 21 3d 32 20 29 7b 0a  er->eCode!=2 ){.
fb90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
fba0: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
fbb0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
fbc0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33  Walker->eCode==3
fbd0: 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
fbe0: 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43  e==pWalker->u.iC
fbf0: 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ur ){.        re
fc00: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
fc10: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
fc20: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
fc30: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
fc40: 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 0a 20 20 20  IF_NULL_ROW:.   
fc50: 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
fc60: 52 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  R:.      testcas
fc70: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
fc80: 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20  _REGISTER );.   
fc90: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
fca0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55  pr->op==TK_IF_NU
fcb0: 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20 20 20 20 20  LL_ROW );.      
fcc0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
fcd0: 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
fce0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
fcf0: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
fd00: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  :.      if( pWal
fd10: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b  ker->eCode==5 ){
fd20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65  .        /* Sile
fd30: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75  ntly convert bou
fd40: 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 68  nd parameters th
fd50: 61 74 20 61 70 70 65 61 72 20 69 6e 73 69 64 65  at appear inside
fd60: 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20 20   of CREATE.     
fd70: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
fd80: 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65   into a NULL whe
fd90: 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20 43 52  n parsing the CR
fda0: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  EATE statement t
fdb0: 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20  ext out.        
fdc0: 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ** of the sqlite
fdd0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f  _master table */
fde0: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
fdf0: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
fe00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
fe10: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
fe20: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
fe30: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
fe40: 69 6e 20 61 20 43 52 45 41 54 45 20 73 74 61 74  in a CREATE stat
fe50: 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69  ement that origi
fe60: 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20  nates from.     
fe70: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72     ** sqlite3_pr
fe80: 65 70 61 72 65 28 29 20 63 61 75 73 65 73 20 61  epare() causes a
fe90: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
fea0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
feb0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
fec0: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
fed0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
fee0: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
fef0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  /.    default:. 
ff00: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
ff10: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
ff20: 45 43 54 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65  ECT ); /* sqlite
ff30: 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28  3SelectWalkFail(
ff40: 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f 0a 20  ) disallows */. 
ff50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
ff60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
ff70: 53 54 53 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65  STS ); /* sqlite
ff80: 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28  3SelectWalkFail(
ff90: 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f 0a 20  ) disallows */. 
ffa0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
ffb0: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
ffc0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
ffd0: 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20  sConst(Expr *p, 
ffe0: 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e  int initFlag, in
fff0: 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65  t iCur){.  Walke
10000 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  r w;.  w.eCode =
10010 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78   initFlag;.  w.x
10020 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
10030 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
10040 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  t;.  w.xSelectCa
10050 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
10060 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a  SelectWalkFail;.
10070 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
10080 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  BUG.  w.xSelectC
10090 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74  allback2 = sqlit
100a0 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65  e3SelectWalkAsse
100b0 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20 77 2e  rt2;.#endif.  w.
100c0 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  u.iCur = iCur;. 
100d0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
100e0 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
100f0 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
10100 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
10110 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
10120 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
10130 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10140 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61  is constant.** a
10150 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  nd 0 if it invol
10160 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
10170 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e   function calls.
10180 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
10190 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
101a0 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
101b0 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
101c0 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
101d0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
101e0 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
101f0 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
10200 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
10210 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
10220 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10230 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45  ExprIsConstant(E
10240 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
10250 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
10260 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   1, 0);.}../*.**
10270 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
10280 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
10290 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a  n non-zero if.**
102a0 0a 2a 2a 20 20 20 28 31 29 20 74 68 65 20 65 78  .**   (1) the ex
102b0 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
102c0 74 61 6e 74 2c 20 61 6e 64 0a 2a 2a 20 20 20 28  tant, and.**   (
102d0 32 29 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  2) the expressio
102e0 6e 20 64 6f 65 73 20 6f 72 69 67 69 6e 61 74 65  n does originate
102f0 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
10300 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20  ING clause.**   
10310 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f      of a LEFT JO
10320 49 4e 2c 20 61 6e 64 0a 2a 2a 20 20 20 28 33 29  IN, and.**   (3)
10330 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10340 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
10350 20 61 6e 79 20 45 50 5f 46 69 78 65 64 43 6f 6c   any EP_FixedCol
10360 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 20 20   TK_COLUMN.**   
10370 20 20 20 20 6f 70 65 72 61 6e 64 73 20 63 72 65      operands cre
10380 61 74 65 64 20 62 79 20 74 68 65 20 63 6f 6e 73  ated by the cons
10390 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  tant propagation
103a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
103b0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
103c0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
103d0 72 75 65 2c 20 69 74 20 69 6e 64 69 63 61 74 65  rue, it indicate
103e0 73 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  s that the expre
103f0 73 73 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ssion.** can be 
10400 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 50 61  added to the pPa
10410 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20  rse->pConstExpr 
10420 6c 69 73 74 20 61 6e 64 20 65 76 61 6c 75 61 74  list and evaluat
10430 65 64 20 6f 6e 63 65 20 77 68 65 6e 0a 2a 2a 20  ed once when.** 
10440 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
10450 74 65 6d 65 6e 74 20 73 74 61 72 74 73 20 75 70  tement starts up
10460 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
10470 70 72 43 6f 64 65 41 74 49 6e 69 74 28 29 2e 0a  prCodeAtInit()..
10480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
10490 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
104a0 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  oin(Expr *p){.  
104b0 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
104c0 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a  st(p, 2, 0);.}..
104d0 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
104e0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
104f0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
10500 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
10510 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
10520 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c 65 20   for any single 
10530 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65  row of the table
10540 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75   with cursor iCu
10550 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
10560 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70 72 65  ds, the.** expre
10570 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20 72  ssion must not r
10580 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d  efer to any non-
10590 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75  deterministic fu
105a0 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a  nction nor any.*
105b0 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68  * table other th
105c0 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20  an iCur..*/.int 
105d0 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
105e0 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  leConstant(Expr 
105f0 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20  *p, int iCur){. 
10600 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
10610 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72 29 3b  nst(p, 3, iCur);
10620 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  .}.../*.** sqlit
10630 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c  e3WalkExpr() cal
10640 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 73 71  lback used by sq
10650 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
10660 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 29 2e 0a  antOrGroupBy()..
10670 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
10680 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
10690 4f 72 47 72 6f 75 70 42 79 28 57 61 6c 6b 65 72  OrGroupBy(Walker
106a0 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
106b0 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 4c  *pExpr){.  ExprL
106c0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20  ist *pGroupBy = 
106d0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 47 72 6f 75  pWalker->u.pGrou
106e0 70 42 79 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  pBy;.  int i;.. 
106f0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45 78   /* Check if pEx
10700 70 72 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20  pr is identical 
10710 74 6f 20 61 6e 79 20 47 52 4f 55 50 20 42 59 20  to any GROUP BY 
10720 74 65 72 6d 2e 20 49 66 20 73 6f 2c 20 63 6f 6e  term. If so, con
10730 73 69 64 65 72 0a 20 20 2a 2a 20 69 74 20 63 6f  sider.  ** it co
10740 6e 73 74 61 6e 74 2e 20 20 2a 2f 0a 20 20 66 6f  nstant.  */.  fo
10750 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42  r(i=0; i<pGroupB
10760 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
10770 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 47      Expr *p = pG
10780 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
10790 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  pr;.    if( sqli
107a0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30  te3ExprCompare(0
107b0 2c 20 70 45 78 70 72 2c 20 70 2c 20 2d 31 29 3c  , pExpr, p, -1)<
107c0 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  2 ){.      CollS
107d0 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
107e0 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
107f0 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65  (pWalker->pParse
10800 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , p);.      if( 
10810 73 71 6c 69 74 65 33 49 73 42 69 6e 61 72 79 28  sqlite3IsBinary(
10820 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  pColl) ){.      
10830 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
10840 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
10850 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
10860 6b 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  k if pExpr is a 
10870 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 66 20 73  sub-select. If s
10880 6f 2c 20 63 6f 6e 73 69 64 65 72 20 69 74 20 76  o, consider it v
10890 61 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66  ariable. */.  if
108a0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
108b0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
108c0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 57  elect) ){.    pW
108d0 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
108e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
108f0 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 72  _Abort;.  }..  r
10900 65 74 75 72 6e 20 65 78 70 72 4e 6f 64 65 49 73  eturn exprNodeIs
10910 43 6f 6e 73 74 61 6e 74 28 70 57 61 6c 6b 65 72  Constant(pWalker
10920 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
10930 2a 2a 20 57 61 6c 6b 20 74 68 65 20 65 78 70 72  ** Walk the expr
10940 65 73 73 69 6f 6e 20 74 72 65 65 20 70 61 73 73  ession tree pass
10950 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
10960 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e  argument. Return
10970 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 66 20   non-zero.** if 
10980 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
10990 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
109a0 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 6f 72   of constants or
109b0 20 63 6f 70 69 65 73 20 6f 66 20 74 65 72 6d 73   copies of terms
109c0 20 0a 2a 2a 20 69 6e 20 70 47 72 6f 75 70 42 79   .** in pGroupBy
109d0 20 74 68 61 74 20 73 6f 72 74 20 77 69 74 68 20   that sort with 
109e0 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  the BINARY colla
109f0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a  tion sequence..*
10a00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10a10 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
10a20 65 72 6d 69 6e 65 20 69 66 20 61 20 74 65 72 6d  ermine if a term
10a30 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 63   of the HAVING c
10a40 6c 61 75 73 65 20 63 61 6e 0a 2a 2a 20 62 65 20  lause can.** be 
10a50 70 72 6f 6d 6f 74 65 64 20 69 6e 74 6f 20 74 68  promoted into th
10a60 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
10a70 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 73 75   In order for su
10a80 63 68 20 61 20 70 72 6f 6d 6f 74 69 6f 6e 20 74  ch a promotion t
10a90 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74 68 65 20 76  o work,.** the v
10aa0 61 6c 75 65 20 6f 66 20 74 68 65 20 48 41 56 49  alue of the HAVI
10ab0 4e 47 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6d  NG clause term m
10ac0 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
10ad0 66 6f 72 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20  for all members 
10ae0 6f 66 0a 2a 2a 20 61 20 22 67 72 6f 75 70 22 2e  of.** a "group".
10af0 20 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e    The requiremen
10b00 74 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50  t that the GROUP
10b10 20 42 59 20 74 65 72 6d 20 6d 75 73 74 20 62 65   BY term must be
10b20 20 42 49 4e 41 52 59 0a 2a 2a 20 61 73 73 75 6d   BINARY.** assum
10b30 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
10b40 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
10b50 6e 63 65 20 77 69 6c 6c 20 68 61 76 65 20 61 20  nce will have a 
10b60 66 69 6e 65 72 2d 67 72 61 69 6e 65 64 0a 2a 2a  finer-grained.**
10b70 20 67 72 6f 75 70 69 6e 67 20 74 68 61 6e 20 62   grouping than b
10b80 69 6e 61 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  inary.  In other
10b90 20 77 6f 72 64 73 20 28 41 3d 42 20 43 4f 4c 4c   words (A=B COLL
10ba0 41 54 45 20 62 69 6e 61 72 79 29 20 69 6d 70 6c  ATE binary) impl
10bb0 69 65 73 0a 2a 2a 20 41 3d 42 20 69 6e 20 65 76  ies.** A=B in ev
10bc0 65 72 79 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74  ery other collat
10bd0 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 54  ing sequence.  T
10be0 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74  he requirement t
10bf0 68 61 74 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50  hat the.** GROUP
10c00 20 42 59 20 62 65 20 42 49 4e 41 52 59 20 69 73   BY be BINARY is
10c10 20 73 74 72 69 63 74 65 72 20 74 68 61 6e 20 6e   stricter than n
10c20 65 63 65 73 73 61 72 79 2e 20 20 49 74 20 77 6f  ecessary.  It wo
10c30 75 6c 64 20 61 6c 73 6f 20 77 6f 72 6b 0a 2a 2a  uld also work.**
10c40 20 74 6f 20 70 72 6f 6d 6f 74 65 20 48 41 56 49   to promote HAVI
10c50 4e 47 20 63 6c 61 75 73 65 73 20 74 68 61 74 20  NG clauses that 
10c60 75 73 65 20 74 68 65 20 73 61 6d 65 20 61 6c 74  use the same alt
10c70 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
10c80 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 61  ng.** sequence a
10c90 73 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  s the GROUP BY t
10ca0 65 72 6d 2c 20 62 75 74 20 74 68 61 74 20 69 73  erm, but that is
10cb0 20 6d 75 63 68 20 68 61 72 64 65 72 20 74 6f 20   much harder to 
10cc0 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c 74 65 72 6e  check,.** altern
10cd0 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
10ce0 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 75 6e  sequences are un
10cf0 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68 69 73  common, and this
10d00 20 69 73 20 6f 6e 6c 79 20 61 6e 0a 2a 2a 20 6f   is only an.** o
10d10 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 73 6f 20  ptimization, so 
10d20 77 65 20 74 61 6b 65 20 74 68 65 20 65 61 73 79  we take the easy
10d30 20 77 61 79 20 6f 75 74 20 61 6e 64 20 73 69 6d   way out and sim
10d40 70 6c 79 20 72 65 71 75 69 72 65 20 74 68 65 0a  ply require the.
10d50 2a 2a 20 47 52 4f 55 50 20 42 59 20 74 6f 20 75  ** GROUP BY to u
10d60 73 65 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f  se the BINARY co
10d70 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10d80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10d90 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
10da0 47 72 6f 75 70 42 79 28 50 61 72 73 65 20 2a 70  GroupBy(Parse *p
10db0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20  Parse, Expr *p, 
10dc0 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
10dd0 42 79 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  By){.  Walker w;
10de0 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a  .  w.eCode = 1;.
10df0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
10e00 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
10e10 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 3b  nstantOrGroupBy;
10e20 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
10e30 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  back = 0;.  w.u.
10e40 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
10e50 70 42 79 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  pBy;.  w.pParse 
10e60 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
10e70 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
10e80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
10e90 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Code;.}../*.** W
10ea0 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
10eb0 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
10ec0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
10ed0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
10ee0 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66  nstant.** or a f
10ef0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74  unction call wit
10f00 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  h constant argum
10f10 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e  ents.  Return an
10f20 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  d 0 if there.** 
10f30 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65  are any variable
10f40 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
10f50 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
10f60 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
10f70 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
10f80 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
10f90 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
10fa0 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
10fb0 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
10fc0 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
10fd0 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
10fe0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
10ff0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
11000 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20  OrFunction(Expr 
11010 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a  *p, u8 isInit){.
11020 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69 74    assert( isInit
11030 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31  ==0 || isInit==1
11040 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70   );.  return exp
11050 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73  rIsConst(p, 4+is
11060 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66  Init, 0);.}..#if
11070 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11080 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f  E_CURSOR_HINTS./
11090 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
110a0 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
110b0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
110c0 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
110d0 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79  ns a.** subquery
110e0 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
110f0 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  Return 0 if ther
11100 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72  e are no subquer
11110 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ies..*/.int sqli
11120 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53  te3ExprContainsS
11130 75 62 71 75 65 72 79 28 45 78 70 72 20 2a 70 29  ubquery(Expr *p)
11140 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
11150 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77  w.eCode = 1;.  w
11160 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
11170 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
11180 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63  Noop;.  w.xSelec
11190 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  tCallback = sqli
111a0 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
111b0 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  l;.#ifdef SQLITE
111c0 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65  _DEBUG.  w.xSele
111d0 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71  ctCallback2 = sq
111e0 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41  lite3SelectWalkA
111f0 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20  ssert2;.#endif. 
11200 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
11210 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
11220 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a  n w.eCode==0;.}.
11230 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
11240 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
11250 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61  p codes a consta
11260 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  nt integer that 
11270 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a  is small enough.
11280 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33  ** to fit in a 3
11290 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
112a0 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20  eturn 1 and put 
112b0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
112c0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a   integer.** in *
112d0 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20  pValue.  If the 
112e0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
112f0 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  t an integer or 
11300 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67  if it is too big
11310 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
11320 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
11330 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20  teger, return 0 
11340 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75  and leave *pValu
11350 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
11360 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
11370 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70  sInteger(Expr *p
11380 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a  , int *pValue){.
11390 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
113a0 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
113b0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
113c0 55 73 65 64 20 74 6f 20 6f 6e 6c 79 20 68 61 70  Used to only hap
113d0 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e  pen following on
113e0 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66   OOM */..  /* If
113f0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
11400 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
11410 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
11420 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
11430 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
11440 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
11450 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
11460 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
11470 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
11480 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
11490 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
114a0 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
114b0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
114c0 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
114d0 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
114e0 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
114f0 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
11500 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
11510 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
11520 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
11530 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
11540 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
11550 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
11560 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11570 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
11580 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
11590 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
115a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
115b0 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
115c0 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
115d0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
115e0 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
115f0 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
11600 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34  assert( v!=(-214
11610 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20  7483647-1) );.  
11620 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
11630 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  -v;.        rc =
11640 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
11650 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11660 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
11670 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
11680 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
11690 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
116a0 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
116b0 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
116c0 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ion can be NULL.
116d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
116e0 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
116f0 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  e NULL or if the
11700 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
11710 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f  oo complex.** to
11720 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55   tell return TRU
11730 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  E.  .**.** This 
11740 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
11750 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  as an optimizati
11760 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49  on, to skip OP_I
11770 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  sNull opcodes.**
11780 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68   when we know th
11790 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  at a value canno
117a0 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63  t be NULL.  Henc
117b0 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  e, a false posit
117c0 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  ive.** (returnin
117d0 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66  g TRUE when in f
117e0 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69  act the expressi
117f0 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  on can never be 
11800 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62  NULL) might.** b
11810 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72  e a small perfor
11820 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73  mance hit but is
11830 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c   otherwise harml
11840 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ess.  On the oth
11850 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61  er.** hand, a fa
11860 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65  lse negative (re
11870 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68  turning FALSE wh
11880 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  en the result co
11890 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20  uld be NULL).** 
118a0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
118b0 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  lt in an incorre
118c0 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77  ct answer.  So w
118d0 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
118e0 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f  turn.** TRUE..*/
118f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
11900 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20  CanBeNull(const 
11910 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f  Expr *p){.  u8 o
11920 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  p;.  while( p->o
11930 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
11940 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
11950 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c  ){.    p = p->pL
11960 65 66 74 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20  eft;.  }.  op = 
11970 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
11980 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
11990 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
119a0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
119b0 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
119c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
119d0 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ING:.    case TK
119e0 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
119f0 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20   TK_BLOB:.      
11a00 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
11a10 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
11a20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72 48      return ExprH
11a30 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
11a40 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20  _CanBeNull) ||. 
11a50 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 79              p->y
11a60 2e 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a 20  .pTab==0 ||  /* 
11a70 52 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f 6c  Reference to col
11a80 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f 6e 20  umn of index on 
11a90 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
11aa0 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e 69             (p->i
11ab0 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e  Column>=0 && p->
11ac0 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e  y.pTab->aCol[p->
11ad0 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
11ae0 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c  ==0);.    defaul
11af0 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
11b00 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
11b10 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
11b20 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
11b30 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
11b40 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  t which would be
11b50 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79  .** unchanged by
11b60 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74   OP_Affinity wit
11b70 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67  h the affinity g
11b80 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
11b90 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
11ba0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11bb0 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
11bc0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f  termine if the O
11bd0 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61  P_Affinity opera
11be0 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
11bf0 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e  mitted.  When in
11c00 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41   doubt return FA
11c10 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  LSE.  A false ne
11c20 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72  gative.** is har
11c30 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20  mless.  A false 
11c40 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65  positive, howeve
11c50 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  r, can result in
11c60 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e   the wrong.** an
11c70 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  swer..*/.int sql
11c80 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
11c90 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f  ffinityChange(co
11ca0 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61  nst Expr *p, cha
11cb0 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b  r aff){.  u8 op;
11cc0 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49  .  if( aff==SQLI
11cd0 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65  TE_AFF_BLOB ) re
11ce0 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28  turn 1;.  while(
11cf0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
11d00 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
11d10 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
11d20 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
11d30 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
11d40 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
11d50 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
11d60 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
11d70 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
11d80 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
11d90 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
11da0 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
11db0 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
11dc0 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
11dd0 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
11de0 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
11df0 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
11e00 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
11e10 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
11e20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
11e30 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65  RING: {.      re
11e40 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
11e50 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
11e60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
11e70 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B: {.      retur
11e80 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
11e90 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
11ea0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11eb0 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20  ->iTable>=0 );  
11ec0 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70  /* p cannot be p
11ed0 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63  art of a CHECK c
11ee0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
11ef0 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f     return p->iCo
11f00 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20  lumn<0.         
11f10 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
11f20 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
11f30 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11f40 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a  NUMERIC);.    }.
11f50 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
11f60 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
11f70 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
11f80 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
11f90 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
11fa0 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
11fb0 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
11fc0 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
11fd0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
11fe0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
11ff0 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
12000 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
12010 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
12020 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
12030 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
12040 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
12050 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
12060 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
12070 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
12080 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20  /*.** pX is the 
12090 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65  RHS of an IN ope
120a0 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73  rator.  If pX is
120b0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
120c0 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e  ent .** that can
120d0 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74   be simplified t
120e0 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65  o a direct table
120f0 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65   access, then re
12100 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
12110 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20  r to the SELECT 
12120 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70  statement.  If p
12130 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43  X is not a SELEC
12140 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
12150 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  or if the SELECT
12160 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73   statement needs
12170 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65   to be manifeste
12180 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65  d into a transie
12190 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  nt.** table, the
121a0 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  n return NULL..*
121b0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
121c0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
121d0 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73  tatic Select *is
121e0 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
121f0 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53  t(Expr *pX){.  S
12200 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c  elect *p;.  SrcL
12210 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
12220 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
12230 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
12240 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78  int i;.  if( !Ex
12250 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
12260 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
12270 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
12280 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 2a  Not a subquery *
12290 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  /.  if( ExprHasP
122a0 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56  roperty(pX, EP_V
122b0 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65 74  arSelect)  ) ret
122c0 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65  urn 0;  /* Corre
122d0 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20  lated subq */.  
122e0 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  p = pX->x.pSelec
122f0 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
12300 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
12310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12320 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
12330 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
12340 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
12350 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
12360 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
12370 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
12380 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
12390 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
123a0 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
123b0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
123c0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
123d0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
123e0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
123f0 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
12400 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
12410 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
12420 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
12430 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
12440 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
12450 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12470 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
12480 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
12490 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
124a0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
124b0 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
124c0 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  IT clause */.  i
124d0 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
124e0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
124f0 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
12500 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
12510 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
12520 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
12530 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72  !=0 );.  if( pSr
12540 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
12550 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
12560 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69  /* Single term i
12570 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
12580 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
12590 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ].pSelect ) retu
125a0 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f  rn 0;     /* FRO
125b0 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75  M is not a subqu
125c0 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ery or view */. 
125d0 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pTab = pSrc->a[
125e0 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72  0].pTab;.  asser
125f0 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
12600 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53  assert( pTab->pS
12610 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20  elect==0 );     
12620 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
12630 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76  lause is not a v
12640 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  iew */.  if( IsV
12650 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
12660 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
12670 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e  /* FROM clause n
12680 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
12690 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  le */.  pEList =
126a0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73   p->pEList;.  as
126b0 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
126c0 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45  );.  /* All SELE
126d0 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20  CT results must 
126e0 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20  be columns. */. 
126f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
12700 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
12710 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73 20  .    Expr *pRes 
12720 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
12730 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 52  Expr;.    if( pR
12740 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  es->op!=TK_COLUM
12750 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
12760 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
12770 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
12780 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f  0].iCursor );  /
12790 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
127a0 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
127b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
127c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
127d0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
127e0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
127f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12800 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
12810 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b 73  code that checks
12820 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
12830 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
12840 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65  able iCur to see
12850 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69   if.** it contai
12860 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72  ns any NULL entr
12870 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65 20  ies.  Cause the 
12880 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67 48  register at regH
12890 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74  asNull to be set
128a0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  .** to a non-NUL
128b0 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72 20  L value if iCur 
128c0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
128d0 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73 74  s.  Cause regist
128e0 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a  er regHasNull.**
128f0 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55   to be set to NU
12900 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  LL if iCur conta
12910 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
12920 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  NULL values..*/.
12930 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
12940 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
12950 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  g(Vdbe *v, int i
12960 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e  Cur, int regHasN
12970 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ull){.  int addr
12980 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  1;.  sqlite3Vdbe
12990 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
129a0 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e  eger, 0, regHasN
129b0 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ull);.  addr1 = 
129c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
129d0 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
129e0 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  iCur); VdbeCover
129f0 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
12a00 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12a10 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20  P_Column, iCur, 
12a20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
12a30 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
12a40 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
12a50 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64  TYPEOFARG);.  Vd
12a60 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
12a70 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64  irst_entry_in(%d
12a80 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71  )", iCur));.  sq
12a90 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
12aa0 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23  e(v, addr1);.}.#
12ab0 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
12ac0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
12ad0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  UERY./*.** The a
12ae0 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e  rgument is an IN
12af0 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 61   operator with a
12b00 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
12b10 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a  query) on the .*
12b20 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  * right-hand sid
12b30 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  e.  Return TRUE 
12b40 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  if that list is 
12b50 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61  constant..*/.sta
12b60 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49  tic int sqlite3I
12b70 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45  nRhsIsConstant(E
12b80 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70  xpr *pIn){.  Exp
12b90 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72  r *pLHS;.  int r
12ba0 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  es;.  assert( !E
12bb0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
12bc0 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  In, EP_xIsSelect
12bd0 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49  ) );.  pLHS = pI
12be0 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d  n->pLeft;.  pIn-
12bf0 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72 65  >pLeft = 0;.  re
12c00 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  s = sqlite3ExprI
12c10 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a  sConstant(pIn);.
12c20 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70    pIn->pLeft = p
12c30 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  LHS;.  return re
12c40 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s;.}.#endif../*.
12c50 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12c60 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
12c70 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
12c80 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f  f the IN (...) o
12c90 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20  perator..** The 
12ca0 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pX parameter is 
12cb0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  the expression o
12cc0 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
12cd0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68   IN operator, wh
12ce0 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
12cf0 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66  either a list of
12d00 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20   expressions or 
12d10 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  a subquery..**.*
12d20 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  * The job of thi
12d30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
12d40 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
12d50 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
12d60 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  hat can.** be us
12d70 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65 73  ed either to tes
12d80 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  t for membership
12d90 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74 20   in the RHS set 
12da0 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
12db0 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d  rough.** all mem
12dc0 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53 20  bers of the RHS 
12dd0 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75  set, skipping du
12de0 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  plicates..**.** 
12df0 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  A cursor is open
12e00 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65  ed on the b-tree
12e10 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
12e20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
12e30 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e  N operator.** an
12e40 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20  d pX->iTable is 
12e50 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
12e60 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e   of that cursor.
12e70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
12e80 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69  ned value of thi
12e90 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63  s function indic
12ea0 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65 20  ates the b-tree 
12eb0 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  type, as follows
12ec0 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  :.**.**   IN_IND
12ed0 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20  EX_ROWID      - 
12ee0 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
12ef0 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62  pened on a datab
12f00 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ase table..**   
12f10 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
12f20 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72  SC  - The cursor
12f30 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
12f40 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
12f50 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
12f60 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68  _INDEX_DESC - Th
12f70 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
12f80 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  ned on a descend
12f90 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
12fa0 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20  IN_INDEX_EPH    
12fb0 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
12fc0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
12fd0 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74   specially creat
12fe0 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ed and.**       
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65    populated ephe
13010 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  remal table..** 
13020 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20    IN_INDEX_NOOP 
13030 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f        - No curso
13040 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e  r was allocated.
13050 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f    The IN operato
13060 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20  r must be.**    
13070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13080 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64       implemented
13090 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   as a sequence o
130a0 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a  f comparisons..*
130b0 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
130c0 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65   b-tree might be
130d0 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48 53   used if the RHS
130e0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69   expression pX i
130f0 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75  s a simple.** su
13100 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a  bquery such as:.
13110 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
13120 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c   <column1>, <col
13130 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74  umn2>... FROM <t
13140 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able>.**.** If t
13150 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
13160 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
13170 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f  ist or a more co
13180 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20  mplex subquery, 
13190 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d  then.** an ephem
131a0 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  eral table might
131b0 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65   need to be gene
131c0 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52  rated from the R
131d0 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70  HS and then.** p
131e0 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74  X->iTable made t
131f0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65  o point to the e
13200 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
13210 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20  nstead of an.** 
13220 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a  existing table..
13230 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67  **.** The inFlag
13240 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74  s parameter must
13250 20 63 6f 6e 74 61 69 6e 2c 20 61 74 20 61 20 6d   contain, at a m
13260 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20 74  inimum, one of t
13270 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e  he bits.** IN_IN
13280 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f  DEX_MEMBERSHIP o
13290 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  r IN_INDEX_LOOP 
132a0 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 20 20 49  but not both.  I
132b0 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69  f inFlags contai
132c0 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ns.** IN_INDEX_M
132d0 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20  EMBERSHIP, then 
132e0 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61  the generated ta
132f0 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ble will be used
13300 20 66 6f 72 20 61 20 66 61 73 74 0a 2a 2a 20 6d   for a fast.** m
13310 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e 20  embership test. 
13320 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44   When the IN_IND
13330 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73  EX_LOOP bit is s
13340 65 74 2c 20 74 68 65 20 49 4e 20 69 6e 64 65 78  et, the IN index
13350 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64   will.** be used
13360 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c   to loop over al
13370 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  l values of the 
13380 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
13390 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  erator..**.** Wh
133a0 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  en IN_INDEX_LOOP
133b0 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
133c0 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
133d0 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
133e0 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20  .** through the 
133f0 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65  set members) the
13400 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73  n the b-tree mus
13410 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75  t not contain du
13420 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20  plicates..** An 
13430 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
13440 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
13450 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
13460 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
13470 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
13480 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
13490 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
134a0 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
134b0 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20  MARY KEY or due 
134c0 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63  to.** a UNIQUE c
134d0 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64  onstraint or ind
134e0 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  ex..**.** When I
134f0 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
13500 49 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  IP is used (and 
13510 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
13520 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
13530 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73  fast set members
13540 68 69 70 20 74 65 73 74 73 29 20 74 68 65 6e 20  hip tests) then 
13550 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  an epheremal tab
13560 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75  le must .** be u
13570 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75  sed unless <colu
13580 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65  mns> is a single
13590 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
135a0 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61   KEY column or a
135b0 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20  n .** index can 
135c0 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68  be found with th
135d0 65 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c  e specified <col
135e0 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66  umns> as its lef
135f0 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  t-most..**.** If
13600 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   the IN_INDEX_NO
13610 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44  OP_OK and IN_IND
13620 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72  EX_MEMBERSHIP ar
13630 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a  e both set and.*
13640 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  * if the RHS of 
13650 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
13660 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  is a list (not a
13670 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20   subquery) then 
13680 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
13690 6d 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61  might decide tha
136a0 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  t creating an ep
136b0 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66  hemeral b-tree f
136c0 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a  or membership.**
136d0 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20   testing is too 
136e0 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65  expensive and re
136f0 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
13700 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  OP.  In that cas
13710 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  e, the.** callin
13720 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  g routine should
13730 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49   implement the I
13740 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67  N operator using
13750 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f   a sequence.** o
13760 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61  f Eq or Ne compa
13770 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73  rison operations
13780 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
13790 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67   b-tree is being
137a0 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72   used for member
137b0 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20  ship tests, the 
137c0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
137d0 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74  .** might need t
137e0 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  o know whether o
137f0 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69  r not the RHS si
13800 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
13810 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  rator.** contain
13820 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72  s a NULL.  If pr
13830 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f  RhsHasNull is no
13840 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
13850 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72   and .** if ther
13860 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20  e is any chance 
13870 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d  that the (...) m
13880 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
13890 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20  ULL value at.** 
138a0 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20  runtime, then a 
138b0 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
138c0 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  cated and the re
138d0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72  gister number wr
138e0 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52  itten.** to *prR
138f0 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68  hsHasNull. If th
13900 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
13910 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
13920 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
13930 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
13940 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
13950 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
13960 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
13970 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
13980 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
13990 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52  n stored in *prR
139a0 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a  hsHasNull, then.
139b0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ** the value in 
139c0 74 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69  that register wi
139d0 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
139e0 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
139f0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  s one or more.**
13a00 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e   NULL values, an
13a10 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d  d it will be som
13a20 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  e non-NULL value
13a30 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
13a40 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55  ontains no.** NU
13a50 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  LL values..**.**
13a60 20 49 66 20 74 68 65 20 61 69 4d 61 70 20 70 61   If the aiMap pa
13a70 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e  rameter is not N
13a80 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69  ULL, it must poi
13a90 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63  nt to an array c
13aa0 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65  ontaining.** one
13ab0 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63   element for eac
13ac0 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65  h column returne
13ad0 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
13ae0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65  statement on the
13af0 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49   RHS.** of the I
13b00 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e  N(...) operator.
13b10 20 54 68 65 20 69 27 74 68 20 65 6e 74 72 79 20   The i'th entry 
13b20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  of the array is 
13b30 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
13b40 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20  he.** offset of 
13b50 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
13b60 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
13b70 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65  e i'th column re
13b80 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
13b90 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61   SELECT. For exa
13ba0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70  mple, if the exp
13bb0 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65  ression and sele
13bc0 63 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a  cted index are:.
13bd0 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20  **.**   (?,?,?) 
13be0 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c  IN (SELECT a, b,
13bf0 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20   c FROM t1).**  
13c00 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
13c10 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b   ON t1(b, c, a);
13c20 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61  .**.** then aiMa
13c30 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64  p[] is populated
13c40 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e   with {2, 0, 1}.
13c50 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
13c60 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
13c70 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
13c80 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  InIndex(.  Parse
13c90 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
13ca0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
13cb0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
13cc0 70 72 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20  pr *pX,         
13cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13ce0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
13cf0 28 52 48 53 29 20 6f 66 20 74 68 65 20 49 4e 20  (RHS) of the IN 
13d00 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33  operator */.  u3
13d10 32 20 69 6e 46 6c 61 67 73 2c 20 20 20 20 20 20  2 inFlags,      
13d20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49           /* IN_I
13d30 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42  NDEX_LOOP, _MEMB
13d40 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f  ERSHIP, and/or _
13d50 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74  NOOP_OK */.  int
13d60 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
13d70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
13d80 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c  ter holding NULL
13d90 20 73 74 61 74 75 73 2e 20 20 53 65 65 20 6e 6f   status.  See no
13da0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  tes */.  int *ai
13db0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
13dc0 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
13dd0 72 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c 64 73  rom Index fields
13de0 20 74 6f 20 52 48 53 20 66 69 65 6c 64 73 20 2a   to RHS fields *
13df0 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 20 20  /.  int *piTab  
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13e10 2a 20 4f 55 54 3a 20 69 6e 64 65 78 20 74 6f 20  * OUT: index to 
13e20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  use */.){.  Sele
13e30 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ct *p;          
13e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e50 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74    /* SELECT to t
13e60 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f  he right of IN o
13e70 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
13e80 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20   eType = 0;     
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48     /* Type of RH
13eb0 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45  S table. IN_INDE
13ec0 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  X_* */.  int iTa
13ed0 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
13ee0 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ++;            /
13ef0 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20  * Cursor of the 
13f00 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  RHS table */.  i
13f10 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b  nt mustBeUnique;
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f30 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
13f40 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71  RHS must be uniq
13f50 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ue */.  Vdbe *v 
13f60 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13f70 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a  (pParse);     /*
13f80 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   Virtual machine
13f90 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
13fa0 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f  .  assert( pX->o
13fb0 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75  p==TK_IN );.  mu
13fc0 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e  stBeUnique = (in
13fd0 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
13fe0 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a  _LOOP)!=0;..  /*
13ff0 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   If the RHS of t
14000 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72  his IN(...) oper
14010 61 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54  ator is a SELECT
14020 2c 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74  , and if it matt
14030 65 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ers .  ** whethe
14040 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c  r or not the SEL
14050 45 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61  ECT result conta
14060 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  ins NULL values,
14070 20 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20   check whether. 
14080 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20   ** or not NULL 
14090 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73  is actually poss
140a0 69 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74  ible (it may not
140b0 20 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   be, for example
140c0 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e  , due .  ** to N
140d0 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
140e0 6e 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  nts in the schem
140f0 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76  a). If no NULL v
14100 61 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69 62  alues are possib
14110 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52  le,.  ** set prR
14120 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62  hsHasNull to 0 b
14130 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67  efore continuing
14140 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68  .  */.  if( prRh
14150 73 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d  sHasNull && (pX-
14160 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
14170 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e  elect) ){.    in
14180 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  t i;.    ExprLis
14190 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e  t *pEList = pX->
141a0 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
141b0 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
141c0 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
141d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
141e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
141f0 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b  eNull(pEList->a[
14200 69 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65 61  i].pExpr) ) brea
14210 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
14220 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70   i==pEList->nExp
14230 72 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73  r ){.      prRhs
14240 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  HasNull = 0;.   
14250 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
14260 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20  ck to see if an 
14270 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
14280 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  r index can be u
14290 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69  sed to.  ** sati
142a0 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20  sfy the query.  
142b0 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62  This is preferab
142c0 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67  le to generating
142d0 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68   a new .  ** eph
142e0 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a  emeral table.  *
142f0 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
14300 6e 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20  nErr==0 && (p = 
14310 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
14320 4f 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20  Opt(pX))!=0 ){. 
14330 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
14340 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
14350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
14360 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
14370 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
14380 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
14390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
143a0 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e  * Table <table>.
143b0 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b   */.    i16 iDb;
143c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
143e0 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66  * Database idx f
143f0 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45  or pTab */.    E
14400 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
14410 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  = p->pEList;.   
14420 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c   int nExpr = pEL
14430 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20  ist->nExpr;..   
14440 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
14450 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  st!=0 );        
14460 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
14470 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
14480 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
14490 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
144a0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  st->a[0].pExpr!=
144b0 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  0 ); /* Because 
144c0 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
144d0 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
144e0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63   assert( p->pSrc
144f0 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
14500 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
14510 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
14520 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
14530 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
14540 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20  >a[0].pTab;..   
14550 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54   /* Code an OP_T
14560 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f  ransaction and O
14570 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
14580 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
14590 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
145a0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
145b0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
145c0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
145d0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
145e0 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
145f0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
14600 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
14610 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
14620 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73  zName);..    ass
14630 65 72 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69  ert(v);  /* sqli
14640 74 65 33 47 65 74 56 64 62 65 28 29 20 68 61 73  te3GetVdbe() has
14650 20 61 6c 77 61 79 73 20 62 65 65 6e 20 70 72 65   always been pre
14660 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a  viously called *
14670 2f 0a 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d  /.    if( nExpr=
14680 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b  =1 && pEList->a[
14690 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  0].pExpr->iColum
146a0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  n<0 ){.      /* 
146b0 54 68 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43  The "x IN (SELEC
146c0 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 61 62  T rowid FROM tab
146d0 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a 20 20 20  le)" case */.   
146e0 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
146f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
14700 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20  (v, OP_Once);.  
14710 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
14720 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  (v);..      sqli
14730 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
14740 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
14750 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
14760 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
14770 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
14780 3b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51  ;.      ExplainQ
14790 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
147a0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
147b0 20 22 55 53 49 4e 47 20 52 4f 57 49 44 20 53 45   "USING ROWID SE
147c0 41 52 43 48 20 4f 4e 20 54 41 42 4c 45 20 25 73  ARCH ON TABLE %s
147d0 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52   FOR IN-OPERATOR
147e0 22 2c 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ",pTab->zName));
147f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14800 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
14810 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
14820 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
14830 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
14840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14850 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
14860 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
14870 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20  finity_ok = 1;. 
14880 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20       int i;..   
14890 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
148a0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68   the affinity th
148b0 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
148c0 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20  to perform each 
148d0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
148e0 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
148f0 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
14900 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20   of each column 
14910 69 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  in table.      *
14920 2a 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  * on the RHS of 
14930 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  the IN operator.
14940 20 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74 20    If it not, it 
14950 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
14960 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20  to.      ** use 
14970 61 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68 65  any index of the
14980 20 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a   RHS table.  */.
14990 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
149a0 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69  <nExpr && affini
149b0 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ty_ok; i++){.   
149c0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
149d0 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
149e0 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
149f0 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
14a00 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
14a10 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
14a20 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
14a30 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d     char idxaff =
14a40 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
14a50 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61 62  umnAffinity(pTab
14a60 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74  ,iCol); /* RHS t
14a70 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
14a80 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73 71  char cmpaff = sq
14a90 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
14aa0 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61 66  nity(pLhs, idxaf
14ab0 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  f);.        test
14ac0 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51  case( cmpaff==SQ
14ad0 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b  LITE_AFF_BLOB );
14ae0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
14af0 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54  e( cmpaff==SQLIT
14b00 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
14b10 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63 6d        switch( cm
14b20 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  paff ){.        
14b30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
14b40 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20  F_BLOB:.        
14b50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14b60 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
14b70 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20  _AFF_TEXT:.     
14b80 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
14b90 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
14ba0 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20  () only returns 
14bb0 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64 65  TEXT if one side
14bc0 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 20   or the.        
14bd0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 73      ** other has
14be0 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e 64   no affinity and
14bf0 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 20   the other side 
14c00 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65 2c  is TEXT.  Hence,
14c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
14c20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72  the only way for
14c30 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54 45   cmpaff to be TE
14c40 58 54 20 69 73 20 66 6f 72 20 69 64 78 61 66 66  XT is for idxaff
14c50 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20 20   to be TEXT.    
14c60 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 66          ** and f
14c70 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20 74  or the term on t
14c80 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
14c90 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66 69   to have no affi
14ca0 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nity. */.       
14cb0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78       assert( idx
14cc0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
14cd0 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20  TEXT );.        
14ce0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14cf0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
14d00 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
14d10 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49  ty_ok = sqlite3I
14d20 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
14d30 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20  (idxaff);.      
14d40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
14d50 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f     if( affinity_
14d60 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ok ){.        /*
14d70 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
14d80 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74 68  xisting index th
14d90 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72  at will work for
14da0 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
14db0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  r */.        for
14dc0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
14dd0 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
14de0 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78 2d  e==0; pIdx=pIdx-
14df0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
14e00 20 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73     Bitmask colUs
14e10 65 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75  ed;      /* Colu
14e20 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
14e30 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20   used */.       
14e40 20 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b     Bitmask mCol;
14e50 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
14e60 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
14e70 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20   column */.     
14e80 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
14e90 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63  Column<nExpr ) c
14ea0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
14eb0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61     if( pIdx->pPa
14ec0 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20  rtIdxWhere!=0 ) 
14ed0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
14ee0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
14ef0 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c  Column is BMS-2,
14f00 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74   not BMS-1, so t
14f10 68 61 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75  hat we can compu
14f20 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
14f30 42 49 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77  BITMASK(nExpr) w
14f40 69 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69  ithout overflowi
14f50 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
14f60 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e  testcase( pIdx->
14f70 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29  nColumn==BMS-2 )
14f80 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
14f90 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  case( pIdx->nCol
14fa0 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  umn==BMS-1 );.  
14fb0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
14fc0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31  ->nColumn>=BMS-1
14fd0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14fe0 20 20 20 20 20 20 20 69 66 28 20 6d 75 73 74 42         if( mustB
14ff0 65 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20  eUnique ){.     
15000 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
15010 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20  >nKeyCol>nExpr. 
15020 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70              ||(p
15030 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78  Idx->nColumn>nEx
15040 70 72 20 26 26 20 21 49 73 55 6e 69 71 75 65 49  pr && !IsUniqueI
15050 6e 64 65 78 28 70 49 64 78 29 29 0a 20 20 20 20  ndex(pIdx)).    
15060 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
15070 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
15080 65 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65  e;  /* This inde
15090 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20  x is not unique 
150a0 6f 76 65 72 20 74 68 65 20 49 4e 20 52 48 53 20  over the IN RHS 
150b0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
150c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
150d0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
150e0 20 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20    colUsed = 0;  
150f0 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69   /* Columns of i
15100 6e 64 65 78 20 75 73 65 64 20 73 6f 20 66 61 72  ndex used so far
15110 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f   */.          fo
15120 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
15130 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
15140 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
15150 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
15160 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65  dSubexpr(pX->pLe
15170 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
15180 20 20 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d      Expr *pRhs =
15190 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
151a0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
151b0 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d   CollSeq *pReq =
151c0 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
151d0 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
151e0 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29  rse, pLhs, pRhs)
151f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
15200 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  t j;.  .        
15210 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 71      assert( pReq
15220 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f  !=0 || pRhs->iCo
15230 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c  lumn==XN_ROWID |
15240 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
15250 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
15260 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20  r(j=0; j<nExpr; 
15270 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
15280 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
15290 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d  Column[j]!=pRhs-
152a0 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >iColumn ) conti
152b0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
152c0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
152d0 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20  >azColl[j] );.  
152e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
152f0 70 52 65 71 21 3d 30 20 26 26 20 73 71 6c 69 74  pReq!=0 && sqlit
15300 65 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e  e3StrICmp(pReq->
15310 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
15320 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20  oll[j])!=0 ){.  
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
15340 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
15350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15360 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15370 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15380 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45         if( j==nE
15390 78 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xpr ) break;.   
153a0 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20           mCol = 
153b0 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20  MASKBIT(j);.    
153c0 20 20 20 20 20 20 20 20 69 66 28 20 6d 43 6f 6c          if( mCol
153d0 20 26 20 63 6f 6c 55 73 65 64 20 29 20 62 72 65   & colUsed ) bre
153e0 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75  ak; /* Each colu
153f0 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63  mn used only onc
15400 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
15410 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c   colUsed |= mCol
15420 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
15430 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61 70 5b  ( aiMap ) aiMap[
15440 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  i] = j;.        
15450 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
15460 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 45 78 70   assert( i==nExp
15470 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d  r || colUsed!=(M
15480 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29  ASKBIT(nExpr)-1)
15490 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
154a0 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b  ( colUsed==(MASK
154b0 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 7b  BIT(nExpr)-1) ){
154c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
154d0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
154e0 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61   point, that mea
154f0 6e 73 20 74 68 65 20 69 6e 64 65 78 20 70 49 64  ns the index pId
15500 78 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20  x is usable */. 
15510 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
15520 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
15530 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
15540 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
15550 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
15560 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
15570 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 0a  lan((pParse, 0,.
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
155a0 53 49 4e 47 20 49 4e 44 45 58 20 25 73 20 46 4f  SING INDEX %s FO
155b0 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70  R IN-OPERATOR",p
155c0 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
155d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
155e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
155f0 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62  P_OpenRead, iTab
15600 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
15610 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
15620 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
15630 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
15640 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20  pIdx);.         
15650 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
15660 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a  v, "%s", pIdx->z
15670 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
15680 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49      assert( IN_I
15690 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
156a0 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  == IN_INDEX_INDE
156b0 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20  X_ASC+1 );.     
156c0 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
156d0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
156e0 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  C + pIdx->aSortO
156f0 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20  rder[0];.  .    
15700 20 20 20 20 20 20 20 20 69 66 28 20 70 72 52 68          if( prRh
15710 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64  sHasNull ){.#ifd
15720 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15730 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
15740 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K.              
15750 69 36 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e  i64 mask = (1<<n
15760 45 78 70 72 29 2d 31 3b 0a 20 20 20 20 20 20 20  Expr)-1;.       
15770 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15780 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
15790 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
157a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
157b0 20 20 20 69 54 61 62 2c 20 30 2c 20 30 2c 20 28     iTab, 0, 0, (
157c0 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e  u8*)&mask, P4_IN
157d0 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  T64);.#endif.   
157e0 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68             *prRh
157f0 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  sHasNull = ++pPa
15800 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
15810 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 78           if( nEx
15820 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr==1 ){.       
15830 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15840 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
15850 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61  , iTab, *prRhsHa
15860 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  sNull);.        
15870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15880 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15890 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
158a0 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
158b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
158c0 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f       } /* End lo
158d0 6f 70 20 6f 76 65 72 20 69 6e 64 65 78 65 73 20  op over indexes 
158e0 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e  */.      } /* En
158f0 64 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f  d if( affinity_o
15900 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20  k ) */.    } /* 
15910 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f  End if not an ro
15920 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d  wid index */.  }
15930 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d 70 74 20   /* End attempt 
15940 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e  to optimize usin
15950 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20  g an index */.. 
15960 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69   /* If no preexi
15970 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61  sting index is a
15980 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
15990 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   IN clause.  ** 
159a0 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  and IN_INDEX_NOO
159b0 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20  P is an allowed 
159c0 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74  reply.  ** and t
159d0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
159e0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
159f0 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75  ist, not a subqu
15a00 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ery.  ** and the
15a10 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73   RHS is not cons
15a20 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20  tant or has two 
15a30 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a  or fewer terms,.
15a40 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20    ** then it is 
15a50 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69  not worth creati
15a60 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
15a70 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74  table to evaluat
15a80 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70  e.  ** the IN op
15a90 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e  erator so return
15aa0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a   IN_INDEX_NOOP..
15ab0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
15ac0 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61  ==0.   && (inFla
15ad0 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  gs & IN_INDEX_NO
15ae0 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78  OP_OK).   && !Ex
15af0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
15b00 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a  , EP_xIsSelect).
15b10 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49     && (!sqlite3I
15b20 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70  nRhsIsConstant(p
15b30 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73  X) || pX->x.pLis
15b40 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29  t->nExpr<=2).  )
15b50 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  {.    eType = IN
15b60 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d  _INDEX_NOOP;.  }
15b70 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
15b80 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64   ){.    /* Could
15b90 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69   not find an exi
15ba0 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
15bb0 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
15bc0 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
15bd0 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
15be0 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
15bf0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
15c00 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
15c10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20  .    */.    u32 
15c20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
15c30 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
15c40 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d  Loop;.    int rM
15c50 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a  ayHaveNull = 0;.
15c60 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
15c70 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66  NDEX_EPH;.    if
15c80 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49  ( inFlags & IN_I
15c90 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_LOOP ){.   
15ca0 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
15cb0 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d  yLoop = 0;.    }
15cc0 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61  else if( prRhsHa
15cd0 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a  sNull ){.      *
15ce0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72  prRhsHasNull = r
15cf0 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
15d00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
15d10 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
15d20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
15d30 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
15d40 52 68 73 4f 66 49 4e 28 70 50 61 72 73 65 2c 20  RhsOfIN(pParse, 
15d50 70 58 2c 20 69 54 61 62 29 3b 0a 20 20 20 20 69  pX, iTab);.    i
15d60 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  f( rMayHaveNull 
15d70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15d80 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
15d90 2c 20 69 54 61 62 2c 20 72 4d 61 79 48 61 76 65  , iTab, rMayHave
15da0 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Null);.    }.   
15db0 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
15dc0 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72  oop = savedNQuer
15dd0 79 4c 6f 6f 70 3b 0a 20 20 7d 0a 0a 20 20 69 66  yLoop;.  }..  if
15de0 28 20 61 69 4d 61 70 20 26 26 20 65 54 79 70 65  ( aiMap && eType
15df0 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  !=IN_INDEX_INDEX
15e00 5f 41 53 43 20 26 26 20 65 54 79 70 65 21 3d 49  _ASC && eType!=I
15e10 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
15e20 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  SC ){.    int i,
15e30 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69   n;.    n = sqli
15e40 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
15e50 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  e(pX->pLeft);.  
15e60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
15e70 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20  i++) aiMap[i] = 
15e80 69 3b 0a 20 20 7d 0a 20 20 2a 70 69 54 61 62 20  i;.  }.  *piTab 
15e90 3d 20 69 54 61 62 3b 0a 20 20 72 65 74 75 72 6e  = iTab;.  return
15ea0 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66   eType;.}.#endif
15eb0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15ec0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
15ed0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 45  *.** Argument pE
15ee0 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e  xpr is an (?, ?.
15ef0 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72  ..) IN(...) expr
15f00 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a  ession. This .**
15f10 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
15f20 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
15f30 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
15f40 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
15f50 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e  ng .** the affin
15f60 69 74 69 65 73 20 74 6f 20 62 65 20 75 73 65 64  ities to be used
15f70 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
15f80 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
15f90 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  on..**.** It is 
15fa0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
15fb0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
15fc0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
15fd0 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
15fe0 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74 75  string is eventu
15ff0 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67  ally freed using
16000 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
16010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
16020 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79   *exprINAffinity
16030 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
16040 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
16050 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
16060 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e  xpr->pLeft;.  in
16070 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33  t nVal = sqlite3
16080 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
16090 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74 20  Left);.  Select 
160a0 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78 70  *pSelect = (pExp
160b0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  r->flags & EP_xI
160c0 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70 72  sSelect) ? pExpr
160d0 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b  ->x.pSelect : 0;
160e0 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a  .  char *zRet;..
160f0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
16100 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
16110 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  zRet = sqlite3Db
16120 4d 61 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65  MallocRaw(pParse
16130 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20  ->db, nVal+1);. 
16140 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20   if( zRet ){.   
16150 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
16160 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b  i=0; i<nVal; i++
16170 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
16180 41 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  A = sqlite3Vecto
16190 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c  rFieldSubexpr(pL
161a0 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63  eft, i);.      c
161b0 68 61 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45  har a = sqlite3E
161c0 78 70 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b  xprAffinity(pA);
161d0 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 65  .      if( pSele
161e0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  ct ){.        zR
161f0 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43  et[i] = sqlite3C
16200 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
16210 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
16220 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a  a[i].pExpr, a);.
16230 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16240 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61       zRet[i] = a
16250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16260 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d      zRet[nVal] =
16270 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74   '\0';.  }.  ret
16280 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn zRet;.}.#end
16290 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
162a0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
162b0 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20  ./*.** Load the 
162c0 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73  Parse object pas
162d0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
162e0 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61   argument with a
162f0 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73  n error .** mess
16300 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  age of the form:
16310 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65  .**.**   "sub-se
16320 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63  lect returns N c
16330 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
16340 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20  d M".*/   .void 
16350 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
16360 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61  Error(Parse *pPa
16370 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c  rse, int nActual
16380 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a  , int nExpect){.
16390 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
163a0 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74  mt = "sub-select
163b0 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75   returns %d colu
163c0 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 25  mns - expected %
163d0 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72  d";.  sqlite3Err
163e0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46  orMsg(pParse, zF
163f0 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78  mt, nActual, nEx
16400 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pect);.}.#endif.
16410 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f  ./*.** Expressio
16420 6e 20 70 45 78 70 72 20 69 73 20 61 20 76 65 63  n pExpr is a vec
16430 74 6f 72 20 74 68 61 74 20 68 61 73 20 62 65 65  tor that has bee
16440 6e 20 75 73 65 64 20 69 6e 20 61 20 63 6f 6e 74  n used in a cont
16450 65 78 74 20 77 68 65 72 65 0a 2a 2a 20 69 74 20  ext where.** it 
16460 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64  is not permitted
16470 2e 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  . If pExpr is a 
16480 73 75 62 2d 73 65 6c 65 63 74 20 76 65 63 74 6f  sub-select vecto
16490 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
164a0 0a 2a 2a 20 6c 6f 61 64 73 20 74 68 65 20 50 61  .** loads the Pa
164b0 72 73 65 20 6f 62 6a 65 63 74 20 77 69 74 68 20  rse object with 
164c0 61 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65  a message of the
164d0 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
164e0 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
164f0 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65  ns N columns - e
16500 78 70 65 63 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a  xpected 1".**.**
16510 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20 61 20   Or, if it is a 
16520 72 65 67 75 6c 61 72 20 73 63 61 6c 61 72 20 76  regular scalar v
16530 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ector:.**.**   "
16540 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65  row value misuse
16550 64 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71  d".*/   .void sq
16560 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72  lite3VectorError
16570 4d 73 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Msg(Parse *pPars
16580 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
16590 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
165a0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
165b0 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
165c0 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
165d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 75  ){.    sqlite3Su
165e0 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  bselectError(pPa
165f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  rse, pExpr->x.pS
16600 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
16610 45 78 70 72 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  Expr, 1);.  }els
16620 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
16630 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16640 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61  (pParse, "row va
16650 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20  lue misused");. 
16660 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
16670 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16680 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
16690 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
166a0 20 63 6f 6e 73 74 72 75 63 74 20 61 6e 20 65 70   construct an ep
166b0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 63 6f  hemeral table co
166c0 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 74 65 72  ntaining all ter
166d0 6d 73 0a 2a 2a 20 69 6e 20 74 68 65 20 52 48 53  ms.** in the RHS
166e0 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   of an IN operat
166f0 6f 72 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72  or.  The IN oper
16700 61 74 6f 72 20 63 61 6e 20 62 65 20 69 6e 20 65  ator can be in e
16710 69 74 68 65 72 20 6f 66 20 74 77 6f 0a 2a 2a 20  ither of two.** 
16720 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  forms:.**.**    
16730 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
16740 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
16750 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
16760 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
16770 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
16780 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
16790 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
167a0 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
167b0 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
167c0 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
167d0 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  xpr parameter is
167e0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
167f0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  .  The cursor nu
16800 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20  mber for the.** 
16810 63 6f 6e 73 74 72 75 63 74 65 64 20 65 70 68 65  constructed ephe
16820 72 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20  rmeral table is 
16830 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 20 66  returned.  The f
16840 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 65 70  irst time the ep
16850 68 65 6d 65 72 61 6c 0a 2a 2a 20 74 61 62 6c 65  hemeral.** table
16860 20 69 73 20 63 6f 6d 70 75 74 65 64 2c 20 74 68   is computed, th
16870 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
16880 69 73 20 61 6c 73 6f 20 73 74 6f 72 65 64 20 69  is also stored i
16890 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  n pExpr->iTable,
168a0 0a 2a 2a 20 68 6f 77 65 76 65 72 20 74 68 65 20  .** however the 
168b0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 72 65  cursor number re
168c0 74 75 72 6e 65 64 20 6d 69 67 68 74 20 6e 6f 74  turned might not
168d0 20 62 65 20 74 68 65 20 73 61 6d 65 2c 20 61 73   be the same, as
168e0 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76   it might.** hav
168f0 65 20 62 65 65 6e 20 64 75 70 6c 69 63 61 74 65  e been duplicate
16900 64 20 75 73 69 6e 67 20 4f 50 5f 4f 70 65 6e 44  d using OP_OpenD
16910 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  up..**.** If the
16920 20 4c 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   LHS expression 
16930 28 22 78 22 20 69 6e 20 74 68 65 20 65 78 61 6d  ("x" in the exam
16940 70 6c 65 73 29 20 69 73 20 61 20 63 6f 6c 75 6d  ples) is a colum
16950 6e 20 76 61 6c 75 65 2c 20 6f 72 0a 2a 2a 20 74  n value, or.** t
16960 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
16970 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f  ent returns a co
16980 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e  lumn value, then
16990 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
169a0 20 74 68 61 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20   that.** column 
169b0 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  is used to build
169c0 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e   the index keys.
169d0 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64   If both 'x' and
169e0 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 2e   the.** SELECT..
169f0 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
16a00 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
16a10 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
16a20 73 20 75 73 65 64 0a 2a 2a 20 69 66 20 65 69 74  s used.** if eit
16a30 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
16a40 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
16a50 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
16a60 65 69 74 68 65 72 0a 2a 2a 20 27 78 27 20 6e 6f  either.** 'x' no
16a70 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20  r the SELECT... 
16a80 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
16a90 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
16aa0 72 69 63 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20  ric affinity.** 
16ab0 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64  is used..*/.void
16ac0 20 73 71 6c 69 74 65 33 43 6f 64 65 52 68 73 4f   sqlite3CodeRhsO
16ad0 66 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  fIN(.  Parse *pP
16ae0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
16af0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
16b00 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
16b10 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr,            /
16b20 2a 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  * The IN operato
16b30 72 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  r */.  int iTab 
16b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16b50 2a 20 55 73 65 20 74 68 69 73 20 63 75 72 73 6f  * Use this curso
16b60 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  r number */.){. 
16b70 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
16b80 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
16b90 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
16ba0 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69  P_Once instructi
16bb0 6f 6e 20 61 74 20 74 6f 70 20 2a 2f 0a 20 20 69  on at top */.  i
16bc0 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
16bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
16be0 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
16bf0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
16c00 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ction */.  Expr 
16c10 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  *pLeft;         
16c20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 4c 48         /* the LH
16c30 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
16c40 61 74 6f 72 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  ator */.  KeyInf
16c50 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
16c60 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66        /* Key inf
16c70 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  ormation */.  in
16c80 74 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20  t nVal;         
16c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
16ca0 65 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66  e of vector pLef
16cb0 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cd0 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
16ce0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
16cf0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
16d00 2a 2f 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65  */..  v = pParse
16d10 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
16d20 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  t( v!=0 );..  /*
16d30 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   The evaluation 
16d40 6f 66 20 74 68 65 20 49 4e 20 6d 75 73 74 20 62  of the IN must b
16d50 65 20 72 65 70 65 61 74 65 64 20 65 76 65 72 79  e repeated every
16d60 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73   time it.  ** is
16d70 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20   encountered if 
16d80 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
16d90 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
16da0 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
16db0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
16dc0 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
16dd0 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
16de0 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
16df0 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
16e00 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
16e10 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
16e20 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
16e30 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
16e40 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
16e50 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
16e60 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
16e70 20 74 68 65 6e 20 77 65 20 63 61 6e 20 63 6f 6d   then we can com
16e80 70 75 74 65 20 74 68 65 20 52 48 53 20 6a 75 73  pute the RHS jus
16e90 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 61 6e 64 20  t once.  ** and 
16ea0 72 65 75 73 65 20 69 74 20 6d 61 6e 79 20 6e 61  reuse it many na
16eb0 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  mes..  */.  if( 
16ec0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
16ed0 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
16ee0 6c 65 63 74 29 20 26 26 20 70 50 61 72 73 65 2d  lect) && pParse-
16ef0 3e 69 53 65 6c 66 54 61 62 3d 3d 30 20 29 7b 0a  >iSelfTab==0 ){.
16f00 20 20 20 20 2f 2a 20 52 65 75 73 65 20 6f 66 20      /* Reuse of 
16f10 74 68 65 20 52 48 53 20 69 73 20 61 6c 6c 6f 77  the RHS is allow
16f20 65 64 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  ed */.    /* If 
16f30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  this routine has
16f40 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
16f50 64 65 64 2c 20 62 75 74 20 74 68 65 20 70 72 65  ded, but the pre
16f60 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 2a  vious code.    *
16f70 2a 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  * might not have
16f80 20 62 65 65 6e 20 69 6e 76 6f 6b 65 64 20 79 65   been invoked ye
16f90 74 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 69 74 20  t, so invoke it 
16fa0 6e 6f 77 20 61 73 20 61 20 73 75 62 72 6f 75 74  now as a subrout
16fb0 69 6e 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ine. .    */.   
16fc0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
16fd0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
16fe0 75 62 72 74 6e 29 20 29 7b 0a 20 20 20 20 20 20  ubrtn) ){.      
16ff0 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74  addrOnce = sqlit
17000 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
17010 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f  OP_Once); VdbeCo
17020 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
17030 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
17040 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
17050 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
17060 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
17070 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
17080 2c 20 22 52 45 55 53 45 20 4c 49 53 54 20 53 55  , "REUSE LIST SU
17090 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20  BQUERY %d",.    
170a0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
170b0 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49  >x.pSelect->selI
170c0 64 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d));.      }.   
170d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
170e0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
170f0 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72  , pExpr->y.sub.r
17100 65 67 52 65 74 75 72 6e 2c 0a 20 20 20 20 20 20  egReturn,.      
17110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17120 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69    pExpr->y.sub.i
17130 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Addr);.      sql
17140 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17150 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 69 54  , OP_OpenDup, iT
17160 61 62 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ab, pExpr->iTabl
17170 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
17180 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
17190 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20   addrOnce);.    
171a0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
171b0 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 63 6f  .    /* Begin co
171c0 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74  ding the subrout
171d0 69 6e 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 53  ine */.    ExprS
171e0 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
171f0 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b 0a 20 20  , EP_Subrtn);.  
17200 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72    pExpr->y.sub.r
17210 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
17220 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70  rse->nMem;.    p
17230 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64  Expr->y.sub.iAdd
17240 72 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r =.      sqlite
17250 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17260 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 45  P_Integer, 0, pE
17270 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65  xpr->y.sub.regRe
17280 74 75 72 6e 29 20 2b 20 31 3b 0a 20 20 20 20 56  turn) + 1;.    V
17290 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
172a0 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 22 29  return address")
172b0 29 3b 0a 0a 20 20 20 20 61 64 64 72 4f 6e 63 65  );..    addrOnce
172c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
172d0 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
172e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
172f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  );.  }..  /* Che
17300 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
17310 73 20 69 73 20 61 20 76 65 63 74 6f 72 20 49 4e  s is a vector IN
17320 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 70   operator */.  p
17330 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
17340 65 66 74 3b 0a 20 20 6e 56 61 6c 20 3d 20 73 71  eft;.  nVal = sq
17350 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
17360 69 7a 65 28 70 4c 65 66 74 29 3b 0a 0a 20 20 2f  ize(pLeft);..  /
17370 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
17380 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
17390 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 74 61 69  that will contai
173a0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
173b0 0a 20 20 2a 2a 20 52 48 53 20 6f 66 20 74 68 65  .  ** RHS of the
173c0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   IN operator..  
173d0 2a 2f 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62  */.  pExpr->iTab
173e0 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 61 64 64  le = iTab;.  add
173f0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
17400 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
17410 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72  Ephemeral, pExpr
17420 2d 3e 69 54 61 62 6c 65 2c 20 6e 56 61 6c 29 3b  ->iTable, nVal);
17430 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17440 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
17450 4d 4d 45 4e 54 53 0a 20 20 69 66 28 20 45 78 70  MMENTS.  if( Exp
17460 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
17470 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
17480 29 20 29 7b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ) ){.    VdbeCom
17490 6d 65 6e 74 28 28 76 2c 20 22 52 65 73 75 6c 74  ment((v, "Result
174a0 20 6f 66 20 53 45 4c 45 43 54 20 25 75 22 2c 20   of SELECT %u", 
174b0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
174c0 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 7d 65 6c  ->selId));.  }el
174d0 73 65 7b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  se{.    VdbeComm
174e0 65 6e 74 28 28 76 2c 20 22 52 48 53 20 6f 66 20  ent((v, "RHS of 
174f0 49 4e 20 6f 70 65 72 61 74 6f 72 22 29 29 3b 0a  IN operator"));.
17500 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4b 65    }.#endif.  pKe
17510 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
17520 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72  eyInfoAlloc(pPar
17530 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31 29  se->db, nVal, 1)
17540 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ;..  if( ExprHas
17550 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
17560 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
17570 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20  .    /* Case 1: 
17580 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
17590 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 2a 2a 0a  ECT ...).    **.
175a0 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20      ** Generate 
175b0 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68  code to write th
175c0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
175d0 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65   select into the
175e0 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
175f0 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
17600 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
17610 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 53  ve..    */.    S
17620 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d  elect *pSelect =
17630 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
17640 74 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  t;.    ExprList 
17650 2a 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  *pEList = pSelec
17660 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20  t->pEList;..    
17670 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
17680 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73  ((pParse, 1, "%s
17690 4c 49 53 54 20 53 55 42 51 55 45 52 59 20 25 64  LIST SUBQUERY %d
176a0 22 2c 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f  ",.        addrO
176b0 6e 63 65 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54  nce?"":"CORRELAT
176c0 45 44 20 22 2c 20 70 53 65 6c 65 63 74 2d 3e 73  ED ", pSelect->s
176d0 65 6c 49 64 0a 20 20 20 20 29 29 3b 0a 20 20 20  elId.    ));.   
176e0 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20 61   /* If the LHS a
176f0 6e 64 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  nd RHS of the IN
17700 20 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74   operator do not
17710 20 6d 61 74 63 68 2c 20 74 68 61 74 0a 20 20 20   match, that.   
17720 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c 20 68   ** error will h
17730 61 76 65 20 62 65 65 6e 20 63 61 75 67 68 74 20  ave been caught 
17740 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77 65 20 72  long before we r
17750 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2e  each this point.
17760 20 2a 2f 0a 20 20 20 20 69 66 28 20 41 4c 57 41   */.    if( ALWA
17770 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  YS(pEList->nExpr
17780 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20  ==nVal) ){.     
17790 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
177a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
177b0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
177c0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
177d0 2c 20 53 52 54 5f 53 65 74 2c 20 69 54 61 62 29  , SRT_Set, iTab)
177e0 3b 0a 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66  ;.      dest.zAf
177f0 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66  fSdst = exprINAf
17800 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
17810 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 53 65  Expr);.      pSe
17820 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  lect->iLimit = 0
17830 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17840 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c  ( pSelect->selFl
17850 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
17860 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
17870 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30  ase( pKeyInfo==0
17880 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62 79   ); /* Caused by
17890 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b   OOM in sqlite3K
178a0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f  eyInfoAlloc() */
178b0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
178c0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
178d0 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
178e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
178f0 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
17900 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53  ->db, dest.zAffS
17910 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  dst);.        sq
17920 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
17930 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  f(pKeyInfo);.   
17940 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
17950 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
17960 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
17970 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64  >db, dest.zAffSd
17980 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  st);.      asser
17990 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29  t( pKeyInfo!=0 )
179a0 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61  ; /* OOM will ca
179b0 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73  use exit after s
179c0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a  qlite3Select() *
179d0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
179e0 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
179f0 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
17a00 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
17a10 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
17a20 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
17a30 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20  eable(pKeyInfo) 
17a40 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
17a50 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nVal; i++){.
17a60 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20          Expr *p 
17a70 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
17a80 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66  ieldSubexpr(pLef
17a90 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70  t, i);.        p
17aa0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
17ab0 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  ] = sqlite3Binar
17ac0 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
17ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
17ae0 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e  rse, p, pEList->
17af0 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20 20 20 20  a[i].pExpr.     
17b00 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
17b10 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
17b20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e  ALWAYS(pExpr->x.
17b30 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  pList!=0) ){.   
17b40 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
17b50 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
17b60 74 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t).    **.    **
17b70 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
17b80 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69  sion, build an i
17b90 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68  ndex key from th
17ba0 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64  e evaluation and
17bb0 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74  .    ** store it
17bc0 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
17bd0 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70  y table. If <exp
17be0 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  r> is a column, 
17bf0 74 68 65 6e 20 75 73 65 0a 20 20 20 20 2a 2a 20  then use.    ** 
17c00 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
17c10 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
17c20 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
17c30 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
17c40 0a 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e  .    ** a column
17c50 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66  , use numeric af
17c60 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20  finity..    */. 
17c70 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
17c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
17c90 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  Affinity of the 
17ca0 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f  LHS of the IN */
17cb0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
17cc0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
17cd0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
17ce0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  ;.    struct Exp
17cf0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
17d00 6d 3b 0a 20 20 20 20 69 6e 74 20 72 31 2c 20 72  m;.    int r1, r
17d10 32 2c 20 72 33 3b 0a 20 20 20 20 61 66 66 69 6e  2, r3;.    affin
17d20 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
17d30 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29  rAffinity(pLeft)
17d40 3b 0a 20 20 20 20 69 66 28 20 21 61 66 66 69 6e  ;.    if( !affin
17d50 69 74 79 20 29 7b 0a 20 20 20 20 20 20 61 66 66  ity ){.      aff
17d60 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
17d70 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20  FF_BLOB;.    }. 
17d80 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
17d90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
17da0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
17db0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
17dc0 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 70 4b  nfo) );.      pK
17dd0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
17de0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17df0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
17e00 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
17e10 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20   }..    /* Loop 
17e20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
17e30 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
17e40 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 72 31  list>. */.    r1
17e50 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
17e60 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
17e70 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
17e80 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
17e90 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73  ;.    for(i=pLis
17ea0 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
17eb0 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  pList->a; i>0; i
17ec0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
17ed0 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
17ee0 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20  pItem->pExpr;.. 
17ef0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
17f00 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
17f10 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
17f20 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
17f30 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
17f40 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61  the test that wa
17f50 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76  s generated abov
17f60 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
17f70 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  e.      ** this 
17f80 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74  code only execut
17f90 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73  es once.  Becaus
17fa0 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73  e for a non-cons
17fb0 74 61 6e 74 0a 20 20 20 20 20 20 2a 2a 20 65 78  tant.      ** ex
17fc0 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
17fd0 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
17fe0 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
17ff0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
18000 28 20 61 64 64 72 4f 6e 63 65 20 26 26 20 21 73  ( addrOnce && !s
18010 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
18020 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20  tant(pE2) ){.   
18030 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18040 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
18050 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 20  addrOnce);.     
18060 20 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70     ExprClearProp
18070 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
18080 75 62 72 74 6e 29 3b 0a 20 20 20 20 20 20 20 20  ubrtn);.        
18090 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20  addrOnce = 0;.  
180a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
180b0 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
180c0 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
180d0 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
180e0 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
180f0 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45     r3 = sqlite3E
18100 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
18110 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a  arse, pE2, r1);.
18120 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18130 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
18140 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c  keRecord, r3, 1,
18150 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20   r2, &affinity, 
18160 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
18170 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
18180 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
18190 69 54 61 62 2c 20 72 32 2c 20 72 33 2c 20 31 29  iTab, r2, r3, 1)
181a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
181b0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
181c0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
181d0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
181e0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
181f0 20 72 32 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20   r2);.  }.  if( 
18200 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
18210 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
18220 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f  eP4(v, addr, (vo
18230 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  id *)pKeyInfo, P
18240 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 7d 0a  4_KEYINFO);.  }.
18250 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29    if( addrOnce )
18260 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
18270 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
18280 72 4f 6e 63 65 29 3b 0a 20 20 20 20 2f 2a 20 53  rOnce);.    /* S
18290 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
182a0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
182b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
182c0 52 65 74 75 72 6e 2c 20 70 45 78 70 72 2d 3e 79  Return, pExpr->y
182d0 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29 3b  .sub.regReturn);
182e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
182f0 43 68 61 6e 67 65 50 31 28 76 2c 20 70 45 78 70  ChangeP1(v, pExp
18300 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 2d 31  r->y.sub.iAddr-1
18310 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
18320 72 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a  rentAddr(v)-1);.
18330 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
18340 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
18350 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  UERY */../*.** G
18360 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
18370 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69   scalar subqueri
18380 65 73 20 75 73 65 64 20 61 73 20 61 20 73 75 62  es used as a sub
18390 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
183a0 0a 2a 2a 20 6f 72 20 45 58 49 53 54 53 20 6f 70  .** or EXISTS op
183b0 65 72 61 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  erator:.**.**   
183c0 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d    (SELECT a FROM
183d0 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20   b)          -- 
183e0 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
183f0 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61  EXISTS (SELECT a
18400 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58   FROM b)   -- EX
18410 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a  ISTS subquery.**
18420 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
18430 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 53  rameter is the S
18440 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 20  ELECT or EXISTS 
18450 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 63  operator to be c
18460 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
18470 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f  register that ho
18480 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 2e 20  lds the result. 
18490 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c   For a multi-col
184a0 75 6d 6e 20 53 45 4c 45 43 54 2c 20 0a 2a 2a 20  umn SELECT, .** 
184b0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
184c0 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67  ored in a contig
184d0 75 6f 75 73 20 61 72 72 61 79 20 6f 66 20 72 65  uous array of re
184e0 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 0a  gisters and the.
184f0 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
18500 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20  is the register 
18510 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  of the left-most
18520 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 0a   result column..
18530 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 61  ** Return 0 if a
18540 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
18550 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
18560 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
18570 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53  int sqlite3CodeS
18580 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ubselect(Parse *
18590 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
185a0 78 70 72 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  xpr){.  int addr
185b0 4f 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Once = 0;       
185c0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
185d0 66 20 4f 50 5f 4f 6e 63 65 20 61 74 20 74 6f 70  f OP_Once at top
185e0 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 2a   of subroutine *
185f0 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30  /.  int rReg = 0
18600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18610 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72  /* Register stor
18620 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f  ing resulting */
18630 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
18640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18650 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
18660 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a  nt to encode */.
18670 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
18680 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
18690 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74   How to deal wit
186a0 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20  h SELECT result 
186b0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20  */.  int nReg;  
186c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186d0 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f   /* Registers to
186e0 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 45   allocate */.  E
186f0 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20  xpr *pLimit;    
18700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
18710 77 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69  w limit expressi
18720 6f 6e 20 2a 2f 0a 0a 20 20 56 64 62 65 20 2a 76  on */..  Vdbe *v
18730 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
18740 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
18750 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
18760 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
18770 49 53 54 53 20 29 3b 0a 20 20 74 65 73 74 63 61  ISTS );.  testca
18780 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
18790 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 61 73  K_SELECT );.  as
187a0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
187b0 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45  =TK_EXISTS || pE
187c0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
187d0 43 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CT );.  assert( 
187e0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
187f0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
18800 65 63 74 29 20 29 3b 0a 20 20 70 53 65 6c 20 3d  ect) );.  pSel =
18810 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
18820 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61  t;..  /* The eva
18830 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  luation of the E
18840 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73  XISTS/SELECT mus
18850 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65 76  t be repeated ev
18860 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a  ery time it.  **
18870 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
18880 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
18890 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
188a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
188b0 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
188c0 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
188d0 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
188e0 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
188f0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
18900 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
18910 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
18920 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
18930 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
18940 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
18950 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
18960 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
18970 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
18980 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75  run this code ju
18990 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76  st once.  ** sav
189a0 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61  e the results, a
189b0 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  nd reuse the sam
189c0 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  e result on subs
189d0 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
189e0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
189f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
18a00 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
18a10 65 63 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ect) ){.    /* I
18a20 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68  f this routine h
18a30 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
18a40 63 6f 64 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  coded, then invo
18a50 6b 65 20 69 74 20 61 73 20 61 0a 20 20 20 20 2a  ke it as a.    *
18a60 2a 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 2a 2f  * subroutine. */
18a70 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
18a80 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
18a90 45 50 5f 53 75 62 72 74 6e 29 20 29 7b 0a 20 20  EP_Subrtn) ){.  
18aa0 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
18ab0 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c  Plan((pParse, 0,
18ac0 20 22 52 45 55 53 45 20 53 55 42 51 55 45 52 59   "REUSE SUBQUERY
18ad0 20 25 64 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49   %d", pSel->selI
18ae0 64 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d));.      sqlit
18af0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18b00 4f 50 5f 47 6f 73 75 62 2c 20 70 45 78 70 72 2d  OP_Gosub, pExpr-
18b10 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e  >y.sub.regReturn
18b20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18b30 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
18b40 3e 79 2e 73 75 62 2e 69 41 64 64 72 29 3b 0a 20  >y.sub.iAddr);. 
18b50 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70       return pExp
18b60 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d  r->iTable;.    }
18b70 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 63  ..    /* Begin c
18b80 6f 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  oding the subrou
18b90 74 69 6e 65 20 2a 2f 0a 20 20 20 20 45 78 70 72  tine */.    Expr
18ba0 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
18bb0 72 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b 0a 20  r, EP_Subrtn);. 
18bc0 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e     pExpr->y.sub.
18bd0 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
18be0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
18bf0 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64  pExpr->y.sub.iAd
18c00 64 72 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  dr =.      sqlit
18c10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18c20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
18c30 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52  Expr->y.sub.regR
18c40 65 74 75 72 6e 29 20 2b 20 31 3b 0a 20 20 20 20  eturn) + 1;.    
18c50 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
18c60 22 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 22  "return address"
18c70 29 29 3b 0a 0a 20 20 20 20 61 64 64 72 4f 6e 63  ));..    addrOnc
18c80 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
18c90 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
18ca0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
18cb0 76 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  v);.  }.  .  /* 
18cc0 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65  For a SELECT, ge
18cd0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
18ce0 75 74 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f  ut the values fo
18cf0 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  r all columns of
18d00 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
18d10 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61  row into an arra
18d20 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61  y of registers a
18d30 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e  nd return the in
18d40 64 65 78 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  dex of.  ** the 
18d50 66 69 72 73 74 20 72 65 67 69 73 74 65 72 2e 0a  first register..
18d60 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
18d70 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20  s is an EXISTS, 
18d80 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72  write an integer
18d90 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20   0 (not exists) 
18da0 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a 20 20  or 1 (exists).  
18db0 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
18dc0 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  er and return th
18dd0 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  at register numb
18de0 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  er..  **.  ** In
18df0 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65   both cases, the
18e00 20 71 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e   query is augmen
18e10 74 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20  ted with "LIMIT 
18e20 31 22 2e 20 20 41 6e 79 20 0a 20 20 2a 2a 20 70  1".  Any .  ** p
18e30 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74  reexisting limit
18e40 20 69 73 20 64 69 73 63 61 72 64 65 64 20 69 6e   is discarded in
18e50 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65   place of the ne
18e60 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 2a 2f 0a  w LIMIT 1..  */.
18e70 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
18e80 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
18e90 25 73 53 43 41 4c 41 52 20 53 55 42 51 55 45 52  %sSCALAR SUBQUER
18ea0 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 61  Y %d",.        a
18eb0 64 64 72 4f 6e 63 65 3f 22 22 3a 22 43 4f 52 52  ddrOnce?"":"CORR
18ec0 45 4c 41 54 45 44 20 22 2c 20 70 53 65 6c 2d 3e  ELATED ", pSel->
18ed0 73 65 6c 49 64 29 29 3b 0a 20 20 6e 52 65 67 20  selId));.  nReg 
18ee0 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  = pExpr->op==TK_
18ef0 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70  SELECT ? pSel->p
18f00 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31  EList->nExpr : 1
18f10 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
18f20 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
18f30 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d   0, pParse->nMem
18f40 2b 31 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  +1);.  pParse->n
18f50 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 69  Mem += nReg;.  i
18f60 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
18f70 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 64  _SELECT ){.    d
18f80 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
18f90 4d 65 6d 3b 0a 20 20 20 20 64 65 73 74 2e 69 53  Mem;.    dest.iS
18fa0 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61  dst = dest.iSDPa
18fb0 72 6d 3b 0a 20 20 20 20 64 65 73 74 2e 6e 53 64  rm;.    dest.nSd
18fc0 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 73  st = nReg;.    s
18fd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
18fe0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
18ff0 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64 65  dest.iSDParm, de
19000 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d  st.iSDParm+nReg-
19010 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  1);.    VdbeComm
19020 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75  ent((v, "Init su
19030 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29  bquery result"))
19040 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
19050 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
19060 45 78 69 73 74 73 3b 0a 20 20 20 20 73 71 6c 69  Exists;.    sqli
19070 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19080 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
19090 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
190a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
190b0 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20  v, "Init EXISTS 
190c0 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 7d 0a 20  result"));.  }. 
190d0 20 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65   pLimit = sqlite
190e0 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
190f0 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  e->db, TK_INTEGE
19100 52 2c 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  R,&sqlite3IntTok
19110 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66  ens[1], 0);.  if
19120 28 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 29  ( pSel->pLimit )
19130 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
19140 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
19150 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
19160 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 53  ->pLeft);.    pS
19170 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  el->pLimit->pLef
19180 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 7d 65  t = pLimit;.  }e
19190 6c 73 65 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70  lse{.    pSel->p
191a0 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
191b0 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
191c0 4c 49 4d 49 54 2c 20 70 4c 69 6d 69 74 2c 20 30  LIMIT, pLimit, 0
191d0 29 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 2d 3e 69  );.  }.  pSel->i
191e0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 66 28  Limit = 0;.  if(
191f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
19200 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65  Parse, pSel, &de
19210 73 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  st) ){.    retur
19220 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72  n 0;.  }.  pExpr
19230 2d 3e 69 54 61 62 6c 65 20 3d 20 72 52 65 67 20  ->iTable = rReg 
19240 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
19250 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
19260 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
19270 6f 52 65 64 75 63 65 29 3b 0a 20 20 69 66 28 20  oReduce);.  if( 
19280 61 64 64 72 4f 6e 63 65 20 29 7b 0a 20 20 20 20  addrOnce ){.    
19290 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
192a0 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29  ere(v, addrOnce)
192b0 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 72 6f 75  ;..    /* Subrou
192c0 74 69 6e 65 20 72 65 74 75 72 6e 20 2a 2f 0a 20  tine return */. 
192d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
192e0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
192f0 6e 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e  n, pExpr->y.sub.
19300 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
19310 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
19320 65 50 31 28 76 2c 20 70 45 78 70 72 2d 3e 79 2e  eP1(v, pExpr->y.
19330 73 75 62 2e 69 41 64 64 72 2d 31 2c 20 73 71 6c  sub.iAddr-1, sql
19340 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
19350 64 64 72 28 76 29 2d 31 29 3b 0a 20 20 7d 0a 0a  ddr(v)-1);.  }..
19360 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d    return rReg;.}
19370 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19380 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
19390 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
193a0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
193b0 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20  ./*.** Expr pIn 
193c0 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78  is an IN(...) ex
193d0 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66  pression. This f
193e0 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74  unction checks t
193f0 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d  hat the .** sub-
19400 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48  select on the RH
19410 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70  S of the IN() op
19420 65 72 61 74 6f 72 20 68 61 73 20 74 68 65 20 73  erator has the s
19430 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  ame number of .*
19440 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65  * columns as the
19450 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c   vector on the L
19460 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52  HS. Or, if the R
19470 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69  HS of the IN() i
19480 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d  s not .** a sub-
19490 71 75 65 72 79 2c 20 74 68 61 74 20 74 68 65 20  query, that the 
194a0 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 20  LHS is a vector 
194b0 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e  of size 1..*/.in
194c0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
194d0 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72  ckIN(Parse *pPar
194e0 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a  se, Expr *pIn){.
194f0 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20    int nVector = 
19500 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
19510 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74  rSize(pIn->pLeft
19520 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66  );.  if( (pIn->f
19530 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
19540 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ect) ){.    if( 
19550 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e  nVector!=pIn->x.
19560 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
19570 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
19580 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
19590 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49  Error(pParse, pI
195a0 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  n->x.pSelect->pE
195b0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65  List->nExpr, nVe
195c0 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ctor);.      ret
195d0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
195e0 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72  else if( nVector
195f0 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=1 ){.    sqlit
19600 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67  e3VectorErrorMsg
19610 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 70 4c  (pParse, pIn->pL
19620 65 66 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  eft);.    return
19630 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
19640 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   0;.}.#endif..#i
19650 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19660 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
19670 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
19680 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73  or an IN express
19690 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ion..**.**      
196a0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
196b0 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  ).**      x IN (
196c0 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
196d0 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  .).**.** The lef
196e0 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53  t-hand side (LHS
196f0 29 20 69 73 20 61 20 73 63 61 6c 61 72 20 6f 72  ) is a scalar or
19700 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69   vector expressi
19710 6f 6e 2e 20 20 54 68 65 20 0a 2a 2a 20 72 69 67  on.  The .** rig
19720 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
19730 53 29 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  S) is an array o
19740 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73  f zero or more s
19750 63 61 6c 61 72 20 76 61 6c 75 65 73 2c 20 6f 72  calar values, or
19760 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 2e 20   a.** subquery. 
19770 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61   If the RHS is a
19780 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 20 6e   subquery, the n
19790 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
197a0 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20  columns must.** 
197b0 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
197c0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
197d0 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65  he vector on the
197e0 20 4c 48 53 2e 20 20 49 66 20 74 68 65 20 52 48   LHS.  If the RH
197f0 53 20 69 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f  S is.** a list o
19800 66 20 76 61 6c 75 65 73 2c 20 74 68 65 20 4c 48  f values, the LH
19810 53 20 6d 75 73 74 20 62 65 20 61 20 73 63 61 6c  S must be a scal
19820 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49  ar. .**.** The I
19830 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 74 72  N operator is tr
19840 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 76 61  ue if the LHS va
19850 6c 75 65 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  lue is contained
19860 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
19870 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
19880 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 4c  s false if the L
19890 48 53 20 69 73 20 64 65 66 69 6e 69 74 65 6c 79  HS is definitely
198a0 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 48 53 2e   not in the RHS.
198b0 20 20 54 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74    The .** result
198c0 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
198d0 70 72 65 73 65 6e 63 65 20 6f 66 20 74 68 65 20  presence of the 
198e0 4c 48 53 20 69 6e 20 74 68 65 20 52 48 53 20 63  LHS in the RHS c
198f0 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74  annot be .** det
19900 65 72 6d 69 6e 65 64 20 64 75 65 20 74 6f 20 4e  ermined due to N
19910 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ULLs..**.** This
19920 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
19930 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d  es code that jum
19940 70 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73  ps to destIfFals
19950 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
19960 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65  not .** containe
19970 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
19980 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c  .  If due to NUL
19990 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74  Ls we cannot det
199a0 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48  ermine if the LH
199b0 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65  S.** is containe
199c0 64 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  d in the RHS the
199d0 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66  n jump to destIf
199e0 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48  Null.  If the LH
199f0 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a  S is contained.*
19a00 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  * within the RHS
19a10 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
19a20 67 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68  gh..**.** See th
19a30 65 20 73 65 70 61 72 61 74 65 20 69 6e 2d 6f 70  e separate in-op
19a40 65 72 61 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65  erator.md docume
19a50 6e 74 61 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20  ntation file in 
19a60 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a  the canonical.**
19a70 20 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74   SQLite source t
19a80 72 65 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ree for addition
19a90 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
19aa0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
19ab0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
19ac0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
19ad0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
19ae0 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
19af0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
19b00 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
19b10 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
19b20 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  he IN expression
19b30 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
19b40 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a  False,      /* J
19b50 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53 20  ump here if LHS 
19b60 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
19b70 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   in the RHS */. 
19b80 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
19b90 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
19ba0 65 72 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  ere if the resul
19bb0 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64  ts are unknown d
19bc0 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29  ue to NULLs */.)
19bd0 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e  {.  int rRhsHasN
19be0 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67  ull = 0;  /* Reg
19bf0 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74 72  ister that is tr
19c00 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69  ue if RHS contai
19c10 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a  ns NULL values *
19c20 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20  /.  int eType;  
19c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
19c40 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a  e of the RHS */.
19c50 20 20 69 6e 74 20 72 4c 68 73 3b 20 20 20 20 20    int rLhs;     
19c60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
19c70 74 65 72 28 73 29 20 68 6f 6c 64 69 6e 67 20 74  ter(s) holding t
19c80 68 65 20 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f  he LHS values */
19c90 0a 20 20 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b  .  int rLhsOrig;
19ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20           /* LHS 
19cb0 76 61 6c 75 65 73 20 70 72 69 6f 72 20 74 6f 20  values prior to 
19cc0 72 65 6f 72 64 65 72 69 6e 67 20 62 79 20 61 69  reordering by ai
19cd0 4d 61 70 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20  Map[] */.  Vdbe 
19ce0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
19cf0 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e   /* Statement un
19d00 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
19d10 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70   */.  int *aiMap
19d20 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d   = 0;       /* M
19d30 61 70 20 66 72 6f 6d 20 76 65 63 74 6f 72 20 66  ap from vector f
19d40 69 65 6c 64 20 74 6f 20 69 6e 64 65 78 20 63 6f  ield to index co
19d50 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
19d60 7a 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20  zAff = 0;       
19d70 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
19d80 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ng for compariso
19d90 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63  ns */.  int nVec
19da0 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tor;          /*
19db0 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 73   Size of vectors
19dc0 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65   for this IN ope
19dd0 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
19de0 44 75 6d 6d 79 3b 20 20 20 20 20 20 20 20 20 20  Dummy;          
19df0 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61 6d 65   /* Dummy parame
19e00 74 65 72 20 74 6f 20 65 78 70 72 43 6f 64 65 56  ter to exprCodeV
19e10 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70  ector() */.  Exp
19e20 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  r *pLeft;       
19e30 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66     /* The LHS of
19e40 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
19e50 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
19e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
19e70 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
19e80 20 69 6e 74 20 64 65 73 74 53 74 65 70 32 3b 20   int destStep2; 
19e90 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
19ea0 74 6f 20 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c  to jump when NUL
19eb0 4c 73 20 73 65 65 6e 20 69 6e 20 73 74 65 70 20  Ls seen in step 
19ec0 32 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53  2 */.  int destS
19ed0 74 65 70 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tep6 = 0;    /* 
19ee0 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20 66 6f  Start of code fo
19ef0 72 20 53 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e  r Step 6 */.  in
19f00 74 20 61 64 64 72 54 72 75 74 68 4f 70 3b 20 20  t addrTruthOp;  
19f10 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19f20 66 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 65  f opcode that de
19f30 74 65 72 6d 69 6e 65 73 20 74 68 65 20 49 4e 20  termines the IN 
19f40 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
19f50 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20   destNotNull;   
19f60 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
19f70 69 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  if a comparison 
19f80 69 73 20 6e 6f 74 20 74 72 75 65 20 69 6e 20 73  is not true in s
19f90 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61  tep 6 */.  int a
19fa0 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
19fb0 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 73   /* Top of the s
19fc0 74 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 20  tep-6 loop */ . 
19fd0 20 69 6e 74 20 69 54 61 62 20 3d 20 30 3b 20 20   int iTab = 0;  
19fe0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
19ff0 74 6f 20 75 73 65 20 2a 2f 0a 0a 20 20 70 4c 65  to use */..  pLe
1a000 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
1a010 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  t;.  if( sqlite3
1a020 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72  ExprCheckIN(pPar
1a030 73 65 2c 20 70 45 78 70 72 29 20 29 20 72 65 74  se, pExpr) ) ret
1a040 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78  urn;.  zAff = ex
1a050 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61  prINAffinity(pPa
1a060 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e  rse, pExpr);.  n
1a070 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Vector = sqlite3
1a080 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
1a090 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1a0a0 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71  aiMap = (int*)sq
1a0b0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1a0c0 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  o(.      pParse-
1a0d0 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69  >db, nVector*(si
1a0e0 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65  zeof(int) + size
1a0f0 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20  of(char)) + 1.  
1a100 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
1a110 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1a120 64 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33  d ) goto sqlite3
1a130 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65  ExprCodeIN_oom_e
1a140 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65  rror;..  /* Atte
1a150 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  mpt to compute t
1a160 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74 68  he RHS. After th
1a170 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74  is step, if anyt
1a180 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a  hing other than.
1a190 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f    ** IN_INDEX_NO
1a1a0 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OP is returned, 
1a1b0 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64  the table opened
1a1c0 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 54 61   with cursor iTa
1a1d0 62 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  b.  ** contains 
1a1e0 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
1a1f0 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e  make up the RHS.
1a200 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f   If IN_INDEX_NOO
1a210 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20  P is returned,. 
1a220 20 2a 2a 20 74 68 65 20 52 48 53 20 68 61 73 20   ** the RHS has 
1a230 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
1a240 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50  ed.  */.  v = pP
1a250 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
1a260 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
1a270 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65       /* OOM dete
1a280 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  cted prior to th
1a290 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  is routine */.  
1a2a0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1a2b0 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78  (v, "begin IN ex
1a2c0 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d  pr"));.  eType =
1a2d0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
1a2e0 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70  dex(pParse, pExp
1a2f0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
1a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a310 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
1a320 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e  HIP | IN_INDEX_N
1a330 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20  OOP_OK,.        
1a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a350 20 20 20 20 20 64 65 73 74 49 66 46 61 6c 73 65       destIfFalse
1a360 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30  ==destIfNull ? 0
1a370 20 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c   : &rRhsHasNull,
1a380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 69                ai
1a3a0 4d 61 70 2c 20 26 69 54 61 62 29 3b 0a 0a 20 20  Map, &iTab);..  
1a3b0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1a3c0 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d  nErr || nVector=
1a3d0 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f  =1 || eType==IN_
1a3e0 49 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20 20  INDEX_EPH.      
1a3f0 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
1a400 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c  DEX_INDEX_ASC ||
1a410 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
1a420 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20 29  _INDEX_DESC .  )
1a430 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1a440 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69  DEBUG.  /* Confi
1a450 72 6d 20 74 68 61 74 20 61 69 4d 61 70 5b 5d 20  rm that aiMap[] 
1a460 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f 72  contains nVector
1a470 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
1a480 62 65 74 77 65 65 6e 20 30 20 61 6e 64 0a 20 20  between 0 and.  
1a490 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f  ** nVector-1. */
1a4a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
1a4b0 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
1a4c0 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20   int j, cnt;.   
1a4d0 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c   for(cnt=j=0; j<
1a4e0 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66  nVector; j++) if
1a4f0 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20  ( aiMap[j]==i ) 
1a500 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  cnt++;.    asser
1a510 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d  t( cnt==1 );.  }
1a520 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
1a530 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20  de the LHS, the 
1a540 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
1a550 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49  pr> IN (...)". I
1a560 66 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a  f the LHS is a .
1a570 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65    ** vector, the
1a580 6e 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69  n it is stored i
1a590 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56  n an array of nV
1a5a0 65 63 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  ector registers 
1a5b0 73 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61  starting .  ** a
1a5c0 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t r1..  **.  ** 
1a5d0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
1a5e0 65 78 28 29 20 6d 69 67 68 74 20 68 61 76 65 20  ex() might have 
1a5f0 72 65 6f 72 64 65 72 65 64 20 74 68 65 20 66 69  reordered the fi
1a600 65 6c 64 73 20 6f 66 20 74 68 65 20 4c 48 53 20  elds of the LHS 
1a610 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74  vector.  ** so t
1a620 68 61 74 20 74 68 65 20 66 69 65 6c 64 73 20 61  hat the fields a
1a630 72 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f  re in the same o
1a640 72 64 65 72 20 61 73 20 61 6e 20 65 78 69 73 74  rder as an exist
1a650 69 6e 67 20 69 6e 64 65 78 2e 20 20 20 54 68 65  ing index.   The
1a660 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72  .  ** aiMap[] ar
1a670 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ray contains a m
1a680 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  apping from the 
1a690 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20 66 69 65  original LHS fie
1a6a0 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  ld order to.  **
1a6b0 20 74 68 65 20 66 69 65 6c 64 20 6f 72 64 65 72   the field order
1a6c0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
1a6d0 65 20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a  e RHS index..  *
1a6e0 2f 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d 20 65  /.  rLhsOrig = e
1a6f0 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
1a700 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 69 44  arse, pLeft, &iD
1a710 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ummy);.  for(i=0
1a720 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26 26 20 61  ; i<nVector && a
1a730 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29  iMap[i]==i; i++)
1a740 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20 66 69  {} /* Are LHS fi
1a750 65 6c 64 73 20 72 65 6f 72 64 65 72 65 64 3f 20  elds reordered? 
1a760 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65 63  */.  if( i==nVec
1a770 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48  tor ){.    /* LH
1a780 53 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74  S fields are not
1a790 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20   reordered */.  
1a7a0 20 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69    rLhs = rLhsOri
1a7b0 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
1a7c0 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f 72 64  /* Need to reord
1a7d0 65 72 20 74 68 65 20 4c 48 53 20 66 69 65 6c 64  er the LHS field
1a7e0 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61  s according to a
1a7f0 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73  iMap */.    rLhs
1a800 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1a810 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1a820 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72  Vector);.    for
1a830 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
1a840 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1a850 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1a860 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f  , OP_Copy, rLhsO
1a870 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61  rig+i, rLhs+aiMa
1a880 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  p[i], 0);.    }.
1a890 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c    }..  /* If sql
1a8a0 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
1a8b0 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f  ) did not find o
1a8c0 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  r create an inde
1a8d0 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73  x that is.  ** s
1a8e0 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c  uitable for eval
1a8f0 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70  uating the IN op
1a900 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61  erator, then eva
1a910 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20  luate using a.  
1a920 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63  ** sequence of c
1a930 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a  omparisons..  **
1a940 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 74  .  ** This is st
1a950 65 70 20 28 31 29 20 69 6e 20 74 68 65 20 69 6e  ep (1) in the in
1a960 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74  -operator.md opt
1a970 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d  imized algorithm
1a980 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1a990 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  pe==IN_INDEX_NOO
1a9a0 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  P ){.    ExprLis
1a9b0 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
1a9c0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43  ->x.pList;.    C
1a9d0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
1a9e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1a9f0 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
1aa00 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e  ->pLeft);.    in
1aa10 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69  t labelOk = sqli
1aa20 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1aa30 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 6e  (pParse);.    in
1aa40 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b  t r2, regToFree;
1aa50 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75  .    int regCkNu
1aa60 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ll = 0;.    int 
1aa70 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ii;.    assert( 
1aa80 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1aa90 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1aaa0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
1aab0 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73   destIfNull!=des
1aac0 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
1aad0 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71    regCkNull = sq
1aae0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1aaf0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1ab00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1ab10 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72  (v, OP_BitAnd, r
1ab20 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b  Lhs, rLhs, regCk
1ab30 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Null);.    }.   
1ab40 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c   for(ii=0; ii<pL
1ab50 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  ist->nExpr; ii++
1ab60 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  ){.      r2 = sq
1ab70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1ab80 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  p(pParse, pList-
1ab90 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72  >a[ii].pExpr, &r
1aba0 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20  egToFree);.     
1abb0 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26   if( regCkNull &
1abc0 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  & sqlite3ExprCan
1abd0 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b  BeNull(pList->a[
1abe0 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  ii].pExpr) ){.  
1abf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ac00 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69  eAddOp3(v, OP_Bi
1ac10 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c  tAnd, regCkNull,
1ac20 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b   r2, regCkNull);
1ac30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1ac40 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  f( ii<pList->nEx
1ac50 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75  pr-1 || destIfNu
1ac60 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll!=destIfFalse 
1ac70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ac80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1ac90 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62  OP_Eq, rLhs, lab
1aca0 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20  elOk, r2,.      
1acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acc0 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c      (void*)pColl
1acd0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
1ace0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1acf0 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73  ageIf(v, ii<pLis
1ad00 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
1ad10 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1ad20 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74  eIf(v, ii==pList
1ad30 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
1ad40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1ad50 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b  hangeP5(v, zAff[
1ad60 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
1ad70 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1ad80 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65  ( destIfNull==de
1ad90 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20  stIfFalse );.   
1ada0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1adb0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp4(v, OP_Ne,
1adc0 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61 6c   rLhs, destIfFal
1add0 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20  se, r2,.        
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adf0 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
1ae00 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62  P4_COLLSEQ); Vdb
1ae10 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1ae20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ae30 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66  eChangeP5(v, zAf
1ae40 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55  f[0] | SQLITE_JU
1ae50 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1ae60 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1ae70 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1ae80 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65  Parse, regToFree
1ae90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1aea0 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20   regCkNull ){.  
1aeb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1aec0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
1aed0 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64  ll, regCkNull, d
1aee0 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65  estIfNull); Vdbe
1aef0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1af00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1af10 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  to(v, destIfFals
1af20 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
1af30 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1af40 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b  Label(v, labelOk
1af50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1af60 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1af70 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b  rse, regCkNull);
1af80 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65  .    goto sqlite
1af90 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
1afa0 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  shed;.  }..  /* 
1afb0 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74 6f  Step 2: Check to
1afc0 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20   see if the LHS 
1afd0 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c  contains any NUL
1afe0 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74  L columns.  If t
1aff0 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73  he.  ** LHS does
1b000 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74   contain NULLs t
1b010 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d  hen the result m
1b020 75 73 74 20 62 65 20 65 69 74 68 65 72 20 46 41  ust be either FA
1b030 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a  LSE or NULL..  *
1b040 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20 73  * We will then s
1b050 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79 20 73  kip the binary s
1b060 65 61 72 63 68 20 6f 66 20 74 68 65 20 52 48 53  earch of the RHS
1b070 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  ..  */.  if( des
1b080 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
1b090 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73 74  alse ){.    dest
1b0a0 53 74 65 70 32 20 3d 20 64 65 73 74 49 66 46 61  Step2 = destIfFa
1b0b0 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lse;.  }else{.  
1b0c0 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64 65    destStep2 = de
1b0d0 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74 65  stStep6 = sqlite
1b0e0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
1b0f0 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  Parse);.  }.  fo
1b100 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
1b110 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
1b120 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63   *p = sqlite3Vec
1b130 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
1b140 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29  pExpr->pLeft, i)
1b150 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1b160 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
1b170 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1b180 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b190 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b  OP_IsNull, rLhs+
1b1a0 69 2c 20 64 65 73 74 53 74 65 70 32 29 3b 0a 20  i, destStep2);. 
1b1b0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1b1c0 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e(v);.    }.  }.
1b1d0 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e 20 20 54  .  /* Step 3.  T
1b1e0 68 65 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e  he LHS is now kn
1b1f0 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55  own to be non-NU
1b200 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62 69 6e 61  LL.  Do the bina
1b210 72 79 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f  ry search.  ** o
1b220 66 20 74 68 65 20 52 48 53 20 75 73 69 6e 67 20  f the RHS using 
1b230 74 68 65 20 4c 48 53 20 61 73 20 61 20 70 72 6f  the LHS as a pro
1b240 62 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20 74  be.  If found, t
1b250 68 65 20 72 65 73 75 6c 74 20 69 73 0a 20 20 2a  he result is.  *
1b260 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69  * true..  */.  i
1b270 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
1b280 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
1b290 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
1b2a0 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20   the RHS is the 
1b2b0 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62  ROWID of table b
1b2c0 2d 74 72 65 65 20 61 6e 64 20 73 6f 20 77 65 20  -tree and so we 
1b2d0 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77  also.    ** know
1b2e0 20 74 68 61 74 20 74 68 65 20 52 48 53 20 69 73   that the RHS is
1b2f0 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63   non-NULL.  Henc
1b300 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20 73 74  e, we combine st
1b310 65 70 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20  eps 3 and 4.    
1b320 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ** into a single
1b330 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
1b340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b350 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69  3(v, OP_SeekRowi
1b360 64 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66 46  d, iTab, destIfF
1b370 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20  alse, rLhs);.   
1b380 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b390 3b 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f  ;.    addrTruthO
1b3a0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
1b3b0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
1b3c0 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54 72  );  /* Return Tr
1b3d0 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ue */.  }else{. 
1b3e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b3f0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp4(v, OP_Affin
1b400 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74  ity, rLhs, nVect
1b410 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65  or, 0, zAff, nVe
1b420 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 64  ctor);.    if( d
1b430 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
1b440 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
1b450 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70 20  /* Combine Step 
1b460 33 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e 74  3 and Step 5 int
1b470 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  o a single opcod
1b480 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
1b490 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1b4a0 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
1b4b0 69 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c 73  iTab, destIfFals
1b4c0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c                rL
1b4e0 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64  hs, nVector); Vd
1b4f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b500 20 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65       goto sqlite
1b510 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
1b520 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  shed;.    }.    
1b530 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70  /* Ordinary Step
1b540 20 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65   3, for the case
1b550 20 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64   where FALSE and
1b560 20 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e   NULL are distin
1b570 63 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72  ct */.    addrTr
1b580 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56  uthOp = sqlite3V
1b590 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1b5a0 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  OP_Found, iTab, 
1b5b0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5d0 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e           rLhs, n
1b5e0 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76  Vector); VdbeCov
1b5f0 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
1b600 20 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66 20   /* Step 4.  If 
1b610 74 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e  the RHS is known
1b620 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20   to be non-NULL 
1b630 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20 66  and we did not f
1b640 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63  ind.  ** an matc
1b650 68 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68 20  h on the search 
1b660 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20  above, then the 
1b670 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 46  result must be F
1b680 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALSE..  */.  if(
1b690 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20   rRhsHasNull && 
1b6a0 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20  nVector==1 ){.  
1b6b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b6c0 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op2(v, OP_NotNul
1b6d0 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  l, rRhsHasNull, 
1b6e0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1b6f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1b700 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65  );.  }..  /* Ste
1b710 70 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  p 5.  If we do n
1b720 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
1b730 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
1b740 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20  ween NULL and.  
1b750 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a  ** FALSE, then j
1b760 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65  ust return false
1b770 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  . .  */.  if( de
1b780 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
1b790 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33 56  fNull ) sqlite3V
1b7a0 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49  dbeGoto(v, destI
1b7b0 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53  fFalse);..  /* S
1b7c0 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f  tep 6: Loop thro
1b7d0 75 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65 20  ugh rows of the 
1b7e0 52 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65 61  RHS.  Compare ea
1b7f0 63 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c 48  ch row to the LH
1b800 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 63  S..  ** If any c
1b810 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c  omparison is NUL
1b820 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  L, then the resu
1b830 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20  lt is NULL.  If 
1b840 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69  all.  ** compari
1b850 73 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20 74  sons are FALSE t
1b860 68 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72 65  hen the final re
1b870 73 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a 20  sult is FALSE.. 
1b880 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73   **.  ** For a s
1b890 63 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69 73  calar LHS, it is
1b8a0 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 63   sufficient to c
1b8b0 68 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66 69  heck just the fi
1b8c0 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20  rst row.  ** of 
1b8d0 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
1b8e0 69 66 28 20 64 65 73 74 53 74 65 70 36 20 29 20  if( destStep6 ) 
1b8f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1b900 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 53  veLabel(v, destS
1b910 74 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f 70  tep6);.  addrTop
1b920 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1b930 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
1b940 64 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66 46  d, iTab, destIfF
1b950 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76  alse);.  VdbeCov
1b960 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20  erage(v);.  if( 
1b970 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  nVector>1 ){.   
1b980 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73   destNotNull = s
1b990 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1b9a0 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  bel(pParse);.  }
1b9b0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72  else{.    /* For
1b9c0 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d   nVector==1, com
1b9d0 62 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e 64  bine steps 6 and
1b9e0 20 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65 6c   7 by immediatel
1b9f0 79 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  y returning.    
1ba00 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20  ** FALSE if the 
1ba10 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e  first comparison
1ba20 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   is not NULL */.
1ba30 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20      destNotNull 
1ba40 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  = destIfFalse;. 
1ba50 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1ba60 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
1ba70 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
1ba80 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
1ba90 20 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71 6c      int r3 = sql
1baa0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1bab0 50 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d 20  Parse);.    p = 
1bac0 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
1bad0 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c  ldSubexpr(pLeft,
1bae0 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d   i);.    pColl =
1baf0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1bb00 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
1bb10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bb20 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
1bb30 6d 6e 2c 20 69 54 61 62 2c 20 69 2c 20 72 33 29  mn, iTab, i, r3)
1bb40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1bb50 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
1bb60 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f  , rLhs+i, destNo
1bb70 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20  tNull, r3,.     
1bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb90 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
1bba0 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
1bbb0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1bbc0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
1bbd0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1bbe0 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71  e, r3);.  }.  sq
1bbf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1bc00 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
1bc10 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66  estIfNull);.  if
1bc20 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20  ( nVector>1 ){. 
1bc30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1bc40 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1bc50 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20  stNotNull);.    
1bc60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bc70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  2(v, OP_Next, iT
1bc80 61 62 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a  ab, addrTop+1);.
1bc90 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1bca0 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65  (v);..    /* Ste
1bcb0 70 20 37 3a 20 20 49 66 20 77 65 20 72 65 61 63  p 7:  If we reac
1bcc0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65  h this point, we
1bcd0 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 72   know that the r
1bce0 65 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a  esult must.    *
1bcf0 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20  * be false. */. 
1bd00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bd10 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1bd20 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29   0, destIfFalse)
1bd30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  ;.  }..  /* Jump
1bd40 73 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20  s here in order 
1bd50 74 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20  to return true. 
1bd60 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1bd70 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1bd80 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74  TruthOp);..sqlit
1bd90 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
1bda0 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c 68  ished:.  if( rLh
1bdb0 73 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73 71  s!=rLhsOrig ) sq
1bdc0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1bdd0 52 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68 73  Reg(pParse, rLhs
1bde0 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
1bdf0 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70  ((v, "end IN exp
1be00 72 22 29 29 3b 0a 73 71 6c 69 74 65 33 45 78 70  r"));.sqlite3Exp
1be10 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f  rCodeIN_oom_erro
1be20 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  r:.  sqlite3DbFr
1be30 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61  ee(pParse->db, a
1be40 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  iMap);.  sqlite3
1be50 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1be60 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64  b, zAff);.}.#end
1be70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1be80 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
1be90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bea0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1beb0 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  T./*.** Generate
1bec0 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
1bed0 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
1bee0 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  e floating point
1bef0 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69  .** value descri
1bf00 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d  bed by z[0..n-1]
1bf10 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
1bf20 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  Mem..**.** The z
1bf30 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70  [] string will p
1bf40 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a  robably not be z
1bf50 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ero-terminated. 
1bf60 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e   But the .** z[n
1bf70 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67  ] character is g
1bf80 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1bf90 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64  something that d
1bfa0 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20  oes not look.** 
1bfb0 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75  like the continu
1bfc0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d  ation of the num
1bfd0 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
1bfe0 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62  oid codeReal(Vdb
1bff0 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
1c000 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46   *z, int negateF
1c010 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
1c020 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d    if( ALWAYS(z!=
1c030 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  0) ){.    double
1c040 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69   value;.    sqli
1c050 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75  te3AtoF(z, &valu
1c060 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
1c070 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54  30(z), SQLITE_UT
1c080 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  F8);.    assert(
1c090 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76   !sqlite3IsNaN(v
1c0a0 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20  alue) ); /* The 
1c0b0 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72  new AtoF never r
1c0c0 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20  eturns NaN */.  
1c0d0 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67    if( negateFlag
1c0e0 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75   ) value = -valu
1c0f0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e;.    sqlite3Vd
1c100 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
1c110 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d  OP_Real, 0, iMem
1c120 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65  , 0, (u8*)&value
1c130 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a  , P4_REAL);.  }.
1c140 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
1c150 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
1c160 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
1c170 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67  ll put the integ
1c180 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a  er describe by.*
1c190 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d  * text z[0..n-1]
1c1a0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
1c1b0 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e  Mem..**.** Expr.
1c1c0 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61  u.zToken is alwa
1c1d0 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f  ys UTF8 and zero
1c1e0 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a  -terminated..*/.
1c1f0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
1c200 49 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70  Integer(Parse *p
1c210 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1c220 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c  pr, int negFlag,
1c230 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64   int iMem){.  Vd
1c240 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1c250 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78  pVdbe;.  if( pEx
1c260 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
1c270 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
1c280 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e  nt i = pExpr->u.
1c290 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65  iValue;.    asse
1c2a0 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( i>=0 );.    
1c2b0 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20  if( negFlag ) i 
1c2c0 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -i;.    sqlite
1c2d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c2e0 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d  P_Integer, i, iM
1c2f0 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  em);.  }else{.  
1c300 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34    int c;.    i64
1c310 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73   value;.    cons
1c320 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70  t char *z = pExp
1c330 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
1c340 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
1c350 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33  .    c = sqlite3
1c360 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c  DecOrHexToI64(z,
1c370 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66   &value);.    if
1c380 28 20 28 63 3d 3d 33 20 26 26 20 21 6e 65 67 46  ( (c==3 && !negF
1c390 6c 61 67 29 20 7c 7c 20 28 63 3d 3d 32 29 20 7c  lag) || (c==2) |
1c3a0 7c 20 28 6e 65 67 46 6c 61 67 20 26 26 20 76 61  | (negFlag && va
1c3b0 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e  lue==SMALLEST_IN
1c3c0 54 36 34 29 29 7b 0a 23 69 66 64 65 66 20 53 51  T64)){.#ifdef SQ
1c3d0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1c3e0 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73  NG_POINT.      s
1c3f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1c400 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65  Parse, "oversize
1c410 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22  d integer: %s%s"
1c420 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20  , negFlag ? "-" 
1c430 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a  : "", z);.#else.
1c440 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c450 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a  MIT_HEX_INTEGER.
1c460 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1c470 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78  3_strnicmp(z,"0x
1c480 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",2)==0 ){.     
1c490 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c4a0 73 67 28 70 50 61 72 73 65 2c 20 22 68 65 78 20  sg(pParse, "hex 
1c4b0 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a  literal too big:
1c4c0 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 3f   %s%s", negFlag?
1c4d0 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20 20 20  "-":"",z);.     
1c4e0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1c4f0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f      {.        co
1c500 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67  deReal(v, z, neg
1c510 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  Flag, iMem);.   
1c520 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1c530 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
1c540 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75   negFlag ){ valu
1c550 65 20 3d 20 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c  e = c==3 ? SMALL
1c560 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c  EST_INT64 : -val
1c570 75 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69  ue; }.      sqli
1c580 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
1c590 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  8(v, OP_Int64, 0
1c5a0 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29  , iMem, 0, (u8*)
1c5b0 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34  &value, P4_INT64
1c5c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1c5d0 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  ./* Generate cod
1c5e0 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64  e that will load
1c5f0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72   into register r
1c600 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68  egOut a value th
1c610 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72  at is.** appropr
1c620 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49 64  iate for the iId
1c630 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  xCol-th column o
1c640 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f  f index pIdx..*/
1c650 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1c660 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f  rCodeLoadIndexCo
1c670 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
1c680 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70  Parse,  /* The p
1c690 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1c6a0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
1c6b0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
1c6c0 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73   whose column is
1c6d0 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f   to be loaded */
1c6e0 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
1c6f0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
1c700 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  nting to a table
1c710 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49   row */.  int iI
1c720 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65  dxCol,    /* The
1c730 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
1c740 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65  ndex to be loade
1c750 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  d */.  int regOu
1c760 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  t      /* Store 
1c770 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
1c780 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72   value in this r
1c790 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
1c7a0 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49  i16 iTabCol = pI
1c7b0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64  dx->aiColumn[iId
1c7c0 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61  xCol];.  if( iTa
1c7d0 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b  bCol==XN_EXPR ){
1c7e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
1c7f0 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20  x->aColExpr );. 
1c800 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1c810 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72  >aColExpr->nExpr
1c820 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20  >iIdxCol );.    
1c830 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1c840 20 3d 20 69 54 61 62 43 75 72 20 2b 20 31 3b 0a   = iTabCur + 1;.
1c850 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1c860 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20  odeCopy(pParse, 
1c870 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
1c880 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72  a[iIdxCol].pExpr
1c890 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 70  , regOut);.    p
1c8a0 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1c8b0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1c8c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1c8d0 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1c8e0 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
1c8f0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69   pIdx->pTable, i
1c900 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20  TabCur,.        
1c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c920 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
1c930 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1c940 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1c950 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72  ate code to extr
1c960 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  act the value of
1c970 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
1c980 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a  umn of a table..
1c990 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1c9a0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1c9b0 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20  OfTable(.  Vdbe 
1c9c0 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *v,        /* Th
1c9d0 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  e VDBE under con
1c9e0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  struction */.  T
1c9f0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f  able *pTab,    /
1ca00 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  * The table cont
1ca10 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
1ca20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
1ca30 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  r,    /* The tab
1ca40 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74  le cursor.  Or t
1ca50 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72  he PK cursor for
1ca60 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a   WITHOUT ROWID *
1ca70 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
1ca80 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1ca90 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78  the column to ex
1caa0 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  tract */.  int r
1cab0 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78  egOut      /* Ex
1cac0 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
1cad0 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74  into this regist
1cae0 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  er */.){.  if( p
1caf0 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Tab==0 ){.    sq
1cb00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1cb10 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
1cb20 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67  abCur, iCol, reg
1cb30 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
1cb40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
1cb50 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62  <0 || iCol==pTab
1cb60 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73  ->iPKey ){.    s
1cb70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1cb80 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
1cb90 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a  abCur, regOut);.
1cba0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1cbb0 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28   op = IsVirtual(
1cbc0 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75  pTab) ? OP_VColu
1cbd0 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a  mn : OP_Column;.
1cbe0 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c      int x = iCol
1cbf0 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f  ;.    if( !HasRo
1cc00 77 69 64 28 70 54 61 62 29 20 26 26 20 21 49 73  wid(pTab) && !Is
1cc10 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
1cc20 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74  .      x = sqlit
1cc30 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1cc40 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
1cc50 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43  yIndex(pTab), iC
1cc60 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ol);.    }.    s
1cc70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1cc80 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c  (v, op, iTabCur,
1cc90 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d   x, regOut);.  }
1cca0 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29  .  if( iCol>=0 )
1ccb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  {.    sqlite3Col
1ccc0 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
1ccd0 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74  ab, iCol, regOut
1cce0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1ccf0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1cd00 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
1cd10 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
1cd20 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61  olumn from.** ta
1cd30 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f  ble pTab and sto
1cd40 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
1cd50 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
1cd60 69 52 65 67 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  iReg. .**.** The
1cd70 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  re must be an op
1cd80 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61  en cursor to pTa
1cd90 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e  b in iTable when
1cda0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1cdb0 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20   is called.  If 
1cdc0 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63  iColumn<0 then c
1cdd0 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
1cde0 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74   that extracts t
1cdf0 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74  he rowid..*/.int
1ce00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ce10 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  GetColumn(.  Par
1ce20 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
1ce30 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1ce40 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1ce50 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
1ce60 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65  *pTab,     /* De
1ce70 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1ce80 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65   table we are re
1ce90 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20  ading from */.  
1cea0 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
1ceb0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1cec0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f   table column */
1ced0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1cee0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1cef0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
1cf00 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
1cf10 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a   iReg,        /*
1cf20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68   Store results h
1cf30 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20  ere */.  u8 p5  
1cf40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20            /* P5 
1cf50 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c  value for OP_Col
1cf60 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29  umn + FLAGS */.)
1cf70 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1cf80 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
1cf90 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
1cfa0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1cfb0 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
1cfc0 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65  (v, pTab, iTable
1cfd0 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
1cfe0 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20  ;.  if( p5 ){.  
1cff0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1d000 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20  ngeP5(v, p5);.  
1d010 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  }.  return iReg;
1d020 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1d030 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20  te code to move 
1d040 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67  content from reg
1d050 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69  isters iFrom...i
1d060 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f  From+nReg-1.** o
1d070 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b  ver to iTo..iTo+
1d080 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20  nReg-1..*/.void 
1d090 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
1d0a0 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
1d0b0 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
1d0c0 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29  t iTo, int nReg)
1d0d0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 46 72 6f  {.  assert( iFro
1d0e0 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69  m>=iTo+nReg || i
1d0f0 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29  From+nReg<=iTo )
1d100 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1d110 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56  ddOp3(pParse->pV
1d120 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46  dbe, OP_Move, iF
1d130 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b  rom, iTo, nReg);
1d140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
1d150 74 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  t a scalar expre
1d160 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20  ssion node to a 
1d170 54 4b 5f 52 45 47 49 53 54 45 52 20 72 65 66 65  TK_REGISTER refe
1d180 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69 73  rencing.** regis
1d190 74 65 72 20 69 52 65 67 2e 20 20 54 68 65 20 63  ter iReg.  The c
1d1a0 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
1d1b0 65 20 74 68 61 74 20 69 52 65 67 20 61 6c 72 65  e that iReg alre
1d1c0 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ady contains.** 
1d1d0 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
1d1e0 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
1d1f0 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
1d200 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69 73  void exprToRegis
1d210 74 65 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c  ter(Expr *pExpr,
1d220 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 45 78   int iReg){.  Ex
1d230 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45  pr *p = sqlite3E
1d240 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
1d250 45 78 70 72 29 3b 0a 20 20 70 2d 3e 6f 70 32 20  Expr);.  p->op2 
1d260 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70  = p->op;.  p->op
1d270 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
1d280 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52    p->iTable = iR
1d290 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50  eg;.  ExprClearP
1d2a0 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b  roperty(p, EP_Sk
1d2b0 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76  ip);.}../*.** Ev
1d2c0 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73  aluate an expres
1d2d0 73 69 6f 6e 20 28 65 69 74 68 65 72 20 61 20 76  sion (either a v
1d2e0 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61 6c 61  ector or a scala
1d2f0 72 20 65 78 70 72 65 73 73 69 6f 6e 29 20 61 6e  r expression) an
1d300 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72  d store.** the r
1d310 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74 69 6e 67  esult in conting
1d320 75 6f 75 73 20 74 65 6d 70 6f 72 61 72 79 20 72  uous temporary r
1d330 65 67 69 73 74 65 72 73 2e 20 20 52 65 74 75 72  egisters.  Retur
1d340 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
1d350 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  * the first regi
1d360 73 74 65 72 20 75 73 65 64 20 74 6f 20 73 74 6f  ster used to sto
1d370 72 65 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  re the result..*
1d380 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75  *.** If the retu
1d390 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67 69  rned result regi
1d3a0 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72  ster is a tempor
1d3b0 61 72 79 20 73 63 61 6c 61 72 2c 20 74 68 65 6e  ary scalar, then
1d3c0 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20 74   also write.** t
1d3d0 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d  hat register num
1d3e0 62 65 72 20 69 6e 74 6f 20 2a 70 69 46 72 65 65  ber into *piFree
1d3f0 61 62 6c 65 2e 20 20 49 66 20 74 68 65 20 72 65  able.  If the re
1d400 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65  turned result re
1d410 67 69 73 74 65 72 0a 2a 2a 20 69 73 20 6e 6f 74  gister.** is not
1d420 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
1d430 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1d440 6e 20 69 73 20 61 20 76 65 63 74 6f 72 20 73 65  n is a vector se
1d450 74 20 2a 70 69 46 72 65 65 61 62 6c 65 0a 2a 2a  t *piFreeable.**
1d460 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63   to 0..*/.static
1d470 20 69 6e 74 20 65 78 70 72 43 6f 64 65 56 65 63   int exprCodeVec
1d480 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
1d490 65 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  e, Expr *p, int 
1d4a0 2a 70 69 46 72 65 65 61 62 6c 65 29 7b 0a 20 20  *piFreeable){.  
1d4b0 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a 20 20 69  int iResult;.  i
1d4c0 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c  nt nResult = sql
1d4d0 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
1d4e0 7a 65 28 70 29 3b 0a 20 20 69 66 28 20 6e 52 65  ze(p);.  if( nRe
1d4f0 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69  sult==1 ){.    i
1d500 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  Result = sqlite3
1d510 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1d520 72 73 65 2c 20 70 2c 20 70 69 46 72 65 65 61 62  rse, p, piFreeab
1d530 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
1d540 20 20 2a 70 69 46 72 65 65 61 62 6c 65 20 3d 20    *piFreeable = 
1d550 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  0;.    if( p->op
1d560 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 23  ==TK_SELECT ){.#
1d570 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  if SQLITE_OMIT_S
1d580 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 69 52  UBQUERY.      iR
1d590 65 73 75 6c 74 20 3d 20 30 3b 0a 23 65 6c 73 65  esult = 0;.#else
1d5a0 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d  .      iResult =
1d5b0 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
1d5c0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 29  elect(pParse, p)
1d5d0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
1d5e0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
1d5f0 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d  .      iResult =
1d600 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
1d610 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
1d620 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a  Mem += nResult;.
1d630 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1d640 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a  <nResult; i++){.
1d650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1d660 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c  xprCodeFactorabl
1d670 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70  e(pParse, p->x.p
1d680 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1d690 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20  , i+iResult);.  
1d6a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d6b0 20 20 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74    return iResult
1d6c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
1d6d0 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
1d6e0 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20  he current Vdbe 
1d6f0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1d700 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
1d710 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f  ion.  Attempt to
1d720 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1d730 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22  ts in register "
1d740 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75  target"..** Retu
1d750 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
1d760 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72  where results ar
1d770 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
1d780 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  With this routin
1d790 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67  e, there is no g
1d7a0 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65  uarantee that re
1d7b0 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65  sults will.** be
1d7c0 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65   stored in targe
1d7d0 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d  t.  The result m
1d7e0 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69  ight be stored i
1d7f0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  n some other.** 
1d800 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69  register if it i
1d810 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
1d820 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c  do so.  The call
1d830 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
1d840 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
1d850 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d  eturn code and m
1d860 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ove the results 
1d870 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a  to the desired.*
1d880 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  * register..*/.i
1d890 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1d8a0 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a  deTarget(Parse *
1d8b0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1d8c0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
1d8d0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1d8e0 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a  arse->pVdbe;  /*
1d8f0 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f   The VM under co
1d900 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1d910 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
1d920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d930 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f   opcode being co
1d940 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52  ded */.  int inR
1d950 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20  eg = target;    
1d960 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74     /* Results st
1d970 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
1d980 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20   inReg */.  int 
1d990 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20  regFree1 = 0;   
1d9a0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
1d9b0 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
1d9c0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1d9d0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  r */.  int regFr
1d9e0 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee2 = 0;        
1d9f0 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
1da00 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
1da10 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
1da20 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20    int r1, r2;   
1da30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1da40 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20  arious register 
1da50 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78 70  numbers */.  Exp
1da60 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20  r tempX;        
1da70 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
1da80 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  ary expression n
1da90 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20  ode */.  int p5 
1daa0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1dab0 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
1dac0 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
1dad0 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29   );.  if( v==0 )
1dae0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1daf0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1db00 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
1db10 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 65 78 70  turn 0;.  }..exp
1db20 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3a 0a 20  r_code_doover:. 
1db30 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
1db40 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c  .    op = TK_NUL
1db50 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
1db60 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
1db70 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70    }.  switch( op
1db80 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
1db90 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  AGG_COLUMN: {.  
1dba0 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67      AggInfo *pAg
1dbb0 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  gInfo = pExpr->p
1dbc0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  AggInfo;.      s
1dbd0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
1dbe0 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49  l *pCol = &pAggI
1dbf0 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  nfo->aCol[pExpr-
1dc00 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66  >iAgg];.      if
1dc10 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  ( !pAggInfo->dir
1dc20 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  ectMode ){.     
1dc30 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
1dc40 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20  >iMem>0 );.     
1dc50 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d 3e     return pCol->
1dc60 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  iMem;.      }els
1dc70 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e  e if( pAggInfo->
1dc80 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b  useSortingIdx ){
1dc90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1dca0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1dcb0 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66  _Column, pAggInf
1dcc0 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61  o->sortingIdxPTa
1dcd0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcf0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
1dd00 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
1dd10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61         return ta
1dd20 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
1dd30 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
1dd40 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
1dd50 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
1dd60 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
1dd70 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
1dd80 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61   {.      int iTa
1dd90 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  b = pExpr->iTabl
1dda0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  e;.      if( Exp
1ddb0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1ddc0 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29  pr, EP_FixedCol)
1ddd0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1dde0 68 69 73 20 43 4f 4c 55 4d 4e 20 65 78 70 72 65  his COLUMN expre
1ddf0 73 73 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20  ssion is really 
1de00 61 20 63 6f 6e 73 74 61 6e 74 20 64 75 65 20 74  a constant due t
1de10 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20  o WHERE clause. 
1de20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
1de30 61 69 6e 74 73 2c 20 61 6e 64 20 74 68 61 74 20  aints, and that 
1de40 63 6f 6e 73 74 61 6e 74 20 69 73 20 63 6f 64 65  constant is code
1de50 64 20 62 79 20 74 68 65 20 70 45 78 70 72 2d 3e  d by the pExpr->
1de60 70 4c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a  pLeft.        **
1de70 20 65 78 70 72 65 73 73 73 69 6f 6e 2e 20 20 48   expresssion.  H
1de80 6f 77 65 76 65 72 2c 20 6d 61 6b 65 20 73 75 72  owever, make sur
1de90 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 68  e the constant h
1dea0 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  as the correct. 
1deb0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 74 79         ** dataty
1dec0 70 65 20 62 79 20 61 70 70 6c 79 69 6e 67 20 74  pe by applying t
1ded0 68 65 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74  he Affinity of t
1dee0 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
1def0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
1df00 2a 20 63 6f 6e 73 74 61 6e 74 2e 0a 20 20 20 20  * constant..    
1df10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1df20 6e 74 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65  nt iReg = sqlite
1df30 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1df40 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1df50 4c 65 66 74 2c 74 61 72 67 65 74 29 3b 0a 20 20  Left,target);.  
1df60 20 20 20 20 20 20 69 6e 74 20 61 66 66 20 3d 20        int aff = 
1df70 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75  sqlite3TableColu
1df80 6d 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  mnAffinity(pExpr
1df90 2d 3e 79 2e 70 54 61 62 2c 20 70 45 78 70 72 2d  ->y.pTab, pExpr-
1dfa0 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1dfb0 20 20 20 69 66 28 20 61 66 66 21 3d 53 51 4c 49     if( aff!=SQLI
1dfc0 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a 20  TE_AFF_BLOB ){. 
1dfd0 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
1dfe0 63 6f 6e 73 74 20 63 68 61 72 20 7a 41 66 66 5b  const char zAff[
1dff0 5d 20 3d 20 22 42 5c 30 30 30 43 5c 30 30 30 44  ] = "B\000C\000D
1e000 5c 30 30 30 45 22 3b 0a 20 20 20 20 20 20 20 20  \000E";.        
1e010 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
1e020 5f 41 46 46 5f 42 4c 4f 42 3d 3d 27 41 27 20 29  _AFF_BLOB=='A' )
1e030 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1e040 72 74 28 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  rt( SQLITE_AFF_T
1e050 45 58 54 3d 3d 27 42 27 20 29 3b 0a 20 20 20 20  EXT=='B' );.    
1e060 20 20 20 20 20 20 69 66 28 20 69 52 65 67 21 3d        if( iReg!=
1e070 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  target ){.      
1e080 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e090 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
1e0a0 6f 70 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65  opy, iReg, targe
1e0b0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
1e0c0 69 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  iReg = target;. 
1e0d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e0e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e0f0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66  AddOp4(v, OP_Aff
1e100 69 6e 69 74 79 2c 20 69 52 65 67 2c 20 31 2c 20  inity, iReg, 1, 
1e110 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1e130 7a 41 66 66 5b 28 61 66 66 2d 27 42 27 29 2a 32  zAff[(aff-'B')*2
1e140 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ], P4_STATIC);. 
1e150 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e160 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 20 20   return iReg;.  
1e170 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e180 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20  iTab<0 ){.      
1e190 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 53    if( pParse->iS
1e1a0 65 6c 66 54 61 62 3c 30 20 29 7b 0a 20 20 20 20  elfTab<0 ){.    
1e1b0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
1e1c0 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  ing CHECK constr
1e1d0 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69  aints or inserti
1e1e0 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20  ng into partial 
1e1f0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
1e200 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
1e210 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 50 61 72 73  >iColumn - pPars
1e220 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20 20  e->iSelfTab;.   
1e230 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e240 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20        /* Coding 
1e250 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
1e260 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
1e270 20 69 6e 64 65 78 20 77 68 65 72 65 20 63 6f 6c   index where col
1e280 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20 20  umn names.      
1e290 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
1e2a0 64 65 78 20 72 65 66 65 72 20 74 6f 20 74 68 65  dex refer to the
1e2b0 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68 20   table to which 
1e2c0 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67  the index belong
1e2d0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  s */.          i
1e2e0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  Tab = pParse->iS
1e2f0 65 6c 66 54 61 62 20 2d 20 31 3b 0a 20 20 20 20  elfTab - 1;.    
1e300 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e310 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1e320 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1e330 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  umn(pParse, pExp
1e340 72 2d 3e 79 2e 70 54 61 62 2c 0a 20 20 20 20 20  r->y.pTab,.     
1e350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e360 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1e370 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  >iColumn, iTab, 
1e380 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1e3b0 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  2);.    }.    ca
1e3c0 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
1e3d0 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
1e3e0 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  er(pParse, pExpr
1e3f0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1e400 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1e410 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  t;.    }.    cas
1e420 65 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3a 20  e TK_TRUEFALSE: 
1e430 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1e440 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e450 49 6e 74 65 67 65 72 2c 20 73 71 6c 69 74 65 33  Integer, sqlite3
1e460 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70  ExprTruthValue(p
1e470 45 78 70 72 29 2c 20 74 61 72 67 65 74 29 3b 0a  Expr), target);.
1e480 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1e490 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  get;.    }.#ifnd
1e4a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1e4b0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
1e4c0 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
1e4d0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1e4e0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1e4f0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1e500 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63  alue) );.      c
1e510 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72  odeReal(v, pExpr
1e520 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74  ->u.zToken, 0, t
1e530 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65  arget);.      re
1e540 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e550 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
1e560 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
1e570 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1e580 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1e590 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1e5a0 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e) );.      sqli
1e5b0 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
1e5c0 67 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78  g(v, target, pEx
1e5d0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1e5e0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1e5f0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  et;.    }.    ca
1e600 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
1e610 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e620 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1e630 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1e640 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1e650 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  t;.    }.#ifndef
1e660 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
1e670 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
1e680 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
1e690 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
1e6a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
1e6b0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f        char *zBlo
1e6c0 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  b;.      assert(
1e6d0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1e6e0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1e6f0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
1e700 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1e710 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c  zToken[0]=='x' |
1e720 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  | pExpr->u.zToke
1e730 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20  n[0]=='X' );.   
1e740 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1e750 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27  ->u.zToken[1]=='
1e760 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d  \'' );.      z =
1e770 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65   &pExpr->u.zToke
1e780 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20  n[2];.      n = 
1e790 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1e7a0 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73  z) - 1;.      as
1e7b0 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27  sert( z[n]=='\''
1e7c0 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20   );.      zBlob 
1e7d0 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c  = sqlite3HexToBl
1e7e0 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62  ob(sqlite3VdbeDb
1e7f0 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  (v), z, n);.    
1e800 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e810 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20  Op4(v, OP_Blob, 
1e820 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20  n/2, target, 0, 
1e830 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49  zBlob, P4_DYNAMI
1e840 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  C);.      return
1e850 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
1e860 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
1e870 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
1e880 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1e890 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1e8a0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1e8b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e8c0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1e8d0 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  n!=0 );.      as
1e8e0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1e8f0 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20  Token[0]!=0 );. 
1e900 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e910 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72  AddOp2(v, OP_Var
1e920 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  iable, pExpr->iC
1e930 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
1e940 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1e950 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20  >u.zToken[1]!=0 
1e960 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1e970 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
1e980 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65  e3VListNumToName
1e990 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c  (pParse->pVList,
1e9a0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
1e9b0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e9c0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1e9d0 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74 72  n[0]=='?' || str
1e9e0 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  cmp(pExpr->u.zTo
1e9f0 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20 20  ken, z)==0 );.  
1ea00 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56        pParse->pV
1ea10 4c 69 73 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20  List[0] = 0; /* 
1ea20 49 6e 64 69 63 61 74 65 20 56 4c 69 73 74 20 6d  Indicate VList m
1ea30 61 79 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  ay no longer be 
1ea40 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 20 20  enlarged */.    
1ea50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ea60 70 70 65 6e 64 50 34 28 76 2c 20 28 63 68 61 72  ppendP4(v, (char
1ea70 2a 29 7a 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  *)z, P4_STATIC);
1ea80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1ea90 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1eaa0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1eab0 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
1eac0 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
1ead0 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 23 69  iTable;.    }.#i
1eae0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1eaf0 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
1eb00 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
1eb10 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
1eb20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
1eb30 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
1eb40 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52  en) */.      inR
1eb50 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
1eb60 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
1eb70 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1eb80 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1eb90 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
1eba0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1ebb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ebc0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
1ebd0 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
1ebe0 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
1ebf0 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
1ec00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ec10 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20  Op2(v, OP_Cast, 
1ec20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
1ec50 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ype(pExpr->u.zTo
1ec60 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ken, 0));.      
1ec70 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 20 20  return inReg;.  
1ec80 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1ec90 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a  LITE_OMIT_CAST *
1eca0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  /.    case TK_IS
1ecb0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
1ecc0 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70 20 3d 20  NOT:.      op = 
1ecd0 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
1ece0 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
1ecf0 20 20 20 70 35 20 3d 20 53 51 4c 49 54 45 5f 4e     p5 = SQLITE_N
1ed00 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20  ULLEQ;.      /* 
1ed10 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a  fall-through */.
1ed20 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
1ed30 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
1ed40 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
1ed50 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
1ed60 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
1ed70 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
1ed80 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
1ed90 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
1eda0 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ft;.      if( sq
1edb0 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
1edc0 72 28 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20  r(pLeft) ){.    
1edd0 20 20 20 20 63 6f 64 65 56 65 63 74 6f 72 43 6f      codeVectorCo
1ede0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1edf0 78 70 72 2c 20 74 61 72 67 65 74 2c 20 6f 70 2c  xpr, target, op,
1ee00 20 70 35 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   p5);.      }els
1ee10 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
1ee20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1ee30 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66  emp(pParse, pLef
1ee40 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1ee50 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
1ee60 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1ee70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ee80 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1ee90 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 43  );.        codeC
1eea0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1eeb0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
1eec0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
1eed0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52       r1, r2, inR
1eee0 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  eg, SQLITE_STORE
1eef0 50 32 20 7c 20 70 35 29 3b 0a 20 20 20 20 20 20  P2 | p5);.      
1ef00 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d    assert(TK_LT==
1ef10 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Lt); testcase
1ef20 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
1ef30 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1ef40 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
1ef50 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
1ef60 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
1ef70 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
1ef80 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1ef90 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
1efa0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
1efb0 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
1efc0 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
1efd0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1efe0 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
1eff0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
1f000 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
1f010 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
1f020 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1f030 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
1f040 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
1f050 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
1f060 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62  (op==OP_Eq); Vdb
1f070 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1f080 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20  ==OP_Eq);.      
1f090 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
1f0a0 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
1f0b0 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
1f0c0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1f0d0 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
1f0e0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f0f0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1f100 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f110 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1f120 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1f130 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f140 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
1f150 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65   TK_OR:.    case
1f160 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61   TK_PLUS:.    ca
1f170 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20  se TK_STAR:.    
1f180 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20  case TK_MINUS:. 
1f190 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a     case TK_REM:.
1f1a0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
1f1b0 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
1f1c0 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  BITOR:.    case 
1f1d0 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61  TK_SLASH:.    ca
1f1e0 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20  se TK_LSHIFT:.  
1f1f0 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
1f200 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  : .    case TK_C
1f210 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  ONCAT: {.      a
1f220 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f  ssert( TK_AND==O
1f230 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20 20 20  P_And );        
1f240 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f250 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20  ==TK_AND );.    
1f260 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d    assert( TK_OR=
1f270 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20 20 20  =OP_Or );       
1f280 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f290 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20   op==TK_OR );.  
1f2a0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50      assert( TK_P
1f2b0 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20  LUS==OP_Add );  
1f2c0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1f2d0 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29  e( op==TK_PLUS )
1f2e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f2f0 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62  TK_MINUS==OP_Sub
1f300 74 72 61 63 74 20 29 3b 20 20 20 20 20 74 65 73  tract );     tes
1f310 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49  tcase( op==TK_MI
1f320 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73  NUS );.      ass
1f330 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f  ert( TK_REM==OP_
1f340 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20 20 20  Remainder );    
1f350 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f360 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20  TK_REM );.      
1f370 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e  assert( TK_BITAN
1f380 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20  D==OP_BitAnd ); 
1f390 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f3a0 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a  p==TK_BITAND );.
1f3b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f3c0 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72  _BITOR==OP_BitOr
1f3d0 20 29 3b 20 20 20 20 20 20 20 20 74 65 73 74 63   );        testc
1f3e0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f  ase( op==TK_BITO
1f3f0 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
1f400 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f  t( TK_SLASH==OP_
1f410 44 69 76 69 64 65 20 29 3b 20 20 20 20 20 20 20  Divide );       
1f420 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f430 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20  _SLASH );.      
1f440 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46  assert( TK_LSHIF
1f450 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  T==OP_ShiftLeft 
1f460 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
1f470 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a  p==TK_LSHIFT );.
1f480 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f490 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _RSHIFT==OP_Shif
1f4a0 74 52 69 67 68 74 20 29 3b 20 20 74 65 73 74 63  tRight );  testc
1f4b0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49  ase( op==TK_RSHI
1f4c0 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  FT );.      asse
1f4d0 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f  rt( TK_CONCAT==O
1f4e0 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20 20 20  P_Concat );     
1f4f0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f500 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20  K_CONCAT );.    
1f510 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1f520 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f530 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f540 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1f550 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1f560 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f570 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1f580 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1f590 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f5a0 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32  AddOp3(v, op, r2
1f5b0 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
1f5c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f5d0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1f5e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f5f0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1f600 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f610 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
1f620 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  US: {.      Expr
1f630 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
1f640 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73  >pLeft;.      as
1f650 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
1f660 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
1f670 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
1f680 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e  {.        codeIn
1f690 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c  teger(pParse, pL
1f6a0 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  eft, 1, target);
1f6b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f6c0 74 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66 20  target;.#ifndef 
1f6d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1f6e0 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
1f6f0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74   }else if( pLeft
1f700 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
1f710 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1f720 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1f730 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1f740 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1f750 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c    codeReal(v, pL
1f760 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31  eft->u.zToken, 1
1f770 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f780 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1f790 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
1f7a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
1f7b0 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45  mpX.op = TK_INTE
1f7c0 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  GER;.        tem
1f7d0 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e  pX.flags = EP_In
1f7e0 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f  tValue|EP_TokenO
1f7f0 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  nly;.        tem
1f800 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b  pX.u.iValue = 0;
1f810 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
1f820 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f830 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58  p(pParse, &tempX
1f840 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1f850 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1f860 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f870 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f880 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  eft, &regFree2);
1f890 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f8a0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1f8b0 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72  _Subtract, r2, r
1f8c0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1f8d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f8e0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1f8f0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1f900 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f910 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20   TK_BITNOT:.    
1f920 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
1f930 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f940 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f  BITNOT==OP_BitNo
1f950 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  t );   testcase(
1f960 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29   op==TK_BITNOT )
1f970 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f980 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29  TK_NOT==OP_Not )
1f990 3b 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;         testca
1f9a0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29  se( op==TK_NOT )
1f9b0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1f9c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f9d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f9e0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1f9f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1fa00 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1fa10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1fa20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
1fa30 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20   r1, inReg);.   
1fa40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fa50 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54      case TK_TRUT
1fa60 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  H: {.      int i
1fa70 73 54 72 75 65 3b 20 20 20 20 2f 2a 20 49 53 20  sTrue;    /* IS 
1fa80 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54  TRUE or IS NOT T
1fa90 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  RUE */.      int
1faa0 20 62 4e 6f 72 6d 61 6c 3b 20 20 20 2f 2a 20 49   bNormal;   /* I
1fab0 53 20 54 52 55 45 20 6f 72 20 49 53 20 46 41 4c  S TRUE or IS FAL
1fac0 53 45 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d  SE */.      r1 =
1fad0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fae0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1faf0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1fb00 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
1fb10 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1fb20 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73 54 72  =0 );.      isTr
1fb30 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ue = sqlite3Expr
1fb40 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70 72  TruthValue(pExpr
1fb50 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
1fb60 20 62 4e 6f 72 6d 61 6c 20 3d 20 70 45 78 70 72   bNormal = pExpr
1fb70 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 3b 0a 20 20  ->op2==TK_IS;.  
1fb80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
1fb90 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29  True && bNormal)
1fba0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fbb0 28 20 21 69 73 54 72 75 65 20 26 26 20 62 4e 6f  ( !isTrue && bNo
1fbc0 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  rmal);.      sql
1fbd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1fbe0 74 28 76 2c 20 4f 50 5f 49 73 54 72 75 65 2c 20  t(v, OP_IsTrue, 
1fbf0 72 31 2c 20 69 6e 52 65 67 2c 20 21 69 73 54 72  r1, inReg, !isTr
1fc00 75 65 2c 20 69 73 54 72 75 65 20 5e 20 62 4e 6f  ue, isTrue ^ bNo
1fc10 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  rmal);.      bre
1fc20 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fc30 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
1fc40 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
1fc50 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  L: {.      int a
1fc60 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ddr;.      asser
1fc70 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
1fc80 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73  _IsNull );   tes
1fc90 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
1fca0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73  NULL );.      as
1fcb0 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
1fcc0 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20  ==OP_NotNull ); 
1fcd0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1fce0 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
1fcf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fd00 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1fd10 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
1fd20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1fd30 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1fd40 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1fd50 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1fd60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fd70 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1fd80 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
1fd90 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1fda0 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20   op, r1);.      
1fdb0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1fdc0 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
1fdd0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1fde0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
1fdf0 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
1fe00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fe10 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1fe20 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1fe30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1fe40 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
1fe50 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1fe60 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1fe70 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
1fe80 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
1fe90 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  pInfo = pExpr->p
1fea0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  AggInfo;.      i
1feb0 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  f( pInfo==0 ){. 
1fec0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1fed0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1fee0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1fef0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ue) );.        s
1ff00 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1ff10 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
1ff20 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73 28  f aggregate: %s(
1ff30 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  )", pExpr->u.zTo
1ff40 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ken);.      }els
1ff50 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
1ff60 6e 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70  n pInfo->aFunc[p
1ff70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d  Expr->iAgg].iMem
1ff80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ff90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1ffa0 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
1ffb0 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
1ffc0 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20  ist *pFarg;     
1ffd0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e    /* List of fun
1ffe0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
1fff0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61  */.      int nFa
20000 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
20010 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e  /* Number of fun
20020 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
20030 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  */.      FuncDef
20040 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20   *pDef;         
20050 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
20060 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63  definition objec
20070 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  t */.      const
20080 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20   char *zId;     
20090 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
200a0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
200b0 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  u32 constMask = 
200c0 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  0;     /* Mask o
200d0 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
200e0 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63 6f  ents that are co
200f0 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20  nstant */.      
20100 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
20110 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
20120 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
20130 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
20140 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68  arse->db;  /* Th
20150 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
20160 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75  ction */.      u
20170 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
20180 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78        /* The tex
20190 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20  t encoding used 
201a0 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
201b0 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   */.      CollSe
201c0 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20  q *pColl = 0;   
201d0 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20   /* A collating 
201e0 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 23 69 66  sequence */..#if
201f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20200 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20  _WINDOWFUNC.    
20210 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
20220 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
20230 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  WinFunc) ){.    
20240 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
20250 2d 3e 79 2e 70 57 69 6e 2d 3e 72 65 67 52 65 73  ->y.pWin->regRes
20260 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ult;.      }.#en
20270 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 43  dif..      if( C
20280 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
20290 72 73 65 29 20 26 26 20 73 71 6c 69 74 65 33 45  rse) && sqlite3E
202a0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
202b0 4a 6f 69 6e 28 70 45 78 70 72 29 20 29 7b 0a 20  Join(pExpr) ){. 
202c0 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 66 75         /* SQL fu
202d0 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 65  nctions can be e
202e0 78 70 65 6e 73 69 76 65 2e 20 53 6f 20 74 72 79  xpensive. So try
202f0 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 73 74 61 6e   to move constan
20300 74 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20  t functions.    
20310 20 20 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68      ** out of th
20320 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65 76  e inner loop, ev
20330 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
20340 20 61 6e 20 65 78 74 72 61 20 4f 50 5f 43 6f 70   an extra OP_Cop
20350 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  y. */.        re
20360 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
20370 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
20380 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20  e, pExpr, -1);. 
20390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
203a0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
203b0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
203c0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
203d0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
203e0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
203f0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
20400 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
20410 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
20420 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
20430 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
20440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
20450 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46  arg = pFarg ? pF
20460 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  arg->nExpr : 0;.
20470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
20480 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
20490 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
204a0 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20  e) );.      zId 
204b0 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
204c0 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  n;.      pDef = 
204d0 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
204e0 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61  ion(db, zId, nFa
204f0 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66  rg, enc, 0);.#if
20500 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20510 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55  E_UNKNOWN_SQL_FU
20520 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28  NCTION.      if(
20530 20 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72   pDef==0 && pPar
20540 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
20550 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
20560 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
20570 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c  n(db, "unknown",
20580 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b   nFarg, enc, 0);
20590 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
205a0 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
205b0 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61  0 || pDef->xFina
205c0 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  lize!=0 ){.     
205d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
205e0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
205f0 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73  own function: %s
20600 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  ()", zId);.     
20610 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20620 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65  }..      /* Atte
20630 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70  mpt a direct imp
20640 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
20650 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c  he built-in COAL
20660 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20  ESCE() and.     
20670 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e   ** IFNULL() fun
20680 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76  ctions.  This av
20690 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79  oids unnecessary
206a0 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20   evaluation of. 
206b0 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74       ** argument
206c0 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74  s past the first
206d0 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65   non-NULL argume
206e0 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
206f0 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
20700 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
20710 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b  FUNC_COALESCE ){
20720 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64  .        int end
20730 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74  Coalesce = sqlit
20740 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
20750 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
20760 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
20770 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 );.        sql
20780 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
20790 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
207a0 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
207b0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31  .        for(i=1
207c0 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
207d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
207e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
207f0 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67  OP_NotNull, targ
20800 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  et, endCoalesce)
20810 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
20820 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
20830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20840 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
20850 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
20860 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
20870 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
20880 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
20890 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65  abel(v, endCoale
208a0 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  sce);.        br
208b0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
208c0 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b      /* The UNLIK
208d0 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ELY() function i
208e0 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20  s a no-op.  The 
208f0 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 61  result is the va
20900 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  lue.      ** of 
20910 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
20920 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
20930 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
20940 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
20950 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b  FUNC_UNLIKELY ){
20960 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20970 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20   nFarg>=1 );.   
20980 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
20990 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
209a0 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  t(pParse, pFarg-
209b0 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[0].pExpr, tar
209c0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 23  get);.      }..#
209d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
209e0 55 47 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  UG.      /* The 
209f0 41 46 46 49 4e 49 54 59 28 29 20 66 75 6e 63 74  AFFINITY() funct
20a00 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
20a10 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
20a20 65 73 63 72 69 62 65 73 0a 20 20 20 20 20 20 2a  escribes.      *
20a30 2a 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e  * the type affin
20a40 69 74 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d  ity of the argum
20a50 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20 75 73  ent.  This is us
20a60 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f  ed for testing o
20a70 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53  f.      ** the S
20a80 51 4c 69 74 65 20 74 79 70 65 20 6c 6f 67 69 63  QLite type logic
20a90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
20aa0 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
20ab0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
20ac0 4e 43 5f 41 46 46 49 4e 49 54 59 20 29 7b 0a 20  NC_AFFINITY ){. 
20ad0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
20ae0 72 20 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b 20 22  r *azAff[] = { "
20af0 62 6c 6f 62 22 2c 20 22 74 65 78 74 22 2c 20 22  blob", "text", "
20b00 6e 75 6d 65 72 69 63 22 2c 20 22 69 6e 74 65 67  numeric", "integ
20b10 65 72 22 2c 20 22 72 65 61 6c 22 20 7d 3b 0a 20  er", "real" };. 
20b20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66 3b         char aff;
20b30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20b40 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20   nFarg==1 );.   
20b50 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74       aff = sqlit
20b60 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
20b70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
20b80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20b90 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
20ba0 28 76 2c 20 74 61 72 67 65 74 2c 20 0a 20 20 20  (v, target, .   
20bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bc0 20 20 20 20 20 20 20 20 20 20 20 61 66 66 20 3f             aff ?
20bd0 20 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c 49 54   azAff[aff-SQLIT
20be0 45 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a 20 22 6e  E_AFF_BLOB] : "n
20bf0 6f 6e 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72  one");.        r
20c00 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
20c10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
20c20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
20c30 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
20c40 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20      if( i<32 && 
20c50 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
20c60 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69  stant(pFarg->a[i
20c70 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
20c80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20c90 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20  i==31 );.       
20ca0 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20     constMask |= 
20cb0 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20  MASKBIT32(i);.  
20cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20cd0 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
20ce0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
20cf0 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20  NC_NEEDCOLL)!=0 
20d00 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  && !pColl ){.   
20d10 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
20d20 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
20d30 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  q(pParse, pFarg-
20d40 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
20d50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20d60 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20        if( pFarg 
20d70 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
20d80 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20  onstMask ){.    
20d90 20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73        r1 = pPars
20da0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
20db0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
20dc0 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20  m += nFarg;.    
20dd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20de0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
20df0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
20e00 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20  arse, nFarg);.  
20e10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
20e20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29   /* For length()
20e30 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75   and typeof() fu
20e40 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63  nctions with a c
20e50 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a  olumn argument,.
20e60 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74          ** set t
20e70 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20  he P5 parameter 
20e80 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e  to the OP_Column
20e90 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41   opcode to OPFLA
20ea0 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20  G_LENGTHARG.    
20eb0 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47      ** or OPFLAG
20ec0 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65  _TYPEOFARG respe
20ed0 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69  ctively, to avoi
20ee0 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61  d unnecessary da
20ef0 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  ta.        ** lo
20f00 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a  ading..        *
20f10 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  /.        if( (p
20f20 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
20f30 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45   (SQLITE_FUNC_LE
20f40 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43  NGTH|SQLITE_FUNC
20f50 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a  _TYPEOF))!=0 ){.
20f60 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70            u8 exp
20f70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61  rOp;.          a
20f80 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20  ssert( nFarg==1 
20f90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
20fa0 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d  ert( pFarg->a[0]
20fb0 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  .pExpr!=0 );.   
20fc0 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20         exprOp = 
20fd0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
20fe0 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  r->op;.         
20ff0 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f   if( exprOp==TK_
21000 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70  COLUMN || exprOp
21010 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
21020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
21030 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
21040 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41  NC_LENGTH==OPFLA
21050 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20  G_LENGTHARG );. 
21060 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
21070 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  t( SQLITE_FUNC_T
21080 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59  YPEOF==OPFLAG_TY
21090 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20  PEOFARG );.     
210a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
210b0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
210c0 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48   & OPFLAG_LENGTH
210d0 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
210e0 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70     pFarg->a[0].p
210f0 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20  Expr->op2 = .   
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21110 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
21120 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41   (OPFLAG_LENGTHA
21130 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  RG|OPFLAG_TYPEOF
21140 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ARG);.          
21150 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
21160 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21170 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
21180 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20  rse, pFarg, r1, 
21190 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211b0 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44     SQLITE_ECEL_D
211c0 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  UP|SQLITE_ECEL_F
211d0 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 7d 65  ACTOR);.      }e
211e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
211f0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
21200 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21210 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
21220 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
21230 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e  overload the fun
21240 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72  ction if the fir
21250 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20  st argument is. 
21260 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61       ** a virtua
21270 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a  l table column..
21280 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21290 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63  * For infix func
212a0 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f  tions (LIKE, GLO
212b0 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d  B, REGEXP, and M
212c0 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20  ATCH) use the.  
212d0 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72      ** second ar
212e0 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20  gument, not the 
212f0 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72  first, as the ar
21300 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74  gument to test t
21310 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
21320 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  f it is a column
21330 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   in a virtual ta
21340 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f  ble.  This is do
21350 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ne because.     
21360 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65   ** the left ope
21370 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75  rand of infix fu
21380 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65  nctions (the ope
21390 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a  rand we want to.
213a0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c        ** control
213b0 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e   overloading) en
213c0 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63  ds up as the sec
213d0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
213e0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  the.      ** fun
213f0 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72  ction.  The expr
21400 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42  ession "A glob B
21410 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  " is equivalent 
21420 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c  to .      ** "gl
21430 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e  ob(B,A).  We wan
21440 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69  t to use the A i
21450 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20  n "A glob B" to 
21460 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  test.      ** fo
21470 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c  r function overl
21480 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20  oading.  But we 
21490 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69  use the B term i
214a0 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20  n "glob(B,A)".. 
214b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
214c0 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 45 78  ( nFarg>=2 && Ex
214d0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
214e0 78 70 72 2c 20 45 50 5f 49 6e 66 69 78 46 75 6e  xpr, EP_InfixFun
214f0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  c) ){.        pD
21500 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
21510 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
21520 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
21530 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45  , pFarg->a[1].pE
21540 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
21550 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b  e if( nFarg>0 ){
21560 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
21570 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
21580 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
21590 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
215a0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  rg->a[0].pExpr);
215b0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
215c0 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
215d0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
215e0 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
215f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
21600 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
21610 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20   db->pDfltColl; 
21620 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21630 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
21640 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
21650 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
21660 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
21670 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
21680 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53  LITE_ENABLE_OFFS
21690 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20  ET_SQL_FUNC.    
216a0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
216b0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
216c0 55 4e 43 5f 4f 46 46 53 45 54 20 29 7b 0a 20 20  UNC_OFFSET ){.  
216d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 72 67        Expr *pArg
216e0 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70   = pFarg->a[0].p
216f0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Expr;.        if
21700 28 20 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43  ( pArg->op==TK_C
21710 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
21720 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21730 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65  dOp3(v, OP_Offse
21740 74 2c 20 70 41 72 67 2d 3e 69 54 61 62 6c 65 2c  t, pArg->iTable,
21750 20 70 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pArg->iColumn, 
21760 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
21770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21780 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21790 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
217a0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
217b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
217c0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  e.#endif.      {
217d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
217e0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 70 50  VdbeAddOp4(v, pP
217f0 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3f  arse->iSelfTab ?
21800 20 4f 50 5f 50 75 72 65 46 75 6e 63 30 20 3a 20   OP_PureFunc0 : 
21810 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a 20 20  OP_Function0,.  
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21830 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
21840 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 20 28  k, r1, target, (
21850 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
21860 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20  UNCDEF);.       
21870 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
21880 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72  geP5(v, (u8)nFar
21890 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
218a0 20 20 69 66 28 20 6e 46 61 72 67 20 26 26 20 63    if( nFarg && c
218b0 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20  onstMask==0 ){. 
218c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
218d0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
218e0 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67  Parse, r1, nFarg
218f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21900 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
21910 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
21920 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
21930 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
21940 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
21950 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
21960 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
21970 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
21980 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
21990 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
219a0 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
219b0 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f       if( op==TK_
219c0 53 45 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20  SELECT && (nCol 
219d0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
219e0 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
219f0 72 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  r)!=1 ){.       
21a00 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
21a10 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e  tError(pParse, n
21a20 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Col, 1);.      }
21a30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
21a40 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6f 64 65  turn sqlite3Code
21a50 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
21a60 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
21a70 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
21a80 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
21a90 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20  _SELECT_COLUMN: 
21aa0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
21ab0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
21ac0 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30  pLeft->iTable==0
21ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
21ae0 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65  r->pLeft->iTable
21af0 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
21b00 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
21b10 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
21b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
21b30 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62  ert( pExpr->iTab
21b40 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e  le==0 || pExpr->
21b50 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pLeft->op==TK_SE
21b60 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66  LECT );.      if
21b70 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a  ( pExpr->iTable.
21b80 20 20 20 20 20 20 20 26 26 20 70 45 78 70 72 2d         && pExpr-
21b90 3e 69 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73 71  >iTable!=(n = sq
21ba0 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
21bb0 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ize(pExpr->pLeft
21bc0 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  )) .      ){.   
21bd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
21be0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64  rMsg(pParse, "%d
21bf0 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65   columns assigne
21c00 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20  d %d values",.  
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
21c30 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29 3b  xpr->iTable, n);
21c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
21c50 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c 65  eturn pExpr->pLe
21c60 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78  ft->iTable + pEx
21c70 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
21c80 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
21c90 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
21ca0 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
21cb0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
21cc0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
21cd0 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
21ce0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
21cf0 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
21d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21d10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
21d20 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
21d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21d40 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
21d50 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
21d60 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
21d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21d80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
21d90 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
21da0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
21db0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
21dc0 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
21dd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21de0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21df0 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
21e00 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
21e10 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
21e20 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
21e30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21e40 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65  target;.    }.#e
21e50 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
21e60 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
21e70 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
21e80 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
21e90 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
21ea0 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
21eb0 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
21ec0 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
21ed0 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
21ee0 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
21ef0 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
21f00 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
21f10 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
21f20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
21f30 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
21f40 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
21f50 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
21f60 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
21f70 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
21f80 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
21f90 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
21fa0 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c  Expr, target, 0,
21fb0 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
21fc0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
21fd0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e      case TK_SPAN
21fe0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
21ff0 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65  LLATE: .    case
22000 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
22010 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
22020 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 67  ->pLeft;.      g
22030 6f 74 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64 6f  oto expr_code_do
22040 6f 76 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30 34  over; /* 2018-04
22050 2d 32 38 3a 20 50 72 65 76 65 6e 74 20 64 65 65  -28: Prevent dee
22060 70 20 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53 53  p recursion. OSS
22070 46 75 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a  Fuzz. */.    }..
22080 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
22090 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
220a0 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
220b0 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
220c0 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
220d0 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
220e0 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
220f0 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
22100 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
22110 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
22120 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
22130 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
22140 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
22150 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
22160 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
22170 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
22180 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
22190 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
221a0 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
221b0 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
221c0 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
221d0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
221e0 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
221f0 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
22200 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
22210 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
22220 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
22230 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
22240 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
22250 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d  sing an OP_Param
22260 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a   opcode. The p1.
22270 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
22280 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66  er is set to 0 f
22290 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20  or an old.rowid 
222a0 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f  reference, or to
222b0 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20   (i+1).      ** 
222c0 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f  to reference ano
222d0 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ther column of t
222e0 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
222f0 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20  table, where .  
22300 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20      ** i is the 
22310 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
22320 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72  umn. For a new.r
22330 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
22340 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73  p1 is.      ** s
22350 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65  et to (n+1), whe
22360 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  re n is the numb
22370 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
22380 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62   each pseudo-tab
22390 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72  le..      ** For
223a0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
223b0 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  any other column
223c0 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73   in the new.* ps
223d0 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20  eudo-table, p1. 
223e0 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
223f0 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65  o (n+2+i), where
22400 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20   n and i are as 
22410 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73  defined previous
22420 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a  ly. For.      **
22430 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
22440 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20   table on which 
22450 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69  triggers are bei
22460 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20  ng fired is.    
22470 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73    ** declared as
22480 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
22490 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
224a0 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
224b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
224c0 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70  hen p1 is interp
224d0 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
224e0 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
224f0 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e   **   p1==0   ->
22500 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20      old.rowid   
22510 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20    p1==3   ->    
22520 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20  new.rowid.      
22530 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20  **   p1==1   -> 
22540 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20     old.a        
22550 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e   p1==4   ->    n
22560 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20  ew.a.      **   
22570 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==2   ->    ol
22580 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.b         p1==
22590 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20  5   ->    new.b 
225a0 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a        .      */.
225b0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
225c0 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  b = pExpr->y.pTa
225d0 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20  b;.      int p1 
225e0 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
225f0 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29  * (pTab->nCol+1)
22600 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43   + 1 + pExpr->iC
22610 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73  olumn;..      as
22620 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
22630 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
22640 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  >iTable==1 );.  
22650 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
22660 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26  r->iColumn>=-1 &
22670 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
22680 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  <pTab->nCol );. 
22690 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
226a0 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45  b->iPKey<0 || pE
226b0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54  xpr->iColumn!=pT
226c0 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20  ab->iPKey );.   
226d0 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30     assert( p1>=0
226e0 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43   && p1<(pTab->nC
226f0 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20  ol*2+2) );..    
22700 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22710 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c  Op2(v, OP_Param,
22720 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   p1, target);.  
22730 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22740 28 76 2c 20 22 72 5b 25 64 5d 3d 25 73 2e 25 73  (v, "r[%d]=%s.%s
22750 22 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  ", target,.     
22760 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c     (pExpr->iTabl
22770 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64  e ? "new" : "old
22780 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78  "),.        (pEx
22790 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20  pr->iColumn<0 ? 
227a0 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d  "rowid" : pExpr-
227b0 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  >y.pTab->aCol[pE
227c0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e  xpr->iColumn].zN
227d0 61 6d 65 29 0a 20 20 20 20 20 20 29 29 3b 0a 0a  ame).      ));..
227e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
227f0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
22800 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  NT.      /* If t
22810 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45  he column has RE
22820 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20  AL affinity, it 
22830 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65  may currently be
22840 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20   stored as an.  
22850 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
22860 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  Use OP_RealAffin
22870 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ity to make sure
22880 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
22890 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  al..      **.   
228a0 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
228b0 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32  F: R-60985-57662
228c0 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e   SQLite will con
228d0 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62  vert the value b
228e0 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ack to.      ** 
228f0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77  floating point w
22900 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69  hen extracting i
22910 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72  t from the recor
22920 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
22930 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
22940 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54  =0 .       && pT
22950 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
22960 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
22970 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
22980 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  AL.      ){.    
22990 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
229a0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp1(v, OP_Real
229b0 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74  Affinity, target
229c0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
229d0 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
229e0 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
229f0 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20  K_VECTOR: {.    
22a00 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
22a10 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
22a20 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
22a30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22a40 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
22a50 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a 20  IF_NULL_ROW: {. 
22a60 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 4e 52       int addrINR
22a70 3b 0a 20 20 20 20 20 20 61 64 64 72 49 4e 52 20  ;.      addrINR 
22a80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
22a90 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 75 6c 6c  Op1(v, OP_IfNull
22aa0 52 6f 77 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Row, pExpr->iTab
22ab0 6c 65 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  le);.      inReg
22ac0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
22ad0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
22ae0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
22af0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
22b00 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
22b10 65 28 76 2c 20 61 64 64 72 49 4e 52 29 3b 0a 20  e(v, addrINR);. 
22b20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22b30 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
22b40 49 4e 52 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20  INR, inReg);.   
22b50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22b60 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46  .    /*.    ** F
22b70 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20  orm A:.    **   
22b80 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54  CASE x WHEN e1 T
22b90 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
22ba0 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
22bb0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
22bc0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
22bd0 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20   ** Form B:.    
22be0 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65  **   CASE WHEN e
22bf0 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
22c00 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
22c10 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
22c20 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
22c30 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73      ** Form A is
22c40 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72   can be transfor
22c50 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75  med into the equ
22c60 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61  ivalent form B a
22c70 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
22c80 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d  *   CASE WHEN x=
22c90 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
22ca0 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  x=e2 THEN r2 ...
22cb0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57  .    **        W
22cc0 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e  HEN x=eN THEN rN
22cd0 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
22ce0 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20  **.    ** X (if 
22cf0 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
22d00 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
22d10 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74 68     ** Y is in th
22d20 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f  e last element o
22d30 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  f pExpr->x.pList
22d40 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   if pExpr->x.pLi
22d50 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20 20  st->nExpr is.   
22d60 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59 20   ** odd.  The Y 
22d70 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c  is also optional
22d80 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  .  If the number
22d90 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
22da0 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69  x.pList.    ** i
22db0 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20 69  s even, then Y i
22dc0 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68  s omitted and th
22dd0 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72 65  e "otherwise" re
22de0 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20  sult is NULL..  
22df0 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45    ** Ei is in pE
22e00 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
22e10 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78  2] and Ri is pEx
22e20 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
22e30 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  +1]..    **.    
22e40 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
22e50 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
22e60 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68  is the Ri for th
22e70 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
22e80 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69   Ei,.    ** or i
22e90 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
22ea0 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45  tching Ei, the E
22eb0 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69  LSE term Y, or i
22ec0 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
22ed0 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20  * no ELSE term, 
22ee0 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
22ef0 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
22f00 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b  ( op==TK_CASE );
22f10 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64   {.      int end
22f20 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Label;          
22f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
22f40 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64  TO label for end
22f50 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f   of CASE stmt */
22f60 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43  .      int nextC
22f70 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
22f80 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
22f90 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20   label for next 
22fa0 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WHEN clause */. 
22fb0 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20       int nExpr; 
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d         /* 2x num
22fe0 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ber of WHEN term
22ff0 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
23000 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23020 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
23030 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
23040 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
23050 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
23060 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
23070 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
23080 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69  prList_item *aLi
23090 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61  stelem;  /* Arra
230a0 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  y of WHEN terms 
230b0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70  */.      Expr op
230c0 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20  Compare;        
230d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
230e0 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69  e X==Ei expressi
230f0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
23100 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
23110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23120 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f   The X expressio
23130 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
23140 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pTest = 0;     
23150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23160 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f  X==Ei (form A) o
23170 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20  r just Ei (form 
23180 42 29 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  B) */.      Expr
23190 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20   *pDel = 0;.    
231a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
231b0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 20  pParse->db;..   
231c0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
231d0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
231e0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
231f0 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
23200 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  st );.      asse
23210 72 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  rt(pExpr->x.pLis
23220 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20  t->nExpr > 0);. 
23230 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
23240 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
23250 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20      aListelem = 
23260 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  pEList->a;.     
23270 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   nExpr = pEList-
23280 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e  >nExpr;.      en
23290 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  dLabel = sqlite3
232a0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
232b0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  arse);.      if(
232c0 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   (pX = pExpr->pL
232d0 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
232e0 20 20 20 70 44 65 6c 20 3d 20 73 71 6c 69 74 65     pDel = sqlite
232f0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 58 2c  3ExprDup(db, pX,
23300 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
23310 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
23320 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
23330 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
23340 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20  (db, pDel);.    
23350 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
23370 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d  estcase( pX->op=
23380 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
23390 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69        exprToRegi
233a0 73 74 65 72 28 70 44 65 6c 2c 20 65 78 70 72 43  ster(pDel, exprC
233b0 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65  odeVector(pParse
233c0 2c 20 70 44 65 6c 2c 20 26 72 65 67 46 72 65 65  , pDel, &regFree
233d0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1));.        tes
233e0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
233f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  =0 );.        me
23400 6d 73 65 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c  mset(&opCompare,
23410 20 30 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d   0, sizeof(opCom
23420 70 61 72 65 29 29 3b 0a 20 20 20 20 20 20 20 20  pare));.        
23430 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54  opCompare.op = T
23440 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70  K_EQ;.        op
23450 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20  Compare.pLeft = 
23460 70 44 65 6c 3b 0a 20 20 20 20 20 20 20 20 70 54  pDel;.        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 45 78 70        sqlite3Exp
23890 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  rDelete(db, pDel
238a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
238b0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
238c0 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
238d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
238e0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
238f0 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
23900 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
23910 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
23920 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
23930 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20  ==OE_Rollback . 
23940 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
23950 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
23960 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20  _Abort.         
23970 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
23980 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20  nity==OE_Fail.  
23990 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
239a0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
239b0 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a  Ignore.      );.
239c0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
239d0 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29  e->pTriggerTab )
239e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
239f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
23a00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23a10 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
23a20 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
23a30 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
23a40 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
23a50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
23a60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23a70 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
23a80 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  ty==OE_Abort ){.
23a90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
23aa0 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
23ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
23ac0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
23ad0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
23ae0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
23af0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
23b00 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
23b10 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ore ){.        s
23b20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
23b30 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c  (.            v,
23b40 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
23b50 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  _OK, OE_Ignore, 
23b60 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
23b70 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56  en,0);.        V
23b80 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
23b90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23ba0 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74       sqlite3Halt
23bb0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
23bc0 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  e, SQLITE_CONSTR
23bd0 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20  AINT_TRIGGER,.  
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
23c00 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78  r->affinity, pEx
23c10 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
23c20 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
23c30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
23c40 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
23c50 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
23c60 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
23c70 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
23c80 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
23c90 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
23ca0 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  ;.  return inReg
23cb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f  ;.}../*.** Facto
23cc0 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f  r out the code o
23cd0 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
23ce0 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61  ession to initia
23cf0 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
23d00 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65 73 74 3e  *.** If regDest>
23d10 3d 30 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  =0 then the resu
23d20 6c 74 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f  lt is always sto
23d30 72 65 64 20 69 6e 20 74 68 61 74 20 72 65 67 69  red in that regi
23d40 73 74 65 72 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ster and the.** 
23d50 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 72 65  result is not re
23d60 75 73 61 62 6c 65 2e 20 20 49 66 20 72 65 67 44  usable.  If regD
23d70 65 73 74 3c 30 20 74 68 65 6e 20 74 68 69 73 20  est<0 then this 
23d80 72 6f 75 74 69 6e 65 20 69 73 20 66 72 65 65 20  routine is free 
23d90 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65  to .** store the
23da0 20 76 61 6c 75 65 20 77 68 65 72 65 65 76 65 72   value whereever
23db0 20 69 74 20 77 61 6e 74 73 2e 20 20 54 68 65 20   it wants.  The 
23dc0 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20 74  register where t
23dd0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a  he expression .*
23de0 2a 20 69 73 20 73 74 6f 72 65 64 20 69 73 20 72  * is stored is r
23df0 65 74 75 72 6e 65 64 2e 20 20 57 68 65 6e 20 72  eturned.  When r
23e00 65 67 44 65 73 74 3c 30 2c 20 74 77 6f 20 69 64  egDest<0, two id
23e10 65 6e 74 69 63 61 6c 20 65 78 70 72 65 73 73 69  entical expressi
23e20 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65  ons will.** code
23e30 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65 67   to the same reg
23e40 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
23e50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
23e60 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nit(.  Parse *pP
23e70 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
23e80 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
23e90 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
23ea0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
23eb0 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65  sion to code whe
23ec0 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69 74 69  n the VDBE initi
23ed0 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20  alizes */.  int 
23ee0 72 65 67 44 65 73 74 20 20 20 20 20 20 20 2f 2a  regDest       /*
23ef0 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   Store the value
23f00 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
23f10 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  r */.){.  ExprLi
23f20 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  st *p;.  assert(
23f30 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
23f40 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20  Parse) );.  p = 
23f50 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
23f60 70 72 3b 0a 20 20 69 66 28 20 72 65 67 44 65 73  pr;.  if( regDes
23f70 74 3c 30 20 26 26 20 70 20 29 7b 0a 20 20 20 20  t<0 && p ){.    
23f80 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
23f90 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
23fa0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
23fb0 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d  pItem=p->a, i=p-
23fc0 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74  >nExpr; i>0; pIt
23fd0 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20  em++, i--){.    
23fe0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75    if( pItem->reu
23ff0 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33  sable && sqlite3
24000 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 70 49  ExprCompare(0,pI
24010 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72  tem->pExpr,pExpr
24020 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,-1)==0 ){.     
24030 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d     return pItem-
24040 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
24050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24060 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 73 71    }.  pExpr = sq
24070 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
24080 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
24090 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  0);.  p = sqlite
240a0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
240b0 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72  pParse, p, pExpr
240c0 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
240d0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
240e0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
240f0 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d   &p->a[p->nExpr-
24100 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e  1];.     pItem->
24110 72 65 75 73 61 62 6c 65 20 3d 20 72 65 67 44 65  reusable = regDe
24120 73 74 3c 30 3b 0a 20 20 20 20 20 69 66 28 20 72  st<0;.     if( r
24130 65 67 44 65 73 74 3c 30 20 29 20 72 65 67 44 65  egDest<0 ) regDe
24140 73 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  st = ++pParse->n
24150 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  Mem;.     pItem-
24160 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
24170 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a   = regDest;.  }.
24180 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74    pParse->pConst
24190 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65 74 75  Expr = p;.  retu
241a0 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f  rn regDest;.}../
241b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
241c0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
241d0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
241e0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
241f0 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  ts.** into a reg
24200 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ister.  Return t
24210 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
24220 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73  er where the res
24230 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ults.** are stor
24240 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
24250 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
24260 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
24270 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  r that can be de
24280 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68  allocated,.** th
24290 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d  en write its num
242a0 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20  ber into *pReg. 
242b0 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
242c0 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a  egister is not.*
242d0 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
242e0 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
242f0 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   zero..**.** If 
24300 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
24310 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
24320 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e  outine might gen
24330 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f  erate this.** co
24340 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72  de to fill the r
24350 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69  egister in the i
24360 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65  nitialization se
24370 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ction of the.** 
24380 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e  VDBE program, in
24390 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72   order to factor
243a0 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65   it out of the e
243b0 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a  valuation loop..
243c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
243d0 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
243e0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
243f0 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
24400 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70  ){.  int r2;.  p
24410 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
24420 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
24430 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73  xpr);.  if( Cons
24440 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
24450 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f  ).   && pExpr->o
24460 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  p!=TK_REGISTER. 
24470 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
24480 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
24490 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20  n(pExpr).  ){.  
244a0 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20    *pReg  = 0;.  
244b0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
244c0 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
244d0 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b  rse, pExpr, -1);
244e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
244f0 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
24500 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
24510 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
24520 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
24530 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
24540 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d  r1);.    if( r2=
24550 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  =r1 ){.      *pR
24560 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c  eg = r1;.    }el
24570 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
24580 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
24590 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
245a0 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20     *pReg = 0;.  
245b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
245c0 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   r2;.}../*.** Ge
245d0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
245e0 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
245f0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
24600 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
24610 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
24620 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
24630 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
24640 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
24650 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
24660 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69  r target..*/.voi
24670 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
24680 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
24690 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
246a0 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74  t target){.  int
246b0 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72   inReg;..  asser
246c0 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
246d0 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
246e0 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78  Mem );.  if( pEx
246f0 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d  pr && pExpr->op=
24700 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
24710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24720 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
24730 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45  dbe, OP_Copy, pE
24740 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
24750 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  get);.  }else{. 
24760 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
24770 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
24780 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
24790 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73  target);.    ass
247a0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
247b0 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  be!=0 || pParse-
247c0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
247d0 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52  d );.    if( inR
247e0 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70 50  eg!=target && pP
247f0 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
24800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24810 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
24820 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
24830 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
24840 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
24850 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e 73 69  ** Make a transi
24860 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78 70 72  ent copy of expr
24870 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
24880 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20 75 73   then code it us
24890 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78  ing.** sqlite3Ex
248a0 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69 73 20  prCode().  This 
248b0 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75  routine works ju
248c0 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45  st like sqlite3E
248d0 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63  xprCode().** exc
248e0 65 70 74 20 74 68 61 74 20 74 68 65 20 69 6e 70  ept that the inp
248f0 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ut expression is
24900 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
24910 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
24920 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
24930 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a  CodeCopy(Parse *
24940 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
24950 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
24960 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
24970 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
24980 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
24990 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
249a0 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64 62 2d  , 0);.  if( !db-
249b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
249c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
249d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
249e0 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69 74 65  arget);.  sqlite
249f0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
24a00 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
24a10 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
24a20 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
24a30 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
24a40 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
24a50 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
24a60 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
24a70 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
24a80 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
24a90 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
24aa0 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 49 66  ster target.  If
24ab0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24ac0 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  is constant, the
24ad0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
24ae0 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74  * might choose t
24af0 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70 72 65  o code the expre
24b00 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c  ssion at initial
24b10 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f  ization time..*/
24b20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
24b30 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
24b40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
24b50 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
24b60 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70  target){.  if( p
24b70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61  Parse->okConstFa
24b80 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45  ctor && sqlite3E
24b90 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
24ba0 4a 6f 69 6e 28 70 45 78 70 72 29 20 29 7b 0a 20  Join(pExpr) ){. 
24bb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
24bc0 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
24bd0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
24be0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
24bf0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
24c00 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
24c10 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  get);.  }.}../*.
24c20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
24c30 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20   that evaluates 
24c40 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
24c50 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68  sion and puts th
24c60 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72  e result.** in r
24c70 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
24c80 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20  **.** Also make 
24c90 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
24ca0 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73  pression results
24cb0 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63   into another "c
24cc0 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a  ache" register.*
24cd0 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  * and modify the
24ce0 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74   expression so t
24cf0 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hat the next tim
24d00 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65  e it is evaluate
24d10 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  d,.** the result
24d20 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
24d30 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72  e cache register
24d40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
24d50 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
24d60 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
24d70 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69  t are used multi
24d80 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20  ple .** times.  
24d90 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74  They are evaluat
24da0 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20  ed once and the 
24db0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65  results of the e
24dc0 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65  xpression.** are
24dd0 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64   reused..*/.void
24de0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24df0 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a  AndCache(Parse *
24e00 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
24e10 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
24e20 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
24e30 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
24e40 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65  nt iMem;..  asse
24e50 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
24e60 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
24e70 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
24e80 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
24e90 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
24ea0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
24eb0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
24ec0 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
24ed0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24ee0 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69  _Copy, target, i
24ef0 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65  Mem);.  exprToRe
24f00 67 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d  gister(pExpr, iM
24f10 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  em);.}../*.** Ge
24f20 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
24f30 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
24f40 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
24f50 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
24f60 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
24f70 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e  st into a sequen
24f80 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ce of registers 
24f90 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72  beginning at tar
24fa0 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  get..**.** Retur
24fb0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
24fc0 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74  elements evaluat
24fd0 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  ed.  The number 
24fe0 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 0a 2a 2a  returned will.**
24ff0 20 75 73 75 61 6c 6c 79 20 62 65 20 70 4c 69 73   usually be pLis
25000 74 2d 3e 6e 45 78 70 72 20 62 75 74 20 6d 69 67  t->nExpr but mig
25010 68 74 20 62 65 20 72 65 64 75 63 65 64 20 69 66  ht be reduced if
25020 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49   SQLITE_ECEL_OMI
25030 54 52 45 46 0a 2a 2a 20 69 73 20 64 65 66 69 6e  TREF.** is defin
25040 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ed..**.** The SQ
25050 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c  LITE_ECEL_DUP fl
25060 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  ag prevents the 
25070 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62  arguments from b
25080 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75  eing.** filled u
25090 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20  sing OP_SCopy.  
250a0 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20  OP_Copy must be 
250b0 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
250c0 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
250d0 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d  CEL_FACTOR argum
250e0 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74  ent allows const
250f0 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ant arguments to
25100 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20   be.** factored 
25110 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c  out into initial
25120 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a  ization code..**
25130 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
25140 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61  CEL_REF flag mea
25150 6e 73 20 74 68 61 74 20 65 78 70 72 65 73 73 69  ns that expressi
25160 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ons in the list 
25170 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74  with.** ExprList
25180 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  .a[].u.x.iOrderB
25190 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65  yCol>0 have alre
251a0 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74  ady been evaluat
251b0 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a  ed and stored.**
251c0 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 61 74   in registers at
251d0 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20   srcReg, and so 
251e0 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65  the value can be
251f0 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
25200 72 65 2e 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  re..** If SQLITE
25210 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 69 73  _ECEL_OMITREF is
25220 20 61 6c 73 6f 20 73 65 74 2c 20 74 68 65 6e 20   also set, then 
25230 74 68 65 20 76 61 6c 75 65 73 20 77 69 74 68 20  the values with 
25240 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
25250 30 0a 2a 2a 20 61 72 65 20 73 69 6d 70 6c 79 20  0.** are simply 
25260 6f 6d 69 74 74 65 64 20 72 61 74 68 65 72 20 74  omitted rather t
25270 68 61 6e 20 62 65 69 6e 67 20 63 6f 70 69 65 64  han being copied
25280 20 66 72 6f 6d 20 73 72 63 52 65 67 2e 0a 2a 2f   from srcReg..*/
25290 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
252a0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
252b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
252c0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
252d0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
252e0 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
252f0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
25300 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
25310 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74   */.  int target
25320 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ,        /* Wher
25330 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
25340 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52  ts */.  int srcR
25350 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  eg,        /* So
25360 75 72 63 65 20 72 65 67 69 73 74 65 72 73 20 69  urce registers i
25370 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  f SQLITE_ECEL_RE
25380 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20  F */.  u8 flags 
25390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
253a0 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73  ITE_ECEL_* flags
253b0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
253c0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
253d0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Item;.  int i, j
253e0 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70  , n;.  u8 copyOp
253f0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
25400 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f  TE_ECEL_DUP) ? O
25410 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70  P_Copy : OP_SCop
25420 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  y;.  Vdbe *v = p
25430 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
25440 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
25450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61   );.  assert( ta
25460 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
25470 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
25480 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65  e!=0 );  /* Neve
25490 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20  r gets this far 
254a0 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e  otherwise */.  n
254b0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
254c0 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63  .  if( !ConstFac
254d0 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20  torOk(pParse) ) 
254e0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
254f0 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20  _ECEL_FACTOR;.  
25500 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
25510 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  >a, i=0; i<n; i+
25520 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
25530 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
25540 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 23 69 66  Item->pExpr;.#if
25550 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
25560 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
25570 43 45 53 0a 20 20 20 20 69 66 28 20 70 49 74 65  CES.    if( pIte
25580 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 29 7b  m->bSorterRef ){
25590 0a 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20  .      i--;.    
255a0 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65    n--;.    }else
255b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
255c0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
255d0 45 43 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20  ECEL_REF)!=0 && 
255e0 28 6a 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  (j = pItem->u.x.
255f0 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29  iOrderByCol)>0 )
25600 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  {.      if( flag
25610 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
25620 4f 4d 49 54 52 45 46 20 29 7b 0a 20 20 20 20 20  OMITREF ){.     
25630 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20     i--;.        
25640 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n--;.      }else
25650 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
25660 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63  3VdbeAddOp2(v, c
25670 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d  opyOp, j+srcReg-
25680 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  1, target+i);.  
25690 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
256a0 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
256b0 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29  ITE_ECEL_FACTOR)
256c0 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
256d0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
256e0 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
256f0 45 78 70 72 29 0a 20 20 20 20 29 7b 0a 20 20 20  Expr).    ){.   
25700 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
25710 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
25720 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
25730 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25740 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20      int inReg = 
25750 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
25760 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
25770 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
25780 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
25790 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20  =target+i ){.   
257a0 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
257b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
257c0 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  pyOp==OP_Copy.  
257d0 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73         && (pOp=s
257e0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
257f0 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d  v, -1))->opcode=
25800 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
25810 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70    && pOp->p1+pOp
25820 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20  ->p3+1==inReg.  
25830 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
25840 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72  2+pOp->p3+1==tar
25850 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b  get+i.        ){
25860 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
25870 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  p3++;.        }e
25880 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
25890 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
258a0 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65  (v, copyOp, inRe
258b0 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  g, target+i);.  
258c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
258d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
258e0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
258f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
25900 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61   a BETWEEN opera
25910 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20  tor..**.**    x 
25920 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
25930 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
25940 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
25950 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20   .**.**    x>=y 
25960 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43  AND x<=z.**.** C
25970 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
25980 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
25990 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
259a0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c  expression.** el
259b0 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a  imination of x..
259c0 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49  **.** The xJumpI
259d0 66 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65  f parameter dete
259e0 72 6d 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a  rmines details:.
259f0 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20  **.**    NULL:  
25a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a10 20 53 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65   Store the boole
25a20 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  an result in reg
25a30 5b 64 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c  [dest].**    sql
25a40 69 74 65 33 45 78 70 72 49 66 54 72 75 65 3a 20  ite3ExprIfTrue: 
25a50 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73       Jump to des
25a60 74 20 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20  t if true.**    
25a70 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
25a80 73 65 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20  se:     Jump to 
25a90 64 65 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a  dest if false.**
25aa0 0a 2a 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75  .** The jumpIfNu
25ab0 6c 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ll parameter is 
25ac0 69 67 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70  ignored if xJump
25ad0 49 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  If is NULL..*/.s
25ae0 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
25af0 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61  odeBetween(.  Pa
25b00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
25b10 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
25b20 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
25b30 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
25b40 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
25b50 20 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70   The BETWEEN exp
25b60 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
25b70 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
25b80 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
25b90 6f 6e 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f  on or storage lo
25ba0 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  cation */.  void
25bb0 20 28 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a   (*xJump)(Parse*
25bc0 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c  ,Expr*,int,int),
25bd0 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61   /* Action to ta
25be0 6b 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  ke */.  int jump
25bf0 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b  IfNull    /* Tak
25c00 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
25c10 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c  e BETWEEN is NUL
25c20 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65  L */.){.  Expr e
25c30 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54  xprAnd;     /* T
25c40 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
25c50 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d  in  x>=y AND x<=
25c60 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  z  */.  Expr com
25c70 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65  pLeft;    /* The
25c80 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a    x>=y  term */.
25c90 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74    Expr compRight
25ca0 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a  ;   /* The  x<=z
25cb0 20 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20    term */.  int 
25cc0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a  regFree1 = 0; /*
25cd0 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
25ce0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 45 78 70  egister */.  Exp
25cf0 72 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 73  r *pDel = 0;.  s
25d00 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
25d10 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 6d 65 6d 73  rse->db;..  mems
25d20 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c  et(&compLeft, 0,
25d30 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
25d40 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69    memset(&compRi
25d50 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  ght, 0, sizeof(E
25d60 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  xpr));.  memset(
25d70 26 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a  &exprAnd, 0, siz
25d80 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61  eof(Expr));..  a
25d90 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
25da0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
25db0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
25dc0 20 20 70 44 65 6c 20 3d 20 73 71 6c 69 74 65 33    pDel = sqlite3
25dd0 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
25de0 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  r->pLeft, 0);.  
25df0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
25e00 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 65  iled==0 ){.    e
25e10 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41  xprAnd.op = TK_A
25e20 4e 44 3b 0a 20 20 20 20 65 78 70 72 41 6e 64 2e  ND;.    exprAnd.
25e30 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
25e40 74 3b 0a 20 20 20 20 65 78 70 72 41 6e 64 2e 70  t;.    exprAnd.p
25e50 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67  Right = &compRig
25e60 68 74 3b 0a 20 20 20 20 63 6f 6d 70 4c 65 66 74  ht;.    compLeft
25e70 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20  .op = TK_GE;.   
25e80 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20   compLeft.pLeft 
25e90 3d 20 70 44 65 6c 3b 0a 20 20 20 20 63 6f 6d 70  = pDel;.    comp
25ea0 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45  Left.pRight = pE
25eb0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
25ec0 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  0].pExpr;.    co
25ed0 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f  mpRight.op = TK_
25ee0 4c 45 3b 0a 20 20 20 20 63 6f 6d 70 52 69 67 68  LE;.    compRigh
25ef0 74 2e 70 4c 65 66 74 20 3d 20 70 44 65 6c 3b 0a  t.pLeft = pDel;.
25f00 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52      compRight.pR
25f10 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
25f20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
25f30 72 3b 0a 20 20 20 20 65 78 70 72 54 6f 52 65 67  r;.    exprToReg
25f40 69 73 74 65 72 28 70 44 65 6c 2c 20 65 78 70 72  ister(pDel, expr
25f50 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73  CodeVector(pPars
25f60 65 2c 20 70 44 65 6c 2c 20 26 72 65 67 46 72 65  e, pDel, &regFre
25f70 65 31 29 29 3b 0a 20 20 20 20 69 66 28 20 78 4a  e1));.    if( xJ
25f80 75 6d 70 20 29 7b 0a 20 20 20 20 20 20 78 4a 75  ump ){.      xJu
25f90 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  mp(pParse, &expr
25fa0 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  And, dest, jumpI
25fb0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  fNull);.    }els
25fc0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b  e{.      /* Mark
25fd0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
25fe0 69 73 20 62 65 69 6e 67 20 66 72 6f 6d 20 74 68  is being from th
25ff0 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
26000 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 0a 20  ause of a join. 
26010 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
26020 74 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  the sqlite3ExprC
26030 6f 64 65 54 61 72 67 65 74 28 29 20 72 6f 75 74  odeTarget() rout
26040 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74  ine will not att
26050 65 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20  empt to move.   
26060 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68     ** it into th
26070 65 20 50 61 72 73 65 2e 70 43 6f 6e 73 74 45 78  e Parse.pConstEx
26080 70 72 20 6c 69 73 74 2e 20 20 57 65 20 73 68 6f  pr list.  We sho
26090 75 6c 64 20 75 73 65 20 61 20 6e 65 77 20 62 69  uld use a new bi
260a0 74 20 66 6f 72 20 74 68 69 73 2c 0a 20 20 20 20  t for this,.    
260b0 20 20 2a 2a 20 66 6f 72 20 63 6c 61 72 69 74 79    ** for clarity
260c0 2c 20 62 75 74 20 77 65 20 61 72 65 20 6f 75 74  , but we are out
260d0 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20   of bits in the 
260e0 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64  Expr.flags field
260f0 20 73 6f 20 77 65 0a 20 20 20 20 20 20 2a 2a 20   so we.      ** 
26100 68 61 76 65 20 74 6f 20 72 65 75 73 65 20 74 68  have to reuse th
26110 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69  e EP_FromJoin bi
26120 74 2e 20 20 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20  t.  Bummer. */. 
26130 20 20 20 20 20 70 44 65 6c 2d 3e 66 6c 61 67 73       pDel->flags
26140 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b   |= EP_FromJoin;
26150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
26160 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
26170 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
26180 65 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  est);.    }.    
26190 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
261a0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
261b0 67 46 72 65 65 31 29 3b 0a 20 20 7d 0a 20 20 73  gFree1);.  }.  s
261c0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
261d0 28 64 62 2c 20 70 44 65 6c 29 3b 0a 0a 20 20 2f  (db, pDel);..  /
261e0 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74  * Ensure adequat
261f0 65 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20  e test coverage 
26200 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  */.  testcase( x
26210 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
26220 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
26230 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
26240 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
26250 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26260 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
26270 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d    && jumpIfNull=
26280 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
26290 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
262a0 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
262b0 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
262c0 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
262d0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
262e0 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
262f0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72  =sqlite3ExprIfTr
26300 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ue  && jumpIfNul
26310 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
26320 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
26330 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
26340 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
26350 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
26360 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
26370 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26380 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26390 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
263a0 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
263b0 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
263c0 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
263d0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
263e0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
263f0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
26400 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
26410 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
26420 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49  IfFalse && jumpI
26430 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
26440 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
26450 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20  tcase( xJump==0 
26460 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
26470 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
26480 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
26490 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
264a0 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
264b0 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
264c0 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
264d0 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74  sion is true but
264e0 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
264f0 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
26500 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
26510 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
26520 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
26530 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
26540 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
26550 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
26560 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61  lse), then.** ta
26570 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
26580 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c  he jumpIfNull fl
26590 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ag is SQLITE_JUM
265a0 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  PIFNULL..**.** T
265b0 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
265c0 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
265d0 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20  t certain token 
265e0 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45  values (ex: TK_E
265f0 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  Q).** are the sa
26600 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c  me as opcode val
26610 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20  ues (ex: OP_Eq) 
26620 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74  that implement t
26630 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
26640 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  .** operation.  
26650 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73  Special comments
26660 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74   in vdbe.c and t
26670 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
26680 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68   script in.** th
26690 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63  e make process c
266a0 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65  ause these value
266b0 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73  s to align.  Ass
266c0 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f  ert()s in the co
266d0 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69  de.** below veri
266e0 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
266f0 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20  ers are aligned 
26700 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f  correctly..*/.vo
26710 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
26720 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  True(Parse *pPar
26730 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
26740 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
26750 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
26760 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
26770 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
26780 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
26790 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee1 = 0;.  int r
267a0 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69  egFree2 = 0;.  i
267b0 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73  nt r1, r2;..  as
267c0 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  sert( jumpIfNull
267d0 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ==SQLITE_JUMPIFN
267e0 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c  ULL || jumpIfNul
267f0 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  l==0 );.  if( NE
26800 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20  VER(v==0) )     
26810 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73  return;  /* Exis
26820 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68  tence of VDBE ch
26830 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20  ecked by caller 
26840 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
26850 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72  Expr==0) ) retur
26860 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68  n;  /* No way th
26870 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f  is can happen */
26880 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
26890 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
268a0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
268b0 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
268c0 4f 52 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  OR: {.      Expr
268d0 20 2a 70 41 6c 74 20 3d 20 73 71 6c 69 74 65 33   *pAlt = sqlite3
268e0 45 78 70 72 53 69 6d 70 6c 69 66 69 65 64 41 6e  ExprSimplifiedAn
268f0 64 4f 72 28 70 45 78 70 72 29 3b 0a 20 20 20 20  dOr(pExpr);.    
26900 20 20 69 66 28 20 70 41 6c 74 21 3d 70 45 78 70    if( pAlt!=pExp
26910 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
26920 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
26930 50 61 72 73 65 2c 20 70 41 6c 74 2c 20 64 65 73  Parse, pAlt, des
26940 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26950 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
26960 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
26970 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
26980 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
26990 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
269a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
269b0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
269c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
269d0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
269e0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
269f0 20 64 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20   d2,.           
26a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a10 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
26a20 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
26a30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
26a40 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
26a50 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
26a60 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
26a70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
26a80 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
26a90 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
26aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26ab0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
26ac0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
26ad0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
26ae0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
26af0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
26b00 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
26b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26b20 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
26b30 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
26b40 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
26b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26b60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
26b70 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
26b80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26b90 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
26ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
26bb0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
26bc0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
26bd0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
26be0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
26bf0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
26c00 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20  K_TRUTH: {.     
26c10 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20 20 20   int isNot;     
26c20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52 55 45 20   /* IS NOT TRUE 
26c30 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20  or IS NOT FALSE 
26c40 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54  */.      int isT
26c50 72 75 65 3b 20 20 20 20 20 2f 2a 20 49 53 20 54  rue;     /* IS T
26c60 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52  RUE or IS NOT TR
26c70 55 45 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  UE */.      test
26c80 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
26c90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73 4e  ==0 );.      isN
26ca0 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d  ot = pExpr->op2=
26cb0 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20  =TK_ISNOT;.     
26cc0 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65   isTrue = sqlite
26cd0 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28  3ExprTruthValue(
26ce0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
26cf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26d00 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20  isTrue && isNot 
26d10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
26d20 65 28 20 21 69 73 54 72 75 65 20 26 26 20 69 73  e( !isTrue && is
26d30 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Not );.      if(
26d40 20 69 73 54 72 75 65 20 5e 20 69 73 4e 6f 74 20   isTrue ^ isNot 
26d50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26d60 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
26d70 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
26d80 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20  t, dest,.       
26d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26da0 20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c 49 54     isNot ? SQLIT
26db0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a 20 30  E_JUMPIFNULL : 0
26dc0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
26dd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
26de0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
26df0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
26e00 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20   dest,.         
26e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45    isNot ? SQLITE
26e30 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29  _JUMPIFNULL : 0)
26e40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26e50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
26e60 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
26e70 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a   case TK_ISNOT:.
26e80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26e90 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
26ea0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
26eb0 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
26ec0 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
26ed0 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
26ee0 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49  _NE;.      jumpI
26ef0 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e  fNull = SQLITE_N
26f00 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20  ULLEQ;.      /* 
26f10 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  Fall thru */.   
26f20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
26f30 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
26f40 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
26f50 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
26f60 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
26f70 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
26f80 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
26f90 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78  ExprIsVector(pEx
26fa0 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74  pr->pLeft) ) got
26fb0 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a  o default_expr;.
26fc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26fd0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
26fe0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
26ff0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
27000 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27010 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
27020 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
27030 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
27040 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
27050 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
27060 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
27070 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
27080 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
27090 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
270a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270b0 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
270c0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
270d0 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d    assert(TK_LT==
270e0 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Lt); testcase
270f0 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
27100 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
27110 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
27120 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50  assert(TK_LE==OP
27130 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Le); testcase(o
27140 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
27150 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
27160 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Le);.      as
27170 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
27180 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
27190 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
271a0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
271b0 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Gt);.      asse
271c0 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
271d0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
271e0 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
271f0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
27200 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
27210 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
27220 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
27230 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Eq);.      VdbeC
27240 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
27250 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
27260 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null==SQLITE_NUL
27270 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
27280 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
27290 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49  ==OP_Eq && jumpI
272a0 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
272b0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73  LLEQ);.      ass
272c0 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  ert(TK_NE==OP_Ne
272d0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
272e0 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64  OP_Ne);.      Vd
272f0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27300 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
27310 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
27320 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
27330 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27340 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75   op==OP_Ne && ju
27350 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
27360 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
27370 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
27380 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
27390 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
273a0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
273b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
273c0 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
273d0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
273e0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  LL: {.      asse
273f0 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
27400 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65  P_IsNull );   te
27410 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
27420 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61  SNULL );.      a
27430 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
27440 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
27450 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
27460 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
27470 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
27480 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
27490 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
274a0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
274b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
274c0 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
274d0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64   dest);.      Vd
274e0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
274f0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
27500 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27510 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
27520 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
27530 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
27540 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
27550 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
27560 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
27570 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
27580 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
27590 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
275a0 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
275b0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71   pExpr, dest, sq
275c0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 2c  lite3ExprIfTrue,
275d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
275e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
275f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27600 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
27610 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
27620 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
27630 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
27640 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
27650 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
27660 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d  destIfNull = jum
27670 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a  pIfNull ? dest :
27680 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20   destIfFalse;.  
27690 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
276a0 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
276b0 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
276c0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
276d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
276e0 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20  Goto(v, dest);. 
276f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27700 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
27710 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
27720 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
27730 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
27740 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75  ult: {.    defau
27750 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20 20 69  lt_expr:.      i
27760 66 28 20 45 78 70 72 41 6c 77 61 79 73 54 72 75  f( ExprAlwaysTru
27770 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
27780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
27790 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20  oto(v, dest);.  
277a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78      }else if( Ex
277b0 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45  prAlwaysFalse(pE
277c0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
277d0 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* No-op */.    
277e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
277f0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
27800 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
27810 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65  , pExpr, &regFre
27820 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e1);.        sql
27830 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
27840 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73  , OP_If, r1, des
27850 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
27860 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
27870 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
27880 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
27890 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
278a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
278b0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
278c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
278d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
278e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
278f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
27900 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
27910 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
27920 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
27930 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e2);  .}../*.** 
27940 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
27950 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
27960 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
27970 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
27980 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
27990 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
279a0 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
279b0 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
279c0 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
279d0 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
279e0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
279f0 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
27a00 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
27a10 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
27a20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
27a30 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a  r false) then.**
27a40 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e   jump if jumpIfN
27a50 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  ull is SQLITE_JU
27a60 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c  MPIFNULL or fall
27a70 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70   through if jump
27a80 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a  IfNull.** is 0..
27a90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
27aa0 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65  xprIfFalse(Parse
27ab0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
27ac0 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
27ad0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
27ae0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
27af0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
27b00 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
27b10 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
27b20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
27b30 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
27b40 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
27b50 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
27b60 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
27b70 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
27b80 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
27b90 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69  ) return; /* Exi
27ba0 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63  stence of VDBE c
27bb0 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72  hecked by caller
27bc0 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d   */.  if( pExpr=
27bd0 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a  =0 )    return;.
27be0 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
27bf0 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  of pExpr->op and
27c00 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20   op are related 
27c10 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
27c20 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70  .  **       pExp
27c30 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
27c40 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d   op.  **       -
27c50 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20  --------        
27c60 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a    ----------.  *
27c70 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c  *       TK_ISNUL
27c80 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f  L          OP_No
27c90 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  tNull.  **      
27ca0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20   TK_NOTNULL     
27cb0 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20      OP_IsNull.  
27cc0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20  **       TK_NE  
27cd0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45              OP_E
27ce0 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  q.  **       TK_
27cf0 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EQ              
27d00 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Ne.  **      
27d10 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20   TK_GT          
27d20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20      OP_Le.  **  
27d30 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20       TK_LE      
27d40 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20          OP_Gt.  
27d50 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20  **       TK_GE  
27d60 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
27d70 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
27d80 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LT              
27d90 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OP_Ge.  **.  ** 
27da0 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73  For other values
27db0 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f   of pExpr->op, o
27dc0 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61  p is undefined a
27dd0 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20  nd unused..  ** 
27de0 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f  The value of TK_
27df0 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
27e00 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20  ts are arranged 
27e10 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a  such that we.  *
27e20 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  * can compute th
27e30 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20  e mapping above 
27e40 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  using the follow
27e50 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ing expression..
27e60 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76    ** Assert()s v
27e70 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
27e80 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f  omputation is co
27e90 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70  rrect..  */.  op
27ea0 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28   = ((pExpr->op+(
27eb0 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29  TK_ISNULL&1))^1)
27ec0 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a  -(TK_ISNULL&1);.
27ed0 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72  .  /* Verify cor
27ee0 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  rect alignment o
27ef0 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
27f00 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  nstants.  */.  a
27f10 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27f20 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f  !=TK_ISNULL || o
27f30 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  p==OP_NotNull );
27f40 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
27f50 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op!=TK_NOTNULL
27f60 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c   || op==OP_IsNul
27f70 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
27f80 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20  Expr->op!=TK_NE 
27f90 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a  || op==OP_Eq );.
27fa0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
27fb0 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70  >op!=TK_EQ || op
27fc0 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ne );.  ass
27fd0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
27fe0 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LT || op==OP_
27ff0 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ge );.  assert( 
28000 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45  pExpr->op!=TK_LE
28010 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b   || op==OP_Gt );
28020 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
28030 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f  ->op!=TK_GT || o
28040 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73  p==OP_Le );.  as
28050 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
28060 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GE || op==OP
28070 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _Lt );..  switch
28080 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
28090 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
280a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
280b0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 41  {.      Expr *pA
280c0 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
280d0 53 69 6d 70 6c 69 66 69 65 64 41 6e 64 4f 72 28  SimplifiedAndOr(
280e0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
280f0 28 20 70 41 6c 74 21 3d 70 45 78 70 72 20 29 7b  ( pAlt!=pExpr ){
28100 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28110 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
28120 73 65 2c 20 70 41 6c 74 2c 20 64 65 73 74 2c 20  se, pAlt, dest, 
28130 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
28140 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
28150 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  pr->op==TK_AND )
28160 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
28170 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
28180 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
28190 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
281a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
281b0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
281c0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  IfNull);.       
281d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
281e0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
281f0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
28200 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
28210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28220 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
28230 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
28240 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
28250 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
28260 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
28270 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28280 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
28290 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
282a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
282b0 20 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49             jumpI
282c0 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
282d0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
282e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
282f0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
28300 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
28310 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
28320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28330 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
28340 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , d2);.      }. 
28350 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28360 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
28370 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
28380 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
28390 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
283a0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
283b0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
283c0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
283d0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
283e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
283f0 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20  se TK_TRUTH: {. 
28400 20 20 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20       int isNot; 
28410 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52 55 45    /* IS NOT TRUE
28420 20 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c 53 45   or IS NOT FALSE
28430 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73   */.      int is
28440 54 72 75 65 3b 20 20 2f 2a 20 49 53 20 54 52 55  True;  /* IS TRU
28450 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45  E or IS NOT TRUE
28460 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
28470 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
28480 30 20 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74  0 );.      isNot
28490 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54   = pExpr->op2==T
284a0 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69  K_ISNOT;.      i
284b0 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45  sTrue = sqlite3E
284c0 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45  xprTruthValue(pE
284d0 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
284e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
284f0 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b  True && isNot );
28500 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28510 20 21 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f   !isTrue && isNo
28520 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  t );.      if( i
28530 73 54 72 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b  sTrue ^ isNot ){
28540 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20 54  .        /* IS T
28550 52 55 45 20 61 6e 64 20 49 53 20 4e 4f 54 20 46  RUE and IS NOT F
28560 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ALSE */.        
28570 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
28580 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
28590 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20  ->pLeft, dest,. 
285a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285b0 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20            isNot 
285c0 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d  ? 0 : SQLITE_JUM
285d0 50 49 46 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 20  PIFNULL);..     
285e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
285f0 2f 2a 20 49 53 20 46 41 4c 53 45 20 61 6e 64 20  /* IS FALSE and 
28600 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20  IS NOT TRUE */. 
28610 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
28620 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
28630 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
28640 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
28660 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51 4c 49 54  sNot ? 0 : SQLIT
28670 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
28680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
28690 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
286a0 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
286b0 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
286c0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
286d0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
286e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
286f0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
28700 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70  SNOT );.      op
28710 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   = (pExpr->op==T
28720 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20  K_IS) ? TK_NE : 
28730 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_EQ;.      jum
28740 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
28750 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
28760 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
28770 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
28780 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
28790 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
287a0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
287b0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
287c0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
287d0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
287e0 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
287f0 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
28800 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
28810 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
28820 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
28830 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
28840 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
28850 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
28860 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
28870 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
28880 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
28890 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
288a0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
288b0 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
288c0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
288d0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
288e0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
288f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28900 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
28910 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
28920 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
28930 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
28940 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
28950 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
28960 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
28970 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
28980 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
28990 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
289a0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
289b0 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
289c0 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
289d0 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
289e0 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
289f0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
28a00 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
28a10 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
28a20 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
28a30 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
28a40 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
28a50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
28a60 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
28a70 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
28a80 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
28a90 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
28aa0 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
28ab0 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
28ac0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
28ad0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
28ae0 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
28af0 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
28b00 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
28b10 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
28b20 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
28b30 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
28b40 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
28b50 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
28b60 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
28b70 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
28b80 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28b90 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
28ba0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
28bb0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
28bc0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
28bd0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
28be0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
28bf0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
28c00 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
28c10 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
28c20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
28c30 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31  NULL: {.      r1
28c40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
28c50 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
28c60 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
28c70 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
28c80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
28c90 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
28ca0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
28cb0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
28cc0 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61   );   VdbeCovera
28cd0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
28ce0 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  SNULL);.      te
28cf0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
28d00 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43  OTNULL );  VdbeC
28d10 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
28d20 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
28d30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
28d40 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
28d50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28d60 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
28d70 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
28d80 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
28d90 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
28da0 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
28db0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
28dc0 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  t, sqlite3ExprIf
28dd0 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c  False, jumpIfNul
28de0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
28df0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
28e00 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
28e10 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
28e20 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  IN: {.      if( 
28e30 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20  jumpIfNull ){.  
28e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28e50 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
28e60 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73  pExpr, dest, des
28e70 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
28e80 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 65 73  .        int des
28e90 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  tIfNull = sqlite
28ea0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
28eb0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
28ec0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
28ed0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
28ee0 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c   dest, destIfNul
28ef0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
28f00 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
28f10 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
28f20 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
28f30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
28f40 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
28f50 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74  t: {.    default
28f60 5f 65 78 70 72 3a 20 0a 20 20 20 20 20 20 69 66  _expr: .      if
28f70 28 20 45 78 70 72 41 6c 77 61 79 73 46 61 6c 73  ( ExprAlwaysFals
28f80 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
28f90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
28fa0 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20  oto(v, dest);.  
28fb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78      }else if( Ex
28fc0 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78  prAlwaysTrue(pEx
28fd0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
28fe0 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
28ff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
29000 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
29010 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
29020 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
29030 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
29040 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
29050 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64   OP_IfNot, r1, d
29060 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
29070 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
29080 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
29090 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
290a0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
290b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
290c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
290d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
290e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
290f0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
29100 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
29110 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
29120 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
29130 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
29140 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ree2);.}../*.** 
29150 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  Like sqlite3Expr
29160 49 66 46 61 6c 73 65 28 29 20 65 78 63 65 70 74  IfFalse() except
29170 20 74 68 61 74 20 61 20 63 6f 70 79 20 69 73 20   that a copy is 
29180 6d 61 64 65 20 6f 66 20 70 45 78 70 72 20 62 65  made of pExpr be
29190 66 6f 72 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e  fore.** code gen
291a0 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61  eration, and tha
291b0 74 20 63 6f 70 79 20 69 73 20 64 65 6c 65 74 65  t copy is delete
291c0 64 20 61 66 74 65 72 20 63 6f 64 65 20 67 65 6e  d after code gen
291d0 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a  eration. This.**
291e0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
291f0 65 20 6f 72 69 67 69 6e 61 6c 20 70 45 78 70 72  e original pExpr
29200 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
29210 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
29220 70 72 49 66 46 61 6c 73 65 44 75 70 28 50 61 72  prIfFalseDup(Par
29230 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
29240 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
29250 74 2c 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  t,int jumpIfNull
29260 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
29270 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
29280 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 73   Expr *pCopy = s
29290 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
292a0 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69  , pExpr, 0);.  i
292b0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
292c0 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  led==0 ){.    sq
292d0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
292e0 28 70 50 61 72 73 65 2c 20 70 43 6f 70 79 2c 20  (pParse, pCopy, 
292f0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
29300 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
29310 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
29320 43 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Copy);.}../*.** 
29330 45 78 70 72 65 73 73 69 6f 6e 20 70 56 61 72 20  Expression pVar 
29340 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
29350 20 62 65 20 61 6e 20 53 51 4c 20 76 61 72 69 61   be an SQL varia
29360 62 6c 65 2e 20 70 45 78 70 72 20 6d 61 79 20 62  ble. pExpr may b
29370 65 20 61 6e 79 0a 2a 2a 20 74 79 70 65 20 6f 66  e any.** type of
29380 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
29390 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
293a0 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75   simple SQL valu
293b0 65 20 2d 20 61 6e 20 69 6e 74 65 67 65 72 2c 20  e - an integer, 
293c0 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c 20 62 6c  real, string, bl
293d0 6f 62 0a 2a 2a 20 6f 72 20 4e 55 4c 4c 20 76 61  ob.** or NULL va
293e0 6c 75 65 20 2d 20 74 68 65 6e 20 74 68 65 20 56  lue - then the V
293f0 44 42 45 20 63 75 72 72 65 6e 74 6c 79 20 62 65  DBE currently be
29400 69 6e 67 20 70 72 65 70 61 72 65 64 20 69 73 20  ing prepared is 
29410 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f  configured.** to
29420 20 72 65 2d 70 72 65 70 61 72 65 20 65 61 63 68   re-prepare each
29430 20 74 69 6d 65 20 61 20 6e 65 77 20 76 61 6c 75   time a new valu
29440 65 20 69 73 20 62 6f 75 6e 64 20 74 6f 20 76 61  e is bound to va
29450 72 69 61 62 6c 65 20 70 56 61 72 2e 0a 2a 2a 0a  riable pVar..**.
29460 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  ** Additionally,
29470 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 73   if pExpr is a s
29480 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20  imple SQL value 
29490 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69 73  and the value is
294a0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
294b0 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 62  that currently b
294c0 6f 75 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65  ound to variable
294d0 20 70 56 61 72 2c 20 6e 6f 6e 2d 7a 65 72 6f 20   pVar, non-zero 
294e0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
294f0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
29500 65 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74  e values are not
29510 20 74 68 65 20 73 61 6d 65 20 6f 72 20 69 66 20   the same or if 
29520 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20 73  pExpr is not a s
29530 69 6d 70 6c 65 0a 2a 2a 20 53 51 4c 20 76 61 6c  imple.** SQL val
29540 75 65 2c 20 7a 65 72 6f 20 69 73 20 72 65 74 75  ue, zero is retu
29550 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
29560 69 6e 74 20 65 78 70 72 43 6f 6d 70 61 72 65 56  int exprCompareV
29570 61 72 69 61 62 6c 65 28 50 61 72 73 65 20 2a 70  ariable(Parse *p
29580 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 56 61  Parse, Expr *pVa
29590 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
295a0 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a  .  int res = 0;.
295b0 20 20 69 6e 74 20 69 56 61 72 3b 0a 20 20 73 71    int iVar;.  sq
295c0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 4c 2c  lite3_value *pL,
295d0 20 2a 70 52 20 3d 20 30 3b 0a 20 20 0a 20 20 73   *pR = 0;.  .  s
295e0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45  qlite3ValueFromE
295f0 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  xpr(pParse->db, 
29600 70 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54  pExpr, SQLITE_UT
29610 46 38 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  F8, SQLITE_AFF_B
29620 4c 4f 42 2c 20 26 70 52 29 3b 0a 20 20 69 66 28  LOB, &pR);.  if(
29630 20 70 52 20 29 7b 0a 20 20 20 20 69 56 61 72 20   pR ){.    iVar 
29640 3d 20 70 56 61 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  = pVar->iColumn;
29650 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
29660 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73  SetVarmask(pPars
29670 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b  e->pVdbe, iVar);
29680 0a 20 20 20 20 70 4c 20 3d 20 73 71 6c 69 74 65  .    pL = sqlite
29690 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c  3VdbeGetBoundVal
296a0 75 65 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72  ue(pParse->pRepr
296b0 65 70 61 72 65 2c 20 69 56 61 72 2c 20 53 51 4c  epare, iVar, SQL
296c0 49 54 45 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a 20  ITE_AFF_BLOB);. 
296d0 20 20 20 69 66 28 20 70 4c 20 29 7b 0a 20 20 20     if( pL ){.   
296e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
296f0 61 6c 75 65 5f 74 79 70 65 28 70 4c 29 3d 3d 53  alue_type(pL)==S
29700 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
29710 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
29720 6c 75 65 5f 74 65 78 74 28 70 4c 29 3b 20 2f 2a  lue_text(pL); /*
29730 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 65   Make sure the e
29740 6e 63 6f 64 69 6e 67 20 69 73 20 55 54 46 2d 38  ncoding is UTF-8
29750 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
29760 20 20 72 65 73 20 3d 20 20 30 3d 3d 73 71 6c 69    res =  0==sqli
29770 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 4c  te3MemCompare(pL
29780 2c 20 70 52 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  , pR, 0);.    }.
29790 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
297a0 46 72 65 65 28 70 52 29 3b 0a 20 20 20 20 73 71  Free(pR);.    sq
297b0 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
297c0 4c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  L);.  }..  retur
297d0 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
297e0 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72  Do a deep compar
297f0 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72  ison of two expr
29800 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52  ession trees.  R
29810 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
29820 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  wo.** expression
29830 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79  s are completely
29840 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74   identical.  Ret
29850 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64 69  urn 1 if they di
29860 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20  ffer only.** by 
29870 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  a COLLATE operat
29880 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65  or at the top le
29890 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69  vel.  Return 2 i
298a0 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66  f there are diff
298b0 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72  erences.** other
298c0 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65   than the top-le
298d0 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  vel COLLATE oper
298e0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ator..**.** If a
298f0 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66  ny subelement of
29900 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61   pB has Expr.iTa
29910 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69  ble==(-1) then i
29920 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  t is allowed.** 
29930 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  to compare equal
29940 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   to an equivalen
29950 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20  t element in pA 
29960 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65  with Expr.iTable
29970 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68  ==iTab..**.** Th
29980 65 20 70 41 20 73 69 64 65 20 6d 69 67 68 74 20  e pA side might 
29990 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49  be using TK_REGI
299a0 53 54 45 52 2e 20 20 49 66 20 74 68 61 74 20 69  STER.  If that i
299b0 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 70  s the case and p
299c0 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e  B is.** not usin
299d0 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75  g TK_REGISTER bu
299e0 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 65  t is otherwise e
299f0 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20  quivalent, then 
29a00 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a  still return 0..
29a10 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
29a20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
29a30 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20  l return 2 even 
29a40 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
29a50 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79  ssions.** really
29a60 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e   are equivalent.
29a70 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70    If we cannot p
29a80 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78  rove that the ex
29a90 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a  pressions are.**
29aa0 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72   identical, we r
29ab0 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20  eturn 2 just to 
29ac0 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20  be safe.  So if 
29ad0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
29ae0 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20  returns 2, then 
29af0 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c  you do not reall
29b00 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61  y know for certa
29b10 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a  in if the two.**
29b20 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
29b30 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
29b40 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f  if you get a 0 o
29b50 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e  r 1 return, then
29b60 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73   you.** can be s
29b70 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ure the expressi
29b80 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
29b90 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73  .  In the places
29ba0 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72   where.** this r
29bb0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20  outine is used, 
29bc0 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74  it does not hurt
29bd0 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61   to get an extra
29be0 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73   2 - that.** jus
29bf0 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
29c00 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20  n some slightly 
29c10 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75  slower code.  Bu
29c20 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  t returning.** a
29c30 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72  n incorrect 0 or
29c40 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f   1 could lead to
29c50 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a   a malfunction..
29c60 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20  **.** If pParse 
29c70 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
29c80 20 54 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72   TK_VARIABLE ter
29c90 6d 73 20 69 6e 20 70 41 20 77 69 74 68 20 62 69  ms in pA with bi
29ca0 6e 64 69 6e 67 73 20 69 6e 0a 2a 2a 20 70 50 61  ndings in.** pPa
29cb0 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 20  rse->pReprepare 
29cc0 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20 61  can be matched a
29cd0 67 61 69 6e 73 74 20 6c 69 74 65 72 61 6c 73 20  gainst literals 
29ce0 69 6e 20 70 42 2e 20 20 54 68 65 20 0a 2a 2a 20  in pB.  The .** 
29cf0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65  pParse->pVdbe->e
29d00 78 70 6d 61 73 6b 20 62 69 74 6d 61 73 6b 20 69  xpmask bitmask i
29d10 73 20 75 70 64 61 74 65 64 20 66 6f 72 20 65 61  s updated for ea
29d20 63 68 20 76 61 72 69 61 62 6c 65 20 72 65 66 65  ch variable refe
29d30 72 65 6e 63 65 64 2e 0a 2a 2a 20 49 66 20 70 50  renced..** If pP
29d40 61 72 73 65 20 69 73 20 4e 55 4c 4c 20 28 74 68  arse is NULL (th
29d50 65 20 6e 6f 72 6d 61 6c 20 63 61 73 65 29 20 74  e normal case) t
29d60 68 65 6e 20 61 6e 79 20 54 4b 5f 56 41 52 49 41  hen any TK_VARIA
29d70 42 4c 45 20 74 65 72 6d 20 69 6e 20 0a 2a 2a 20  BLE term in .** 
29d80 41 72 67 75 6d 65 6e 74 20 70 50 61 72 73 65 20  Argument pParse 
29d90 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
29da0 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69  be NULL. If it i
29db0 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 70  s not NULL and p
29dc0 41 20 6f 72 0a 2a 2a 20 70 42 20 63 61 75 73 65  A or.** pB cause
29dd0 73 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65  s a return value
29de0 20 6f 66 20 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71   of 2..*/.int sq
29df0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
29e00 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
29e10 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a  Expr *pA, Expr *
29e20 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  pB, int iTab){. 
29e30 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61   u32 combinedFla
29e40 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20  gs;.  if( pA==0 
29e50 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  || pB==0 ){.    
29e60 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20  return pB==pA ? 
29e70 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  0 : 2;.  }.  if(
29e80 20 70 50 61 72 73 65 20 26 26 20 70 41 2d 3e 6f   pParse && pA->o
29e90 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 26  p==TK_VARIABLE &
29ea0 26 20 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72  & exprCompareVar
29eb0 69 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 41  iable(pParse, pA
29ec0 2c 20 70 42 29 20 29 7b 0a 20 20 20 20 72 65 74  , pB) ){.    ret
29ed0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 63 6f 6d  urn 0;.  }.  com
29ee0 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70 41 2d  binedFlags = pA-
29ef0 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61  >flags | pB->fla
29f00 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e  gs;.  if( combin
29f10 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  edFlags & EP_Int
29f20 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 66 28  Value ){.    if(
29f30 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e   (pA->flags&pB->
29f40 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61 6c 75  flags&EP_IntValu
29f50 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69  e)!=0 && pA->u.i
29f60 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61  Value==pB->u.iVa
29f70 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  lue ){.      ret
29f80 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
29f90 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20   return 2;.  }. 
29fa0 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d   if( pA->op!=pB-
29fb0 3e 6f 70 20 7c 7c 20 70 41 2d 3e 6f 70 3d 3d 54  >op || pA->op==T
29fc0 4b 5f 52 41 49 53 45 20 29 7b 0a 20 20 20 20 69  K_RAISE ){.    i
29fd0 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pA->op==TK_CO
29fe0 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
29ff0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2a000 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 70 42  se, pA->pLeft,pB
2a010 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20  ,iTab)<2 ){.    
2a020 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2a030 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70  }.    if( pB->op
2a040 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
2a050 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2a060 72 65 28 70 50 61 72 73 65 2c 20 70 41 2c 70 42  re(pParse, pA,pB
2a070 2d 3e 70 4c 65 66 74 2c 69 54 61 62 29 3c 32 20  ->pLeft,iTab)<2 
2a080 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2a090 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  1;.    }.    ret
2a0a0 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
2a0b0 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55   pA->op!=TK_COLU
2a0c0 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b  MN && pA->op!=TK
2a0d0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  _AGG_COLUMN && p
2a0e0 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  A->u.zToken ){. 
2a0f0 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
2a100 4b 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 70 41  K_FUNCTION || pA
2a110 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
2a120 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69  CTION ){.      i
2a130 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
2a140 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
2a150 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
2a160 29 20 72 65 74 75 72 6e 20 32 3b 0a 23 69 66 6e  ) return 2;.#ifn
2a170 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a180 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20  WINDOWFUNC.     
2a190 20 61 73 73 65 72 74 28 20 70 41 2d 3e 6f 70 3d   assert( pA->op=
2a1a0 3d 70 42 2d 3e 6f 70 20 29 3b 0a 20 20 20 20 20  =pB->op );.     
2a1b0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
2a1c0 65 72 74 79 28 70 41 2c 45 50 5f 57 69 6e 46 75  erty(pA,EP_WinFu
2a1d0 6e 63 29 21 3d 45 78 70 72 48 61 73 50 72 6f 70  nc)!=ExprHasProp
2a1e0 65 72 74 79 28 70 42 2c 45 50 5f 57 69 6e 46 75  erty(pB,EP_WinFu
2a1f0 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nc) ){.        r
2a200 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 7d  eturn 2;.      }
2a210 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
2a220 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c 45 50  asProperty(pA,EP
2a230 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20  _WinFunc) ){.   
2a240 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2a250 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28 70 50  WindowCompare(pP
2a260 61 72 73 65 2c 20 70 41 2d 3e 79 2e 70 57 69 6e  arse, pA->y.pWin
2a270 2c 20 70 42 2d 3e 79 2e 70 57 69 6e 2c 20 31 29  , pB->y.pWin, 1)
2a280 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2a290 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20   return 2;.     
2a2a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
2a2b0 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
2a2c0 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c  ( pA->op==TK_NUL
2a2d0 4c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  L ){.      retur
2a2e0 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
2a2f0 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pA->op==TK_CO
2a300 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  LLATE ){.      i
2a310 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
2a320 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
2a330 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
2a340 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
2a350 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
2a360 53 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d  S(pB->u.zToken!=
2a370 30 29 20 26 26 20 73 74 72 63 6d 70 28 70 41 2d  0) && strcmp(pA-
2a380 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
2a390 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20  zToken)!=0 ){.  
2a3a0 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
2a3b0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
2a3c0 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  A->flags & EP_Di
2a3d0 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c  stinct)!=(pB->fl
2a3e0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
2a3f0 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  t) ) return 2;. 
2a400 20 69 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c   if( (combinedFl
2a410 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ags & EP_TokenOn
2a420 6c 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ly)==0 ){.    if
2a430 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
2a440 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
2a450 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
2a460 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67  f( (combinedFlag
2a470 73 20 26 20 45 50 5f 46 69 78 65 64 43 6f 6c 29  s & EP_FixedCol)
2a480 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ==0.     && sqli
2a490 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2a4a0 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74  Parse, pA->pLeft
2a4b0 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61  , pB->pLeft, iTa
2a4c0 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
2a4d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2a4e0 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
2a4f0 2c 20 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42  , pA->pRight, pB
2a500 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
2a510 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a520 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
2a530 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78  istCompare(pA->x
2a540 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c  .pList, pB->x.pL
2a550 69 73 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  ist, iTab) ) ret
2a560 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 70  urn 2;.    if( p
2a570 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47  A->op!=TK_STRING
2a580 0a 20 20 20 20 20 26 26 20 70 41 2d 3e 6f 70 21  .     && pA->op!
2a590 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 0a 20 20  =TK_TRUEFALSE.  
2a5a0 20 20 20 26 26 20 28 63 6f 6d 62 69 6e 65 64 46     && (combinedF
2a5b0 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65  lags & EP_Reduce
2a5c0 64 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  d)==0.    ){.   
2a5d0 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75     if( pA->iColu
2a5e0 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
2a5f0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a600 20 20 69 66 28 20 70 41 2d 3e 6f 70 32 21 3d 70    if( pA->op2!=p
2a610 42 2d 3e 6f 70 32 20 29 20 72 65 74 75 72 6e 20  B->op2 ) return 
2a620 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  2;.      if( pA-
2a630 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
2a640 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28  ble .       && (
2a650 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62  pA->iTable!=iTab
2a660 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54   || NEVER(pB->iT
2a670 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75  able>=0)) ) retu
2a680 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 2;.    }.  }.
2a690 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a6a0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
2a6b0 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
2a6c0 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
2a6d0 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
2a6e0 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a  al and .** non-z
2a6f0 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66  ero if they diff
2a700 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
2a710 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
2a720 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
2a730 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
2a740 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
2a750 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
2a760 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
2a770 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
2a780 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
2a790 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
2a7a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2a7b0 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ine might return
2a7c0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71   non-zero for eq
2a7d0 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73  uivalent ExprLis
2a7e0 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79  ts.  The.** only
2a7f0 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c   consequence wil
2a800 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70  l be disabled op
2a810 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75  timizations.  Bu
2a820 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
2a830 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74  * must never ret
2a840 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
2a850 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
2a860 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  s are different,
2a870 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63   or.** a malfunc
2a880 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
2a890 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
2a8a0 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f   pointers are co
2a8b0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74  nsidered to be t
2a8c0 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20  he same.  But a 
2a8d0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  NULL pointer.** 
2a8e0 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66  always differs f
2a8f0 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70  rom a non-NULL p
2a900 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
2a910 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
2a920 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a  mpare(ExprList *
2a930 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42  pA, ExprList *pB
2a940 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
2a950 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
2a960 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74  0 && pB==0 ) ret
2a970 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d  urn 0;.  if( pA=
2a980 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65  =0 || pB==0 ) re
2a990 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41  turn 1;.  if( pA
2a9a0 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78  ->nExpr!=pB->nEx
2a9b0 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  pr ) return 1;. 
2a9c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
2a9d0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
2a9e0 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20   Expr *pExprA = 
2a9f0 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pA->a[i].pExpr;.
2aa00 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42      Expr *pExprB
2aa10 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pB->a[i].pExp
2aa20 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61  r;.    if( pA->a
2aa30 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70  [i].sortOrder!=p
2aa40 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  B->a[i].sortOrde
2aa50 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
2aa60 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2aa70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70  rCompare(0, pExp
2aa80 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62  rA, pExprB, iTab
2aa90 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
2aaa0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2aab0 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
2aac0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 29  te3ExprCompare()
2aad0 20 65 78 63 65 70 74 20 43 4f 4c 4c 41 54 45 20   except COLLATE 
2aae0 6f 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65  operators at the
2aaf0 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72   top-level.** ar
2ab00 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e  e ignored..*/.in
2ab10 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
2ab20 70 61 72 65 53 6b 69 70 28 45 78 70 72 20 2a 70  pareSkip(Expr *p
2ab30 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74  A, Expr *pB, int
2ab40 20 69 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e   iTab){.  return
2ab50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2ab60 61 72 65 28 30 2c 0a 20 20 20 20 20 20 20 20 20  are(0,.         
2ab70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
2ab80 6b 69 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c 0a  kipCollate(pA),.
2ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2aba0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2abb0 61 74 65 28 70 42 29 2c 0a 20 20 20 20 20 20 20  ate(pB),.       
2abc0 20 20 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a 0a        iTab);.}..
2abd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  /*.** Return non
2abe0 2d 7a 65 72 6f 20 69 66 20 45 78 70 72 20 70 20  -zero if Expr p 
2abf0 63 61 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75 65  can only be true
2ac00 20 69 66 20 70 4e 4e 20 69 73 20 6e 6f 74 20 4e   if pNN is not N
2ac10 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ULL..*/.static i
2ac20 6e 74 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f  nt exprImpliesNo
2ac30 74 4e 75 6c 6c 28 0a 20 20 50 61 72 73 65 20 2a  tNull(.  Parse *
2ac40 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
2ac50 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
2ac60 2a 2f 0a 20 20 45 78 70 72 20 2a 70 2c 20 20 20  */.  Expr *p,   
2ac70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ac80 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
2ac90 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 45 78   checked */.  Ex
2aca0 70 72 20 2a 70 4e 4e 2c 20 20 20 20 20 20 20 20  pr *pNN,        
2acb0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
2acc0 69 6f 6e 20 74 68 61 74 20 69 73 20 4e 4f 54 20  ion that is NOT 
2acd0 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 54  NULL */.  int iT
2ace0 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ab,           /*
2acf0 20 54 61 62 6c 65 20 62 65 69 6e 67 20 65 76 61   Table being eva
2ad00 6c 75 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  luated */.  int 
2ad10 73 65 65 6e 4e 6f 74 20 20 20 20 20 20 20 20 20  seenNot         
2ad20 2f 2a 20 54 72 75 65 20 69 66 20 70 20 69 73 20  /* True if p is 
2ad30 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 4e 4f  an operand of NO
2ad40 54 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  T */.){.  assert
2ad50 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ( p );.  assert(
2ad60 20 70 4e 4e 20 29 3b 0a 20 20 69 66 28 20 73 71   pNN );.  if( sq
2ad70 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2ad80 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4e 4e 2c  (pParse, p, pNN,
2ad90 20 69 54 61 62 29 3d 3d 30 20 29 20 72 65 74 75   iTab)==0 ) retu
2ada0 72 6e 20 31 3b 0a 20 20 73 77 69 74 63 68 28 20  rn 1;.  switch( 
2adb0 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
2adc0 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
2add0 20 69 66 28 20 73 65 65 6e 4e 6f 74 20 26 26 20   if( seenNot && 
2ade0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2adf0 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
2ae00 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
2ae10 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
2ae20 61 73 50 72 6f 70 65 72 74 79 28 70 2c 45 50 5f  asProperty(p,EP_
2ae30 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20 20 20  xIsSelect).     
2ae40 20 20 20 20 20 20 7c 7c 20 28 70 2d 3e 78 2e 70        || (p->x.p
2ae50 4c 69 73 74 21 3d 30 20 26 26 20 70 2d 3e 78 2e  List!=0 && p->x.
2ae60 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 20  pList->nExpr>0) 
2ae70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2ae80 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75  exprImpliesNotNu
2ae90 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  ll(pParse, p->pL
2aea0 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20  eft, pNN, iTab, 
2aeb0 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a  seenNot);.    }.
2aec0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
2aed0 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  EEN: {.      Exp
2aee0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
2aef0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
2af00 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
2af10 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
2af20 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
2af30 3d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =2 );.      if( 
2af40 73 65 65 6e 4e 6f 74 20 29 20 72 65 74 75 72 6e  seenNot ) return
2af50 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 65 78   0;.      if( ex
2af60 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c  prImpliesNotNull
2af70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
2af80 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 4e 4e 2c  a[0].pExpr, pNN,
2af90 20 69 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29 0a   iTab, seenNot).
2afa0 20 20 20 20 20 20 20 7c 7c 20 65 78 70 72 49 6d         || exprIm
2afb0 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70 50 61  pliesNotNull(pPa
2afc0 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d  rse, pList->a[1]
2afd0 2e 70 45 78 70 72 2c 20 70 4e 4e 2c 20 69 54 61  .pExpr, pNN, iTa
2afe0 62 2c 20 73 65 65 6e 4e 6f 74 29 0a 20 20 20 20  b, seenNot).    
2aff0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
2b000 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
2b010 20 20 20 20 20 72 65 74 75 72 6e 20 65 78 70 72       return expr
2b020 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70  ImpliesNotNull(p
2b030 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65 66 74 2c  Parse, p->pLeft,
2b040 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65 6e   pNN, iTab, seen
2b050 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Not);.    }.    
2b060 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20  case TK_EQ:.    
2b070 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
2b080 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
2b090 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
2b0a0 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
2b0b0 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
2b0c0 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
2b0d0 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
2b0e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
2b0f0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  R:.    case TK_R
2b100 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
2b110 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
2b120 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
2b130 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
2b140 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
2b150 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
2b160 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
2b170 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
2b180 20 20 20 69 66 28 20 65 78 70 72 49 6d 70 6c 69     if( exprImpli
2b190 65 73 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65  esNotNull(pParse
2b1a0 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 70 4e 4e  , p->pRight, pNN
2b1b0 2c 20 69 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29  , iTab, seenNot)
2b1c0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
2b1d0 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
2b1e0 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61  into the next ca
2b1f0 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
2b200 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20  case TK_SPAN:.  
2b210 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54    case TK_COLLAT
2b220 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  E:.    case TK_B
2b230 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
2b240 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61  TK_UPLUS:.    ca
2b250 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
2b260 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 78 70        return exp
2b270 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28  rImpliesNotNull(
2b280 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65 66 74  pParse, p->pLeft
2b290 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65  , pNN, iTab, see
2b2a0 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nNot);.    }.   
2b2b0 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20   case TK_TRUTH: 
2b2c0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 65 65 6e  {.      if( seen
2b2d0 4e 6f 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Not ) return 0;.
2b2e0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 32        if( p->op2
2b2f0 21 3d 54 4b 5f 49 53 20 29 20 72 65 74 75 72 6e  !=TK_IS ) return
2b300 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2b310 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e   exprImpliesNotN
2b320 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ull(pParse, p->p
2b330 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c  Left, pNN, iTab,
2b340 20 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d   seenNot);.    }
2b350 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
2b360 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
2b370 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e   exprImpliesNotN
2b380 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ull(pParse, p->p
2b390 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c  Left, pNN, iTab,
2b3a0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   1);.    }.  }. 
2b3b0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2b3c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
2b3d0 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20  if we can prove 
2b3e0 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77  the pE2 will alw
2b3f0 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20 70  ays be true if p
2b400 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20  E1 is.** true.  
2b410 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
2b420 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65  we cannot comple
2b430 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20  te the proof or 
2b440 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20  if pE2 might.** 
2b450 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70  be false.  Examp
2b460 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  les:.**.**     p
2b470 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70  E1: x==5       p
2b480 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
2b490 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
2b4a0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e  e.**     pE1: x>
2b4b0 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  0        pE2: x=
2b4c0 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52  =5             R
2b4d0 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
2b4e0 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20      pE1: x=21   
2b4f0 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52      pE2: x=21 OR
2b500 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74   y=43     Result
2b510 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
2b520 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70 45  1: x!=123     pE
2b530 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
2b540 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
2b550 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d  .**     pE1: x!=
2b560 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20 49  ?1      pE2: x I
2b570 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
2b580 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
2b590 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c    pE1: x IS NULL
2b5a0 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
2b5b0 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
2b5c0 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31  false.**     pE1
2b5d0 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45 32  : x IS ?2    pE2
2b5e0 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
2b5f0 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65     Reuslt: false
2b600 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70  .**.** When comp
2b610 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20  aring TK_COLUMN 
2b620 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70 45  nodes between pE
2b630 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45  1 and pE2, if pE
2b640 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54  2 has.** Expr.iT
2b650 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75  able<0 then assu
2b660 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65  me a table numbe
2b670 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e  r given by iTab.
2b680 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73 65  .**.** If pParse
2b690 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
2b6a0 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  en the values of
2b6b0 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73   bound variables
2b6c0 20 69 6e 20 70 45 31 20 61 72 65 20 0a 2a 2a 20   in pE1 are .** 
2b6d0 63 6f 6d 70 61 72 65 64 20 61 67 61 69 6e 73 74  compared against
2b6e0 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73 20   literal values 
2b6f0 69 6e 20 70 45 32 20 61 6e 64 20 70 50 61 72 73  in pE2 and pPars
2b700 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61 73  e->pVdbe->expmas
2b710 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66 69 65 64  k is.** modified
2b720 20 74 6f 20 72 65 63 6f 72 64 20 77 68 69 63 68   to record which
2b730 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73   bound variables
2b740 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64 2e   are referenced.
2b750 20 20 49 66 20 70 50 61 72 73 65 20 0a 2a 2a 20    If pParse .** 
2b760 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66 61  is NULL, then fa
2b770 6c 73 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75  lse will be retu
2b780 72 6e 65 64 20 69 66 20 70 45 31 20 63 6f 6e 74  rned if pE1 cont
2b790 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e 64 20 76  ains any bound v
2b7a0 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ariables..**.** 
2b7b0 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72  When in doubt, r
2b7c0 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65  eturn false.  Re
2b7d0 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67  turning true mig
2b7e0 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
2b7f0 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65  mance.** improve
2b800 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67  ment.  Returning
2b810 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75   false might cau
2b820 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  se a performance
2b830 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a   reduction, but.
2b840 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79  ** it will alway
2b850 73 20 67 69 76 65 20 74 68 65 20 63 6f 72 72 65  s give the corre
2b860 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73  ct answer and is
2b870 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61   hence always sa
2b880 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  fe..*/.int sqlit
2b890 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
2b8a0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
2b8b0 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72   Expr *pE1, Expr
2b8c0 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29   *pE2, int iTab)
2b8d0 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  {.  if( sqlite3E
2b8e0 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
2b8f0 65 2c 20 70 45 31 2c 20 70 45 32 2c 20 69 54 61  e, pE1, pE2, iTa
2b900 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  b)==0 ){.    ret
2b910 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
2b920 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a   pE2->op==TK_OR.
2b930 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78     && (sqlite3Ex
2b940 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 50  prImpliesExpr(pP
2b950 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e  arse, pE1, pE2->
2b960 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20  pLeft, iTab).   
2b970 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
2b980 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
2b990 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c  xpr(pParse, pE1,
2b9a0 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54   pE2->pRight, iT
2b9b0 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72  ab) ).  ){.    r
2b9c0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
2b9d0 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e  f( pE2->op==TK_N
2b9e0 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 65 78 70  OTNULL.   && exp
2b9f0 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28  rImpliesNotNull(
2ba00 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32  pParse, pE1, pE2
2ba10 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 2c 20 30  ->pLeft, iTab, 0
2ba20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2ba30 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
2ba40 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
2ba50 69 73 20 69 73 20 74 68 65 20 45 78 70 72 20 6e  is is the Expr n
2ba60 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ode callback for
2ba70 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
2ba80 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 29 2e  iesNotNullRow().
2ba90 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
2baa0 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 71 75 69  ssion node requi
2bab0 72 65 73 20 74 68 61 74 20 74 68 65 20 74 61 62  res that the tab
2bac0 6c 65 20 61 74 20 70 57 61 6c 6b 65 72 2d 3e 69  le at pWalker->i
2bad0 43 75 72 0a 2a 2a 20 68 61 76 65 20 6f 6e 65 20  Cur.** have one 
2bae0 6f 72 20 6d 6f 72 65 20 6e 6f 6e 2d 4e 55 4c 4c  or more non-NULL
2baf0 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 73 65   column, then se
2bb00 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  t pWalker->eCode
2bb10 20 74 6f 20 31 20 61 6e 64 20 61 62 6f 72 74 2e   to 1 and abort.
2bb20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2bb30 69 6e 65 20 63 6f 6e 74 72 6f 6c 73 20 61 6e 20  ine controls an 
2bb40 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 46  optimization.  F
2bb50 61 6c 73 65 20 70 6f 73 69 74 69 76 65 73 20 28  alse positives (
2bb60 73 65 74 74 69 6e 67 0a 2a 2a 20 70 57 61 6c 6b  setting.** pWalk
2bb70 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 20 77  er->eCode to 1 w
2bb80 68 65 6e 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f  hen it should no
2bb90 74 20 62 65 29 20 61 72 65 20 64 65 61 64 6c 79  t be) are deadly
2bba0 2c 20 62 75 74 20 66 61 6c 73 65 2d 6e 65 67 61  , but false-nega
2bbb0 74 69 76 65 73 0a 2a 2a 20 28 6e 65 76 65 72 20  tives.** (never 
2bbc0 73 65 74 74 69 6e 67 20 70 57 61 6c 6b 65 72 2d  setting pWalker-
2bbd0 3e 65 43 6f 64 65 29 20 69 73 20 61 20 68 61 72  >eCode) is a har
2bbe0 6d 6c 65 73 73 20 6d 69 73 73 65 64 20 6f 70 74  mless missed opt
2bbf0 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  imization..*/.st
2bc00 61 74 69 63 20 69 6e 74 20 69 6d 70 6c 69 65 73  atic int implies
2bc10 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57 61 6c 6b 65  NotNullRow(Walke
2bc20 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2bc30 20 2a 70 45 78 70 72 29 7b 0a 20 20 74 65 73 74   *pExpr){.  test
2bc40 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2bc50 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
2bc60 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
2bc70 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2bc80 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66  FUNCTION );.  if
2bc90 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2bca0 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
2bcb0 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 57  Join) ) return W
2bcc0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 73 77 69 74  RC_Prune;.  swit
2bcd0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
2bce0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
2bcf0 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
2bd00 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
2bd10 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
2bd20 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 0a 20 20  e TK_NOTNULL:.  
2bd30 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
2bd40 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
2bd50 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 0a    case TK_CASE:.
2bd60 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a      case TK_IN:.
2bd70 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
2bd80 54 49 4f 4e 3a 0a 20 20 20 20 20 20 74 65 73 74  TION:.      test
2bd90 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2bda0 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
2bdb0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2bdc0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29  pr->op==TK_NOT )
2bdd0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2bde0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2bdf0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
2be00 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2be10 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20  >op==TK_NOTNULL 
2be20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2be30 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2be40 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
2be50 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2be60 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20  ==TK_OR );.     
2be70 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2be80 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b  ->op==TK_CASE );
2be90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2bea0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2beb0 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
2bec0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2bed0 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  TK_FUNCTION );. 
2bee0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2bef0 50 72 75 6e 65 3b 0a 20 20 20 20 63 61 73 65 20  Prune;.    case 
2bf00 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20  TK_COLUMN:.     
2bf10 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   if( pWalker->u.
2bf20 69 43 75 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61  iCur==pExpr->iTa
2bf30 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ble ){.        p
2bf40 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
2bf50 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
2bf60 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2bf70 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
2bf80 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 0a 20 20  n WRC_Prune;..  
2bf90 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
2bfa0 6c 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  les are allowed 
2bfb0 74 6f 20 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  to use constrain
2bfc0 74 73 20 6c 69 6b 65 20 78 3d 4e 55 4c 4c 2e 20  ts like x=NULL. 
2bfd0 20 53 6f 0a 20 20 20 20 2a 2a 20 61 20 74 65 72   So.    ** a ter
2bfe0 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 78 3d  m of the form x=
2bff0 79 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 65  y does not prove
2c000 20 74 68 61 74 20 79 20 69 73 20 6e 6f 74 20 6e   that y is not n
2c010 75 6c 6c 20 69 66 20 78 0a 20 20 20 20 2a 2a 20  ull if x.    ** 
2c020 69 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  is the column of
2c030 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
2c040 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
2c050 45 51 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EQ:.    case TK_
2c060 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
2c070 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
2c080 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
2c090 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
2c0a0 47 45 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  GE:.      testca
2c0b0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2c0c0 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65  K_EQ );.      te
2c0d0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c0e0 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20  p==TK_NE );.    
2c0f0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2c100 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  r->op==TK_LT );.
2c110 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c120 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  pExpr->op==TK_LE
2c130 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2c140 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2c150 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GT );.      te
2c160 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c170 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
2c180 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e 70 4c    if( (pExpr->pL
2c190 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
2c1a0 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c 28  MN && IsVirtual(
2c1b0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 79 2e  pExpr->pLeft->y.
2c1c0 70 54 61 62 29 29 0a 20 20 20 20 20 20 20 7c 7c  pTab)).       ||
2c1d0 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d   (pExpr->pRight-
2c1e0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
2c1f0 26 20 49 73 56 69 72 74 75 61 6c 28 70 45 78 70  & IsVirtual(pExp
2c200 72 2d 3e 70 52 69 67 68 74 2d 3e 79 2e 70 54 61  r->pRight->y.pTa
2c210 62 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  b)).      ){.   
2c220 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2c230 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rune;.      }.  
2c240 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
2c250 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2c260 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  inue;.  }.}../*.
2c270 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28  ** Return true (
2c280 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 65 78 70  non-zero) if exp
2c290 72 65 73 73 69 6f 6e 20 70 20 63 61 6e 20 6f 6e  ression p can on
2c2a0 6c 79 20 62 65 20 74 72 75 65 20 69 66 20 61 74  ly be true if at
2c2b0 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 63 6f   least.** one co
2c2c0 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 54  lumn of table iT
2c2d0 61 62 20 69 73 20 6e 6f 6e 2d 6e 75 6c 6c 2e 20  ab is non-null. 
2c2e0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2c2f0 20 72 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20   return true.** 
2c300 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  if expression p 
2c310 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 4e  will always be N
2c320 55 4c 4c 20 6f 72 20 66 61 6c 73 65 20 69 66 20  ULL or false if 
2c330 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  every column of 
2c340 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e  iTab.** is NULL.
2c350 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 6e 65 67  .**.** False neg
2c360 61 74 69 76 65 73 20 61 72 65 20 61 63 63 65 70  atives are accep
2c370 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72  table.  In other
2c380 20 77 6f 72 64 73 2c 20 69 74 20 69 73 20 6f 6b   words, it is ok
2c390 20 74 6f 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65   to return.** ze
2c3a0 72 6f 20 65 76 65 6e 20 69 66 20 65 78 70 72 65  ro even if expre
2c3b0 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20 6e 65 76  ssion p will nev
2c3c0 65 72 20 62 65 20 74 72 75 65 20 6f 66 20 65 76  er be true of ev
2c3d0 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54  ery column of iT
2c3e0 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 20 20  ab.** is NULL.  
2c3f0 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  A false negative
2c400 20 69 73 20 6d 65 72 65 6c 79 20 61 20 6d 69 73   is merely a mis
2c410 73 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  sed optimization
2c420 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2a   opportunity..**
2c430 0a 2a 2a 20 46 61 6c 73 65 20 70 6f 73 69 74 69  .** False positi
2c440 76 65 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ves are not allo
2c450 77 65 64 2c 20 68 6f 77 65 76 65 72 2e 20 20 41  wed, however.  A
2c460 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 20   false positive 
2c470 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  may result.** in
2c480 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e   an incorrect an
2c490 73 77 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  swer..**.** Term
2c4a0 73 20 6f 66 20 70 20 74 68 61 74 20 61 72 65 20  s of p that are 
2c4b0 6d 61 72 6b 65 64 20 77 69 74 68 20 45 50 5f 46  marked with EP_F
2c4c0 72 6f 6d 4a 6f 69 6e 20 28 61 6e 64 20 68 65 6e  romJoin (and hen
2c4d0 63 65 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f  ce that come fro
2c4e0 6d 0a 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55  m.** the ON or U
2c4f0 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
2c500 4c 45 46 54 20 4a 4f 49 4e 53 29 20 61 72 65 20  LEFT JOINS) are 
2c510 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
2c520 65 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a  e analysis..**.*
2c530 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2c540 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
2c550 69 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  if a LEFT JOIN c
2c560 61 6e 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  an be converted 
2c570 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e  into.** an ordin
2c580 61 72 79 20 4a 4f 49 4e 2e 20 20 54 68 65 20 70  ary JOIN.  The p
2c590 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2c5a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2c5b0 49 66 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  If the WHERE.** 
2c5c0 63 6c 61 75 73 65 20 72 65 71 75 69 72 65 73 20  clause requires 
2c5d0 74 68 61 74 20 73 6f 6d 65 20 63 6f 6c 75 6d 6e  that some column
2c5e0 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
2c5f0 62 6c 65 20 6f 66 20 74 68 65 20 4c 45 46 54 20  ble of the LEFT 
2c600 4a 4f 49 4e 0a 2a 2a 20 62 65 20 6e 6f 6e 2d 4e  JOIN.** be non-N
2c610 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 4c 45  ULL, then the LE
2c620 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 73  FT JOIN can be s
2c630 61 66 65 6c 79 20 63 6f 6e 76 65 72 74 65 64 20  afely converted 
2c640 69 6e 74 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e  into an.** ordin
2c650 61 72 79 20 6a 6f 69 6e 2e 0a 2a 2f 0a 69 6e 74  ary join..*/.int
2c660 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
2c670 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 45 78  iesNonNullRow(Ex
2c680 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 29  pr *p, int iTab)
2c690 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2c6a0 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
2c6b0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20  kipCollate(p);. 
2c6c0 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
2c6d0 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e   if( p->op==TK_N
2c6e0 4f 54 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  OTNULL ){.      
2c6f0 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
2c700 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f    }else if( p->o
2c710 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
2c720 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2c730 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c  prImpliesNonNull
2c740 52 6f 77 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54  Row(p->pLeft, iT
2c750 61 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ab) ) return 1;.
2c760 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69        p = p->pRi
2c770 67 68 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ght;.    }else{.
2c780 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c790 20 7d 0a 20 20 7d 0a 20 20 77 2e 78 45 78 70 72   }.  }.  w.xExpr
2c7a0 43 61 6c 6c 62 61 63 6b 20 3d 20 69 6d 70 6c 69  Callback = impli
2c7b0 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20  esNotNullRow;.  
2c7c0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2c7d0 6b 20 3d 20 30 3b 0a 20 20 77 2e 78 53 65 6c 65  k = 0;.  w.xSele
2c7e0 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b  ctCallback2 = 0;
2c7f0 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b 0a  .  w.eCode = 0;.
2c800 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 54 61    w.u.iCur = iTa
2c810 62 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  b;.  sqlite3Walk
2c820 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
2c830 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d  eturn w.eCode;.}
2c840 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
2c850 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2c860 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
2c870 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
2c880 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
2c890 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20  determine if an 
2c8a0 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
2c8b0 65 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72  e evaluated by r
2c8c0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
2c8d0 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77  ** index only, w
2c8e0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
2c8f0 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
2c900 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2c910 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72  ng.** table entr
2c920 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72  y.  The IdxCover
2c930 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74  .pIdx field is t
2c940 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f  he index.  IdxCo
2c950 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74  ver.iCur.** is t
2c960 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  he cursor for th
2c970 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  e table..*/.stru
2c980 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20  ct IdxCover {.  
2c990 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
2c9a0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
2c9b0 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63   be tested for c
2c9c0 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74  overage */.  int
2c9d0 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a   iCur;        /*
2c9e0 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
2c9f0 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72  or the table cor
2ca00 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
2ca10 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f  e index */.};../
2ca20 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
2ca30 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72  e if there are r
2ca40 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2ca50 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a  umns in table .*
2ca60 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  * pWalker->u.pId
2ca70 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e  xCover->iCur can
2ca80 20 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73   be satisfied us
2ca90 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ing the index.**
2caa0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
2cab0 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a  Cover->pIdx..*/.
2cac0 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
2cad0 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a  dxCover(Walker *
2cae0 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2caf0 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
2cb00 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
2cb10 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  N.   && pExpr->i
2cb20 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Table==pWalker->
2cb30 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75  u.pIdxCover->iCu
2cb40 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43  r.   && sqlite3C
2cb50 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61  olumnOfIndex(pWa
2cb60 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2cb70 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e  r->pIdx, pExpr->
2cb80 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a  iColumn)<0.  ){.
2cb90 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
2cba0 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  de = 1;.    retu
2cbb0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2cbc0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2cbd0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2cbe0 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
2cbf0 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20  n index pIdx on 
2cc00 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
2cc10 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  r iCur contains 
2cc20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72  will.** the expr
2cc30 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
2cc40 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
2cc50 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76  e index does cov
2cc60 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  er the.** expres
2cc70 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69  sion and false i
2cc80 66 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  f the pExpr expr
2cc90 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65  ession reference
2cca0 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a  s table columns.
2ccb0 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
2ccc0 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64  found in the ind
2ccd0 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41  ex pIdx..**.** A
2cce0 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67  n index covering
2ccf0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
2cd00 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78  eans that the ex
2cd10 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a  pression can be.
2cd20 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69  ** evaluated usi
2cd30 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65  ng only the inde
2cd40 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61  x and without ha
2cd50 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74  ving to lookup t
2cd60 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
2cd70 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  ing table entry.
2cd80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2cd90 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65  xprCoveredByInde
2cda0 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  x(.  Expr *pExpr
2cdb0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
2cdc0 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74  index to be test
2cdd0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
2cde0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2cdf0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
2ce00 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
2ce10 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a  onding table */.
2ce20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
2ce30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
2ce40 65 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ex that might be
2ce50 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61   used for covera
2ce60 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65  ge */.){.  Walke
2ce70 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64  r w;.  struct Id
2ce80 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d  xCover xcov;.  m
2ce90 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
2cea0 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e  eof(w));.  xcov.
2ceb0 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78  iCur = iCur;.  x
2cec0 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  cov.pIdx = pIdx;
2ced0 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
2cee0 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65  ck = exprIdxCove
2cef0 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76  r;.  w.u.pIdxCov
2cf00 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71  er = &xcov;.  sq
2cf10 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
2cf20 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75  , pExpr);.  retu
2cf30 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  rn !w.eCode;.}..
2cf40 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2cf50 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2cf60 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2cf70 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
2cf80 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63  e walker.** to c
2cf90 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  ount references 
2cfa0 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  to table columns
2cfb0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
2cfc0 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72  s of an .** aggr
2cfd0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  egate function, 
2cfe0 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
2cff0 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c  ement the.** sql
2d000 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73  ite3FunctionThis
2d010 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  Src() routine..*
2d020 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e  /.struct SrcCoun
2d030 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  t {.  SrcList *p
2d040 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61  Src;   /* One pa
2d050 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c  rticular FROM cl
2d060 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64  ause in a nested
2d070 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
2d080 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20  nThis;       /* 
2d090 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
2d0a0 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
2d0b0 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  in pSrcList */. 
2d0c0 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20   int nOther;    
2d0d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2d0e0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2d0f0 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52  umns in other FR
2d100 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b  OM clauses */.};
2d110 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  ../*.** Count th
2d120 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
2d130 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
2d140 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2d150 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61   exprSrcCount(Wa
2d160 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2d170 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f  xpr *pExpr){.  /
2d180 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e  * The NEVER() on
2d190 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d   the second term
2d1a0 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69   is because sqli
2d1b0 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
2d1c0 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73  hisSrc().  ** is
2d1d0 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62   always called b
2d1e0 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70  efore sqlite3Exp
2d1f0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2d200 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a  es() and so the.
2d210 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20    ** TK_COLUMNs 
2d220 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
2d230 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  n converted into
2d240 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20   TK_AGG_COLUMN. 
2d250 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   If.  ** sqlite3
2d260 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
2d270 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69  Src() is used di
2d280 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  fferently in the
2d290 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a   future, the.  *
2d2a0 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e  * NEVER() will n
2d2b0 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65  eed to be remove
2d2c0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  d. */.  if( pExp
2d2d0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2d2e0 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d   || NEVER(pExpr-
2d2f0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
2d300 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  MN) ){.    int i
2d310 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
2d320 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b  Count *p = pWalk
2d330 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b  er->u.pSrcCount;
2d340 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
2d350 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
2d360 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72    int nSrc = pSr
2d370 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a  c ? pSrc->nSrc :
2d380 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
2d390 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20   i<nSrc; i++){. 
2d3a0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
2d3b0 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
2d3c0 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65  i].iCursor ) bre
2d3d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
2d3e0 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20  ( i<nSrc ){.    
2d3f0 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20    p->nThis++;.  
2d400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2d410 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20  ->nOther++;.    
2d420 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
2d430 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2d440 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
2d450 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72  if any of the ar
2d460 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70  guments to the p
2d470 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65  Expr Function re
2d480 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c  ference.** pSrcL
2d490 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ist.  Return tru
2d4a0 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41  e if they do.  A
2d4b0 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20  lso return true 
2d4c0 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  if the function.
2d4d0 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65  ** has no argume
2d4e0 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20  nts or has only 
2d4f0 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
2d500 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ts.  Return fals
2d510 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65  e if pExpr.** re
2d520 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73  ferences columns
2d530 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73   but not columns
2d540 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64   of tables found
2d550 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f   in pSrcList..*/
2d560 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63  .int sqlite3Func
2d570 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
2d580 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63  Expr *pExpr, Src
2d590 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b  List *pSrcList){
2d5a0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
2d5b0 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63  truct SrcCount c
2d5c0 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  nt;.  assert( pE
2d5d0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2d5e0 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77 2e  FUNCTION );.  w.
2d5f0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2d600 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20  exprSrcCount;.  
2d610 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2d620 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 72  k = 0;.  w.u.pSr
2d630 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20  cCount = &cnt;. 
2d640 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63   cnt.pSrc = pSrc
2d650 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69  List;.  cnt.nThi
2d660 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74  s = 0;.  cnt.nOt
2d670 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  her = 0;.  sqlit
2d680 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26  e3WalkExprList(&
2d690 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  w, pExpr->x.pLis
2d6a0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74  t);.  return cnt
2d6b0 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e  .nThis>0 || cnt.
2d6c0 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  nOther==0;.}../*
2d6d0 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
2d6e0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
2d6f0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
2d700 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
2d710 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
2d720 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
2d730 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
2d740 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
2d750 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
2d760 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
2d770 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
2d780 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
2d790 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
2d7a0 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
2d7b0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
2d7c0 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
2d7d0 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
2d7e0 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
2d7f0 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
2d800 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
2d810 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->nColumn,.     
2d820 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
2d830 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
2d840 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
2d850 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
2d860 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72  Info->aFunc[] ar
2d870 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
2d880 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
2d890 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
2d8a0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
2d8b0 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
2d8c0 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
2d8d0 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
2d8e0 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64  oFunc(sqlite3 *d
2d8f0 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
2d900 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
2d910 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71  Info->aFunc = sq
2d920 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
2d930 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a  te(.       db, .
2d940 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46         pInfo->aF
2d950 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  unc,.       size
2d960 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
2d970 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
2d980 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
2d990 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
2d9a0 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
2d9b0 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
2d9c0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ExprCallback for
2d9d0 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20   a tree walker. 
2d9e0 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a   It is used to.*
2d9f0 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  * implement sqli
2da00 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2da10 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
2da20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2da30 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
2da40 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
2da50 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
2da60 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
2da70 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b  zeAggregate(Walk
2da80 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2da90 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
2daa0 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
2dab0 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
2dac0 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65  ->u.pNC;.  Parse
2dad0 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
2dae0 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
2daf0 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
2db00 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
2db10 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2db20 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 41 67 67   = pNC->uNC.pAgg
2db30 49 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  Info;..  assert(
2db40 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20   pNC->ncFlags & 
2db50 4e 43 5f 55 41 67 67 49 6e 66 6f 20 29 3b 0a 20  NC_UAggInfo );. 
2db60 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
2db70 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
2db80 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
2db90 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
2dba0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
2dbb0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2dbc0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
2dbd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2dbe0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
2dbf0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  LUMN );.      /*
2dc00 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2dc10 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69   the column is i
2dc20 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62  n one of the tab
2dc30 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
2dc40 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20        ** clause 
2dc50 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
2dc60 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
2dc70 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c  if( ALWAYS(pSrcL
2dc80 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
2dc90 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2dca0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
2dcb0 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pSrcList->a;.   
2dcc0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2dcd0 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
2dce0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
2dcf0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2dd00 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
2dd10 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  l;.          ass
2dd20 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2dd30 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2dd40 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2dd50 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
2dd60 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
2dd70 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
2dd80 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
2dd90 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
2dda0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
2ddb0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78  t means that pEx
2ddc0 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  pr refers to a t
2ddd0 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
2dde0 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74   ** that is in t
2ddf0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2de00 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
2de10 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20  query.  .       
2de20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2de30 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65      ** Make an e
2de40 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  ntry for the col
2de50 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  umn in pAggInfo-
2de60 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65  >aCol[] if there
2de70 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2de80 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20  is not an entry 
2de90 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
2dea0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2deb0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
2dec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
2ded0 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  l = pAggInfo->aC
2dee0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
2def0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49  for(k=0; k<pAggI
2df00 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  nfo->nColumn; k+
2df10 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
2df20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2df30 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  ol->iTable==pExp
2df40 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
2df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2df60 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  Col->iColumn==pE
2df70 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
2df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2dfa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2dfb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2dfc0 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66   if( (k>=pAggInf
2dfd0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20  o->nColumn).    
2dfe0 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d           && (k =
2dff0 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
2e000 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  n(pParse->db, pA
2e010 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20  ggInfo))>=0 .   
2e020 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2e030 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
2e040 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
2e050 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [k];.           
2e060 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
2e070 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20  pExpr->y.pTab;. 
2e080 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2e090 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70  l->iTable = pExp
2e0a0 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
2e0b0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2e0c0 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
2e0d0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
2e0e0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65         pCol->iMe
2e0f0 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
2e100 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
2e110 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
2e120 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
2e130 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2e140 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
2e150 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2e160 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
2e170 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBy ){.         
2e180 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b         int j, n;
2e190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e1a0 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d   ExprList *pGB =
2e1b0 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
2e1c0 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBy;.           
2e1d0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
2e1e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d  List_item *pTerm
2e1f0 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20   = pGB->a;.     
2e200 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70             n = p
2e210 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  GB->nExpr;.     
2e220 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
2e230 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54  =0; j<n; j++, pT
2e240 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
2e250 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
2e260 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
2e270 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
2e280 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
2e290 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
2e2a0 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
2e2b0 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
2e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2d0 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45   pE->iColumn==pE
2e2e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
2e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e300 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
2e310 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20  rColumn = j;.   
2e320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e330 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2e340 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e350 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2e360 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2e370 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e380 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2e390 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
2e3a0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2e3b0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70  SorterColumn = p
2e3c0 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e  AggInfo->nSortin
2e3d0 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20  gColumn++;.     
2e3e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e3f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e400 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
2e410 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f   now an entry fo
2e420 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49  r pExpr in pAggI
2e430 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74  nfo->aCol[] (eit
2e440 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  her.            
2e450 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61  ** because it wa
2e460 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f  s there before o
2e470 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  r because we jus
2e480 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20  t created it).. 
2e490 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f             ** Co
2e4a0 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20  nvert the pExpr 
2e4b0 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43  to be a TK_AGG_C
2e4c0 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20  OLUMN referring 
2e4d0 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  to that.        
2e4e0 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d      ** pAggInfo-
2e4f0 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20  >aCol[] entry.. 
2e500 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2e510 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
2e520 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
2e530 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
2e540 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
2e550 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
2e560 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
2e570 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
2e580 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b  = TK_AGG_COLUMN;
2e590 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
2e5a0 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29  pr->iAgg = (i16)
2e5b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  k;.            b
2e5c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2e5d0 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72  } /* endif pExpr
2e5e0 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
2e5f0 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20  >iCursor */.    
2e600 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f      } /* end loo
2e610 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  p over pSrcList 
2e620 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
2e630 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2e640 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  e;.    }.    cas
2e650 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
2e660 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28  N: {.      if( (
2e670 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e  pNC->ncFlags & N
2e680 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a  C_InAggFunc)==0.
2e690 20 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65         && pWalke
2e6a0 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d  r->walkerDepth==
2e6b0 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20  pExpr->op2.     
2e6c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
2e6d0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
2e6e0 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63  Expr is a duplic
2e6f0 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61  ate of another a
2e700 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20  ggregate .      
2e710 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68    ** function th
2e720 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  at is already in
2e730 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74   the pAggInfo st
2e740 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20  ructure.        
2e750 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  */.        struc
2e760 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
2e770 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f  pItem = pAggInfo
2e780 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  ->aFunc;.       
2e790 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
2e7a0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
2e7b0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2e7c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2e7d0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
2e7e0 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45  pItem->pExpr, pE
2e7f0 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  xpr, -1)==0 ){. 
2e800 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2e810 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2e820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e830 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d  if( i>=pAggInfo-
2e840 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  >nFunc ){.      
2e850 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20      /* pExpr is 
2e860 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20  original.  Make 
2e870 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
2e880 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
2e890 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2e8a0 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d          u8 enc =
2e8b0 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
2e8c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  ;.          i = 
2e8d0 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70  addAggInfoFunc(p
2e8e0 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
2e8f0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
2e900 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20  if( i>=0 ){.    
2e910 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e920 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2e930 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
2e940 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20  lect) );.       
2e950 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41       pItem = &pA
2e960 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
2e970 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
2e980 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
2e990 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
2e9a0 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b  pItem->iMem = ++
2e9b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2e9c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2e9d0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2e9e0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
2e9f0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
2ea00 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75        pItem->pFu
2ea10 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nc = sqlite3Find
2ea20 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
2ea30 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
2ea40 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75          pExpr->u
2ea50 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20  .zToken, .      
2ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2ea70 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45  pr->x.pList ? pE
2ea80 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
2ea90 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29  xpr : 0, enc, 0)
2eaa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2eab0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
2eac0 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   EP_Distinct ){.
2ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2eae0 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
2eaf0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2eb00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
2eb10 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2eb20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
2eb30 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ct = -1;.       
2eb40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2eb50 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2eb60 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78       /* Make pEx
2eb70 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  pr point to the 
2eb80 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67  appropriate pAgg
2eb90 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e  Info->aFunc[] en
2eba0 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  try.        */. 
2ebb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2ebc0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2ebd0 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
2ebe0 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
2ebf0 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53  );.        ExprS
2ec00 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
2ec10 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
2ec20 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
2ec30 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b  ->iAgg = (i16)i;
2ec40 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
2ec50 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
2ec60 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  nfo;.        ret
2ec70 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2ec80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ec90 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
2eca0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
2ecb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2ecc0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2ecd0 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
2ece0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2ecf0 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20  InSelect(Walker 
2ed00 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
2ed10 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e   *pSelect){.  UN
2ed20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2ed30 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b  Select);.  pWalk
2ed40 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2b  er->walkerDepth+
2ed50 2b 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  +;.  return WRC_
2ed60 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
2ed70 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 41  ic void analyzeA
2ed80 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
2ed90 74 45 6e 64 28 57 61 6c 6b 65 72 20 2a 70 57 61  tEnd(Walker *pWa
2eda0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
2edb0 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44  elect){.  UNUSED
2edc0 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65  _PARAMETER(pSele
2edd0 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ct);.  pWalker->
2ede0 77 61 6c 6b 65 72 44 65 70 74 68 2d 2d 3b 0a 7d  walkerDepth--;.}
2edf0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
2ee00 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
2ee10 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
2ee20 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2ee30 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
2ee40 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
2ee50 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
2ee60 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  to AggInfo objec
2ee70 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67  t that pNC->pAgg
2ee80 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  Info.** points t
2ee90 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65  o.  Additional e
2eea0 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20  ntries are made 
2eeb0 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f  on the AggInfo o
2eec0 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65  bject as.** nece
2eed0 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
2eee0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
2eef0 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
2ef00 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
2ef10 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
2ef20 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
2ef30 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
2ef40 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ames()..*/.void 
2ef50 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2ef60 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d  zeAggregates(Nam
2ef70 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
2ef80 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57  xpr *pExpr){.  W
2ef90 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78  alker w;.  w.xEx
2efa0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  prCallback = ana
2efb0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20  lyzeAggregate;. 
2efc0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2efd0 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
2efe0 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a  egatesInSelect;.
2eff0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2f000 61 63 6b 32 20 3d 20 61 6e 61 6c 79 7a 65 41 67  ack2 = analyzeAg
2f010 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
2f020 45 6e 64 3b 0a 20 20 77 2e 77 61 6c 6b 65 72 44  End;.  w.walkerD
2f030 65 70 74 68 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  epth = 0;.  w.u.
2f040 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 77 2e 70  pNC = pNC;.  w.p
2f050 50 61 72 73 65 20 3d 20 30 3b 0a 20 20 61 73 73  Parse = 0;.  ass
2f060 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ert( pNC->pSrcLi
2f070 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  st!=0 );.  sqlit
2f080 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
2f090 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
2f0a0 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  Call sqlite3Expr
2f0b0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2f0c0 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  s() for every ex
2f0d0 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a  pression in an.*
2f0e0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
2f0f0 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  t.  Return the n
2f100 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
2f110 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2f120 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
2f130 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74   analysis is cut
2f140 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20   short..*/.void 
2f150 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2f160 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f  zeAggList(NameCo
2f170 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
2f180 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2f190 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2f1a0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
2f1b0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
2f1c0 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74  t ){.    for(pIt
2f1d0 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
2f1e0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
2f1f0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
2f200 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2f210 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2f220 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e  tes(pNC, pItem->
2f230 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2f240 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
2f250 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77  ate a single new
2f260 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75 73   register for us
2f270 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69  e to hold some i
2f280 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
2f290 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  lt..*/.int sqlit
2f2a0 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72  e3GetTempReg(Par
2f2b0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
2f2c0 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
2f2d0 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Reg==0 ){.    re
2f2e0 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  turn ++pParse->n
2f2f0 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Mem;.  }.  retur
2f300 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  n pParse->aTempR
2f310 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65  eg[--pParse->nTe
2f320 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mpReg];.}../*.**
2f330 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65   Deallocate a re
2f340 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61  gister, making a
2f350 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75  vailable for reu
2f360 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  se for some othe
2f370 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2f  r.** purpose..*/
2f380 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
2f390 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73  easeTempReg(Pars
2f3a0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
2f3b0 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67  Reg){.  if( iReg
2f3c0 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d   && pParse->nTem
2f3d0 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
2f3e0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
2f3f0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
2f400 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
2f410 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69  >nTempReg++] = i
2f420 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
2f430 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65  * Allocate or de
2f440 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b  allocate a block
2f450 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75   of nReg consecu
2f460 74 69 76 65 20 72 65 67 69 73 74 65 72 73 2e 0a  tive registers..
2f470 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
2f480 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  tTempRange(Parse
2f490 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52   *pParse, int nR
2f4a0 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  eg){.  int i, n;
2f4b0 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29  .  if( nReg==1 )
2f4c0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47   return sqlite3G
2f4d0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2f4e0 29 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d  );.  i = pParse-
2f4f0 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20  >iRangeReg;.  n 
2f500 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  = pParse->nRange
2f510 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c  Reg;.  if( nReg<
2f520 3d 6e 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  =n ){.    pParse
2f530 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e  ->iRangeReg += n
2f540 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
2f550 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52  >nRangeReg -= nR
2f560 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eg;.  }else{.   
2f570 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65   i = pParse->nMe
2f580 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
2f590 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20  >nMem += nReg;. 
2f5a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
2f5b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
2f5c0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61  easeTempRange(Pa
2f5d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2f5e0 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
2f5f0 7b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20  {.  if( nReg==1 
2f600 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
2f610 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
2f620 72 73 65 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  rse, iReg);.    
2f630 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
2f640 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e  ( nReg>pParse->n
2f650 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20  RangeReg ){.    
2f660 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2f670 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50  g = nReg;.    pP
2f680 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
2f690 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
2f6a0 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65  *.** Mark all te
2f6b0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
2f6c0 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61  s as being unava
2f6d0 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65  ilable for reuse
2f6e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2f6f0 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2f700 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
2f710 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65  ){.  pParse->nTe
2f720 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61  mpReg = 0;.  pPa
2f730 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2f740 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c   0;.}../*.** Val
2f750 69 64 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65  idate that no te
2f760 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
2f770 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68   falls within th
2f780 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46  e range of.** iF
2f790 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63  irst..iLast, inc
2f7a0 6c 75 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f  lusive.  This ro
2f7b0 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
2f7c0 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  ll from within a
2f7d0 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
2f7e0 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  ments..*/.#ifdef
2f7f0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
2f800 74 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73  t sqlite3NoTemps
2f810 49 6e 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  InRange(Parse *p
2f820 50 61 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73  Parse, int iFirs
2f830 74 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20  t, int iLast){. 
2f840 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50   int i;.  if( pP
2f850 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e  arse->nRangeReg>
2f860 30 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e  0.   && pParse->
2f870 69 52 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65  iRangeReg+pParse
2f880 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3e 20 69 46  ->nRangeReg > iF
2f890 69 72 73 74 0a 20 20 20 26 26 20 70 50 61 72 73  irst.   && pPars
2f8a0 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3c 3d 20  e->iRangeReg <= 
2f8b0 69 4c 61 73 74 0a 20 20 29 7b 0a 20 20 20 20 20  iLast.  ){.     
2f8c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2f8d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
2f8e0 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b  e->nTempReg; i++
2f8f0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
2f900 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d  e->aTempReg[i]>=
2f910 69 46 69 72 73 74 20 26 26 20 70 50 61 72 73 65  iFirst && pParse
2f920 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69  ->aTempReg[i]<=i
2f930 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
2f940 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
2f950 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
2f960 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2f970 5f 44 45 42 55 47 20 2a 2f 0a                    _DEBUG */.