/ Hex Artifact Content
Login

Artifact d1eeebc0ffcbd16759a9c838f8fe7de334bb0ff2afcc3a7ab9f9b5693b99f4cd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72   op;.  if( pExpr
0600: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e  ->flags & EP_Gen
0610: 65 72 69 63 20 29 20 72 65 74 75 72 6e 20 30 3b  eric ) return 0;
0620: 0a 20 20 77 68 69 6c 65 28 20 45 78 70 72 48 61  .  while( ExprHa
0630: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0640: 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20 20   EP_Skip) ){.   
0650: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0660: 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
0670: 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 45  ;.    pExpr = pE
0680: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
0690: 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30  assert( pExpr!=0
06a0: 20 29 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70   );.  }.  op = p
06b0: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
06c0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
06d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
06e0: 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49 73  pr->flags&EP_xIs
06f0: 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72 65  Select );.    re
0700: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
0710: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
0720: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
0730: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
0740: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
0750: 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
0760: 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23 69 66   pExpr->op2;.#if
0770: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0780: 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d  _CAST.  if( op==
0790: 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61  TK_CAST ){.    a
07a0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
07b0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
07c0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
07d0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
07e0: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45  3AffinityType(pE
07f0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
0800: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
0810: 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f  if( (op==TK_AGG_
0820: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
0830: 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45 78 70  _COLUMN) && pExp
0840: 72 2d 3e 79 2e 70 54 61 62 20 29 7b 0a 20 20 20  r->y.pTab ){.   
0850: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0860: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0870: 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54 61 62  ty(pExpr->y.pTab
0880: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
0890: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d  );.  }.  if( op=
08a0: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
08b0: 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  N ){.    assert(
08c0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66   pExpr->pLeft->f
08d0: 6c 61 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63  lags&EP_xIsSelec
08e0: 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t );.    return 
08f0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
0900: 69 74 79 28 0a 20 20 20 20 20 20 20 20 70 45 78  ity(.        pEx
0910: 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65  pr->pLeft->x.pSe
0920: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
0930: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
0940: 70 45 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d  pExpr.    );.  }
0950: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d  .  return pExpr-
0960: 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a  >affinity;.}../*
0970: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
0980: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
0990: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  or expression pE
09a0: 78 70 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f  xpr to be the co
09b0: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
09c0: 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f  nce named by pTo
09d0: 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20  ken.   Return a 
09e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77  pointer to a new
09f0: 20 45 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a   Expr node that.
0a00: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
0a10: 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  e COLLATE operat
0a20: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  or..**.** If a m
0a30: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
0a40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
0a50: 68 61 74 20 66 61 63 74 20 69 73 20 72 65 63 6f  hat fact is reco
0a60: 72 64 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e  rded in pParse->
0a70: 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45  db.** and the pE
0a80: 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  xpr parameter is
0a90: 20 72 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e   returned unchan
0aa0: 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ged..*/.Expr *sq
0ab0: 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
0ac0: 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73  ateToken(.  Pars
0ad0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
0ae0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
0af0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
0b00: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
0b10: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
0b20: 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73   "COLLATE" claus
0b30: 65 20 74 6f 20 74 68 69 73 20 65 78 70 72 65 73  e to this expres
0b40: 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  sion */.  const 
0b50: 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65  Token *pCollName
0b60: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f  ,  /* Name of co
0b70: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0b80: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
0b90: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e              /
0ba0: 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74  * True to dequot
0bb0: 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29  e pCollName */.)
0bc0: 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d  {.  if( pCollNam
0bd0: 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78  e->n>0 ){.    Ex
0be0: 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
0bf0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72  e3ExprAlloc(pPar
0c00: 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41  se->db, TK_COLLA
0c10: 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64  TE, pCollName, d
0c20: 65 71 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28  equote);.    if(
0c30: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70   pNew ){.      p
0c40: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78  New->pLeft = pEx
0c50: 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pr;.      pNew->
0c60: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c  flags |= EP_Coll
0c70: 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20  ate|EP_Skip;.   
0c80: 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b     pExpr = pNew;
0c90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0ca0: 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70  urn pExpr;.}.Exp
0cb0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64  r *sqlite3ExprAd
0cc0: 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50  dCollateString(P
0cd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
0ce0: 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74  pr *pExpr, const
0cf0: 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f   char *zC){.  To
0d00: 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28  ken s;.  assert(
0d10: 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69   zC!=0 );.  sqli
0d20: 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c  te3TokenInit(&s,
0d30: 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72   (char*)zC);.  r
0d40: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0d50: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
0d60: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
0d70: 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &s, 0);.}../*.**
0d80: 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54   Skip over any T
0d90: 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  K_COLLATE operat
0da0: 6f 72 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69  ors and any unli
0db0: 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b  kely().** or lik
0dc0: 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69  elihood() functi
0dd0: 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f  on at the root o
0de0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  f an expression.
0df0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
0e00: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
0e10: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
0e20: 20 77 68 69 6c 65 28 20 70 45 78 70 72 20 26 26   while( pExpr &&
0e30: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
0e40: 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 7c  (pExpr, EP_Skip|
0e50: 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a  EP_Unlikely) ){.
0e60: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
0e70: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
0e80: 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20  P_Unlikely) ){. 
0e90: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
0ea0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0eb0: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
0ec0: 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  t) );.      asse
0ed0: 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  rt( pExpr->x.pLi
0ee0: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
0ef0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
0f00: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pr->op==TK_FUNCT
0f10: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ION );.      pEx
0f20: 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  pr = pExpr->x.pL
0f30: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
0f40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
0f50: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0f60: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
0f70: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  );.      pExpr =
0f80: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
0f90: 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65     }.  }   .  re
0fa0: 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f  turn pExpr;.}../
0fb0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0fc0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
0fd0: 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ce for the expre
0fe0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a  ssion pExpr. If.
0ff0: 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  ** there is no d
1000: 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  efined collating
1010: 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72   sequence, retur
1020: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  n NULL..**.** Se
1030: 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 45  e also: sqlite3E
1040: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29 0a 2a  xprNNCollSeq().*
1050: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
1060: 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29 20  ExprNNCollSeq() 
1070: 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 65  works the same e
1080: 78 61 63 74 20 74 68 61 74 20 69 74 20 72 65 74  xact that it ret
1090: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65 66 61  urns the.** defa
10a0: 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 66  ult collation if
10b0: 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20 64 65   pExpr has no de
10c0: 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 2e  fined collation.
10d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
10e0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 69  ting sequence mi
10f0: 67 68 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65  ght be determine
1100: 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f  d by a COLLATE o
1110: 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20 62 79  perator.** or by
1120: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
1130: 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61   a column with a
1140: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
1150: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20  ng sequence..** 
1160: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
1170: 73 20 74 61 6b 65 20 66 69 72 73 74 20 70 72 65  s take first pre
1180: 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74 20 6f  cedence.  Left o
1190: 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a 2a 20  perands take.** 
11a0: 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20  precedence over 
11b0: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73 2e 0a  right operands..
11c0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
11d0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50  te3ExprCollSeq(P
11e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
11f0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71  pr *pExpr){.  sq
1200: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1210: 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c 53 65  se->db;.  CollSe
1220: 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
1230: 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70 72 3b  Expr *p = pExpr;
1240: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
1250: 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e 6f     int op = p->o
1260: 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  p;.    if( p->fl
1270: 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72 69 63  ags & EP_Generic
1280: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
1290: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
12a0: 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b  R ) op = p->op2;
12b0: 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b  .    if( (op==TK
12c0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f  _AGG_COLUMN || o
12d0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
12e0: 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a  op==TK_TRIGGER).
12f0: 20 20 20 20 20 26 26 20 70 2d 3e 79 2e 70 54 61       && p->y.pTa
1300: 62 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  b!=0.    ){.    
1310: 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49    /* op==TK_REGI
1320: 53 54 45 52 20 26 26 20 70 2d 3e 79 2e 70 54 61  STER && p->y.pTa
1330: 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65  b!=0 happens whe
1340: 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67  n pExpr was orig
1350: 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  inally.      ** 
1360: 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20  a TK_COLUMN but 
1370: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65  was previously e
1380: 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63  valuated and cac
1390: 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65  hed in a registe
13a0: 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  r */.      int j
13b0: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
13c0: 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b       if( j>=0 ){
13d0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
13e0: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e  har *zColl = p->
13f0: 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  y.pTab->aCol[j].
1400: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
1410: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
1420: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
1430: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
1440: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1450: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1460: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54   if( op==TK_CAST
1470: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   || op==TK_UPLUS
1480: 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d   ){.      p = p-
1490: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63 6f  >pLeft;.      co
14a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
14b0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c    if( op==TK_COL
14c0: 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 70 43  LATE ){.      pC
14d0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
14e0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
14f0: 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75  ENC(db), 0, p->u
1500: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1510: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1520: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
1530: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
1540: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
1550: 20 26 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66   && (p->pLeft->f
1560: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1570: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
1580: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
1590: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15a0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 78 74 20      Expr *pNext 
15b0: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
15c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70        /* The Exp
15d0: 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76  r.x union is nev
15e0: 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20 73  er used at the s
15f0: 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70 72  ame time as Expr
1600: 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  .pRight */.     
1610: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e     assert( p->x.
1620: 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pList==0 || p->p
1630: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
1640: 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20      /* p->flags 
1650: 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65  holds EP_Collate
1660: 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66   and p->pLeft->f
1670: 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20  lags does not.  
1680: 41 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  And.        ** p
1690: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e  ->x.pSelect cann
16a0: 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e  ot.  So if p->x.
16b0: 70 4c 65 66 74 20 65 78 69 73 74 73 2c 20 69 74  pLeft exists, it
16c0: 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 0a 20 20   must hold at.  
16d0: 20 20 20 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f        ** least o
16e0: 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54  ne EP_Collate. T
16f0: 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hus the followin
1700: 67 20 74 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f  g two ALWAYS. */
1710: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1720: 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 41 4c  x.pList!=0 && AL
1730: 57 41 59 53 28 21 45 78 70 72 48 61 73 50 72 6f  WAYS(!ExprHasPro
1740: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
1750: 65 6c 65 63 74 29 29 20 29 7b 0a 20 20 20 20 20  elect)) ){.     
1760: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1770: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 41        for(i=0; A
1780: 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69  LWAYS(i<p->x.pLi
1790: 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29  st->nExpr); i++)
17a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
17b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
17c0: 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  y(p->x.pList->a[
17d0: 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c  i].pExpr, EP_Col
17e0: 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  late) ){.       
17f0: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
1800: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1810: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
1820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1830: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1840: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1850: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
1860: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1870: 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61  else{.      brea
1880: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
1890: 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43  f( sqlite3CheckC
18a0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
18b0: 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43  Coll) ){ .    pC
18c0: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  oll = 0;.  }.  r
18d0: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
18e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1900: 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  nce for the expr
1910: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66  ession pExpr. If
1920: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20  .** there is no 
1930: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
1940: 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75  g sequence, retu
1950: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1960: 74 68 65 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63  the.** defautl c
1970: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1980: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
1990: 6f 3a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  o: sqlite3ExprCo
19a0: 6c 6c 53 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68  llSeq().**.** Th
19b0: 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  e sqlite3ExprCol
19c0: 6c 53 65 71 28 29 20 72 6f 75 74 69 6e 65 20 77  lSeq() routine w
19d0: 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 65 78  orks the same ex
19e0: 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
19f0: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
1a00: 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66 69  there is no defi
1a10: 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a  ned collation..*
1a20: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
1a30: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
1a40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1a50: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43  xpr *pExpr){.  C
1a60: 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 73 71 6c 69  ollSeq *p = sqli
1a70: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1a80: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
1a90: 20 69 66 28 20 70 3d 3d 30 20 29 20 70 20 3d 20   if( p==0 ) p = 
1aa0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
1ab0: 74 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  tColl;.  assert(
1ac0: 20 70 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p!=0 );.  retur
1ad0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
1ae0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1af0: 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
1b00: 20 68 61 76 65 20 65 71 75 69 76 61 6c 65 6e 74   have equivalent
1b10: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1b20: 6e 63 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nces..*/.int sql
1b30: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d  ite3ExprCollSeqM
1b40: 61 74 63 68 28 50 61 72 73 65 20 2a 70 50 61 72  atch(Parse *pPar
1b50: 73 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45  se, Expr *pE1, E
1b60: 78 70 72 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c  xpr *pE2){.  Col
1b70: 6c 53 65 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73  lSeq *pColl1 = s
1b80: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
1b90: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 31 29  Seq(pParse, pE1)
1ba0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
1bb0: 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ll2 = sqlite3Exp
1bc0: 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  rNNCollSeq(pPars
1bd0: 65 2c 20 70 45 32 29 3b 0a 20 20 72 65 74 75 72  e, pE2);.  retur
1be0: 6e 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  n sqlite3StrICmp
1bf0: 28 70 43 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20  (pColl1->zName, 
1c00: 70 43 6f 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d  pColl2->zName)==
1c10: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  0;.}../*.** pExp
1c20: 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20  r is an operand 
1c30: 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  of a comparison 
1c40: 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20  operator.  aff2 
1c50: 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61  is the.** type a
1c60: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f  ffinity of the o
1c70: 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54  ther operand.  T
1c80: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1c90: 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20  rns the.** type 
1ca0: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
1cb0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
1cc0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1cd0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61  operator..*/.cha
1ce0: 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  r sqlite3Compare
1cf0: 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70  Affinity(Expr *p
1d00: 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32 29  Expr, char aff2)
1d10: 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d 20  {.  char aff1 = 
1d20: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
1d30: 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ity(pExpr);.  if
1d40: 28 20 61 66 66 31 20 26 26 20 61 66 66 32 20 29  ( aff1 && aff2 )
1d50: 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69  {.    /* Both si
1d60: 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  des of the compa
1d70: 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e  rison are column
1d80: 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75  s. If one has nu
1d90: 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66  meric.    ** aff
1da0: 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e  inity, use that.
1db0: 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 6e   Otherwise use n
1dc0: 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  o affinity..    
1dd0: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
1de0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1df0: 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c  ity(aff1) || sql
1e00: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1e10: 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20  inity(aff2) ){. 
1e20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e30: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
1e40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
1e60: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20  FF_BLOB;.    }. 
1e70: 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66 31   }else if( !aff1
1e80: 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20   && !aff2 ){.   
1e90: 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65   /* Neither side
1ea0: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1eb0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
1ec0: 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20   Compare the.   
1ed0: 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65   ** results dire
1ee0: 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctly..    */.   
1ef0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
1f00: 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65  FF_BLOB;.  }else
1f10: 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64  {.    /* One sid
1f20: 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  e is a column, t
1f30: 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e  he other is not.
1f40: 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73   Use the columns
1f50: 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
1f60: 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d    assert( aff1==
1f70: 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a  0 || aff2==0 );.
1f80: 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31      return (aff1
1f90: 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a   + aff2);.  }.}.
1fa0: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
1fb0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1fc0: 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74  rator.  Return t
1fd0: 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  he type affinity
1fe0: 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
1ff0: 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f  be applied to bo
2000: 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f  th operands prio
2010: 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63  r to doing the c
2020: 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74  omparison..*/.st
2030: 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72  atic char compar
2040: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70  isonAffinity(Exp
2050: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61  r *pExpr){.  cha
2060: 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28  r aff;.  assert(
2070: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
2080: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
2090: 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IN || pExpr->
20a0: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20  op==TK_LT ||.   
20b0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
20c0: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72  ==TK_GT || pExpr
20d0: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70  ->op==TK_GE || p
20e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
20f0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
2100: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c  pr->op==TK_NE ||
2110: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2120: 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  S || pExpr->op==
2130: 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73  TK_ISNOT );.  as
2140: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
2150: 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71  ft );.  aff = sq
2160: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
2170: 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  y(pExpr->pLeft);
2180: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52  .  if( pExpr->pR
2190: 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20  ight ){.    aff 
21a0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
21b0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
21c0: 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20  pRight, aff);.  
21d0: 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61  }else if( ExprHa
21e0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
21f0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2200: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
2210: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
2220: 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  ty(pExpr->x.pSel
2230: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ect->pEList->a[0
2240: 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20  ].pExpr, aff);. 
2250: 20 7d 65 6c 73 65 20 69 66 28 20 61 66 66 3d 3d   }else if( aff==
2260: 30 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53  0 ){.    aff = S
2270: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
2280: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66    }.  return aff
2290: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
22a0: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
22b0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e   expression, eg.
22c0: 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e   '=', '<', IN(..
22d0: 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61  .) etc..** idx_a
22e0: 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61  ffinity is the a
22f0: 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e  ffinity of an in
2300: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65  dexed column. Re
2310: 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20  turn true.** if 
2320: 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61  the index with a
2330: 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69  ffinity idx_affi
2340: 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64  nity may be used
2350: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
2360: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
2370: 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74  in pExpr..*/.int
2380: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
2390: 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45  inityOk(Expr *pE
23a0: 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66  xpr, char idx_af
23b0: 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20  finity){.  char 
23c0: 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  aff = comparison
23d0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
23e0: 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29  .  switch( aff )
23f0: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
2400: 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20  E_AFF_BLOB:.    
2410: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2420: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
2430: 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75  TEXT:.      retu
2440: 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d  rn idx_affinity=
2450: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
2460: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
2470: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
2480: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
2490: 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74  nity(idx_affinit
24a0: 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  y);.  }.}../*.**
24b0: 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76   Return the P5 v
24c0: 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64  alue that should
24d0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62   be used for a b
24e0: 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e  inary comparison
24f0: 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45  .** opcode (OP_E
2500: 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75  q, OP_Ge etc.) u
2510: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70  sed to compare p
2520: 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32  Expr1 and pExpr2
2530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62  ..*/.static u8 b
2540: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45  inaryCompareP5(E
2550: 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70  xpr *pExpr1, Exp
2560: 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a  r *pExpr2, int j
2570: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38  umpIfNull){.  u8
2580: 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c   aff = (char)sql
2590: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
25a0: 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20  (pExpr2);.  aff 
25b0: 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d  = (u8)sqlite3Com
25c0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
25d0: 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29  pr1, aff) | (u8)
25e0: 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65  jumpIfNull;.  re
25f0: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
2600: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
2610: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61  ter to the colla
2620: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68  tion sequence th
2630: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
2640: 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79  d by.** a binary
2650: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
2660: 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70  ator comparing p
2670: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
2680: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65  .**.** If the le
2690: 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ft hand expressi
26a0: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
26b0: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65  ng sequence type
26c0: 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
26d0: 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  used. Otherwise 
26e0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
26f0: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
2700: 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73  ight hand expres
2710: 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c  sion.** is used,
2720: 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20   or the default 
2730: 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74  (BINARY) if neit
2740: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68  her expression h
2750: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  as a collating.*
2760: 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72  * type..**.** Ar
2770: 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62  gument pRight (b
2780: 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61  ut not pLeft) ma
2790: 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  y be a null poin
27a0: 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ter. In this cas
27b0: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  e,.** it is not 
27c0: 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43  considered..*/.C
27d0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42  ollSeq *sqlite3B
27e0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
27f0: 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Seq(.  Parse *pP
2800: 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70  arse, .  Expr *p
2810: 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70  Left, .  Expr *p
2820: 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53  Right.){.  CollS
2830: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73  eq *pColl;.  ass
2840: 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
2850: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
2860: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
2870: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2880: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2890: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
28a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
28b0: 68 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66  ht && (pRight->f
28c0: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
28d0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  e)!=0 ){.    pCo
28e0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
28f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2900: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
2910: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
2920: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2930: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
2940: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
2950: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  ){.      pColl =
2960: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2970: 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67  Seq(pParse, pRig
2980: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ht);.    }.  }. 
2990: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
29a0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
29b0: 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
29c0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
29d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
29e0: 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61  odeCompare(.  Pa
29f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2a00: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28  /* The parsing (
2a10: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
2a20: 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ing) context */.
2a30: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
2a40: 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
2a50: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
2a60: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f  r *pRight,     /
2a70: 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72  * The right oper
2a80: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63  and */.  int opc
2a90: 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ode,       /* Th
2aa0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63  e comparison opc
2ab0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31  ode */.  int in1
2ac0: 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65  , int in2, /* Re
2ad0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f  gister holding o
2ae0: 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74  perands */.  int
2af0: 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
2b00: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
2b10: 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a  rue.  */.  int j
2b20: 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
2b30: 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66  If true, jump if
2b40: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
2b50: 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  is NULL */.){.  
2b60: 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64  int p5;.  int ad
2b70: 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dr;.  CollSeq *p
2b80: 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74  4;..  p4 = sqlit
2b90: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
2ba0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2bb0: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
2bc0: 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70   p5 = binaryComp
2bd0: 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69  areP5(pLeft, pRi
2be0: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
2bf0: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
2c00: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61  e3VdbeAddOp4(pPa
2c10: 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f  rse->pVdbe, opco
2c20: 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69  de, in2, dest, i
2c30: 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n1,.            
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2c50: 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c  void*)p4, P4_COL
2c60: 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33  LSEQ);.  sqlite3
2c70: 56 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61  VdbeChangeP5(pPa
2c80: 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29  rse->pVdbe, (u8)
2c90: 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  p5);.  return ad
2ca0: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dr;.}../*.** Ret
2cb0: 75 72 6e 20 74 72 75 65 20 69 66 20 65 78 70 72  urn true if expr
2cc0: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
2cd0: 61 20 76 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c  a vector, or fal
2ce0: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  se otherwise..**
2cf0: 0a 2a 2a 20 41 20 76 65 63 74 6f 72 20 69 73 20  .** A vector is 
2d00: 64 65 66 69 6e 65 64 20 61 73 20 61 6e 79 20 65  defined as any e
2d10: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 72  xpression that r
2d20: 65 73 75 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72  esults in two or
2d30: 20 6d 6f 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73   more.** columns
2d40: 20 6f 66 20 72 65 73 75 6c 74 2e 20 20 45 76 65   of result.  Eve
2d50: 72 79 20 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64  ry TK_VECTOR nod
2d60: 65 20 69 73 20 61 6e 20 76 65 63 74 6f 72 20 62  e is an vector b
2d70: 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61  ecause the.** pa
2d80: 72 73 65 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65  rser will not ge
2d90: 6e 65 72 61 74 65 20 61 20 54 4b 5f 56 45 43 54  nerate a TK_VECT
2da0: 4f 52 20 77 69 74 68 20 66 65 77 65 72 20 74 68  OR with fewer th
2db0: 61 6e 20 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a  an two entries..
2dc0: 2a 2a 20 42 75 74 20 61 20 54 4b 5f 53 45 4c 45  ** But a TK_SELE
2dd0: 43 54 20 6d 69 67 68 74 20 62 65 20 65 69 74 68  CT might be eith
2de0: 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61  er a vector or a
2df0: 20 73 63 61 6c 61 72 2e 20 49 74 20 69 73 20 6f   scalar. It is o
2e00: 6e 6c 79 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  nly.** considere
2e10: 64 20 61 20 76 65 63 74 6f 72 20 69 66 20 69 74  d a vector if it
2e20: 20 68 61 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65   has two or more
2e30: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e   result columns.
2e40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2e50: 78 70 72 49 73 56 65 63 74 6f 72 28 45 78 70 72  xprIsVector(Expr
2e60: 20 2a 70 45 78 70 72 29 7b 0a 20 20 72 65 74 75   *pExpr){.  retu
2e70: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 56 65  rn sqlite3ExprVe
2e80: 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3e  ctorSize(pExpr)>
2e90: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  1;.}../*.** If t
2ea0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  he expression pa
2eb0: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
2ec0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20   argument is of 
2ed0: 74 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a  type TK_VECTOR .
2ee0: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ** return the nu
2ef0: 6d 62 65 72 20 6f 66 20 65 78 70 72 65 73 73 69  mber of expressi
2f00: 6f 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f  ons in the vecto
2f10: 72 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 65 78  r. Or, if the ex
2f20: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61  pression.** is a
2f30: 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 72 65 74   sub-select, ret
2f40: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2f50: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
2f60: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72   sub-select. For
2f70: 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 74 79  .** any other ty
2f80: 70 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  pe of expression
2f90: 2c 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69  , return 1..*/.i
2fa0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 56 65  nt sqlite3ExprVe
2fb0: 63 74 6f 72 53 69 7a 65 28 45 78 70 72 20 2a 70  ctorSize(Expr *p
2fc0: 45 78 70 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d  Expr){.  u8 op =
2fd0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
2fe0: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
2ff0: 52 20 29 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  R ) op = pExpr->
3000: 6f 70 32 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  op2;.  if( op==T
3010: 4b 5f 56 45 43 54 4f 52 20 29 7b 0a 20 20 20 20  K_VECTOR ){.    
3020: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e  return pExpr->x.
3030: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
3040: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
3050: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72  _SELECT ){.    r
3060: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70  eturn pExpr->x.p
3070: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
3080: 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nExpr;.  }else{.
3090: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
30a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
30b0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
30c0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 6f   subexpression o
30d0: 66 20 70 56 65 63 74 6f 72 20 74 68 61 74 20 69  f pVector that i
30e0: 73 20 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f  s the i-th.** co
30f0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
3100: 6f 72 20 28 6e 75 6d 62 65 72 65 64 20 73 74 61  or (numbered sta
3110: 72 74 69 6e 67 20 77 69 74 68 20 30 29 2e 20 20  rting with 0).  
3120: 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a  The caller must.
3130: 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 69  ** ensure that i
3140: 20 69 73 20 77 69 74 68 69 6e 20 72 61 6e 67 65   is within range
3150: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74  ..**.** If pVect
3160: 6f 72 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73  or is really a s
3170: 63 61 6c 61 72 20 28 61 6e 64 20 22 73 63 61 6c  calar (and "scal
3180: 61 72 22 20 68 65 72 65 20 69 6e 63 6c 75 64 65  ar" here include
3190: 73 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20  s subqueries.** 
31a0: 74 68 61 74 20 72 65 74 75 72 6e 20 61 20 73 69  that return a si
31b0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68  ngle column!) th
31c0: 65 6e 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f  en return pVecto
31d0: 72 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a  r unmodified..**
31e0: 0a 2a 2a 20 70 56 65 63 74 6f 72 20 72 65 74 61  .** pVector reta
31f0: 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  ins ownership of
3200: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 75   the returned su
3210: 62 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a  bexpression..**.
3220: 2a 2a 20 49 66 20 74 68 65 20 76 65 63 74 6f 72  ** If the vector
3230: 20 69 73 20 61 20 28 53 45 4c 45 43 54 20 2e 2e   is a (SELECT ..
3240: 2e 29 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  .) then the expr
3250: 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  ession returned 
3260: 69 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20 65  is.** just the e
3270: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68  xpression for th
3280: 65 20 69 2d 74 68 20 74 65 72 6d 20 6f 66 20 74  e i-th term of t
3290: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61  he result set, a
32a0: 6e 64 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65  nd may.** not be
32b0: 20 72 65 61 64 79 20 66 6f 72 20 65 76 61 6c 75   ready for evalu
32c0: 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68  ation because th
32d0: 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 68  e table cursor h
32e0: 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65  as not yet.** be
32f0: 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a  en positioned..*
3300: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 56  /.Expr *sqlite3V
3310: 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
3320: 72 28 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c  r(Expr *pVector,
3330: 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72   int i){.  asser
3340: 74 28 20 69 3c 73 71 6c 69 74 65 33 45 78 70 72  t( i<sqlite3Expr
3350: 56 65 63 74 6f 72 53 69 7a 65 28 70 56 65 63 74  VectorSize(pVect
3360: 6f 72 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  or) );.  if( sql
3370: 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
3380: 28 70 56 65 63 74 6f 72 29 20 29 7b 0a 20 20 20  (pVector) ){.   
3390: 20 61 73 73 65 72 74 28 20 70 56 65 63 74 6f 72   assert( pVector
33a0: 2d 3e 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63  ->op2==0 || pVec
33b0: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  tor->op==TK_REGI
33c0: 53 54 45 52 20 29 3b 0a 20 20 20 20 69 66 28 20  STER );.    if( 
33d0: 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f  pVector->op==TK_
33e0: 53 45 4c 45 43 54 20 7c 7c 20 70 56 65 63 74 6f  SELECT || pVecto
33f0: 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43  r->op2==TK_SELEC
3400: 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T ){.      retur
3410: 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65  n pVector->x.pSe
3420: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
3430: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65  i].pExpr;.    }e
3440: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
3450: 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69  n pVector->x.pLi
3460: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
3470: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3480: 72 6e 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f  rn pVector;.}../
3490: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
34a0: 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20 45 78   return a new Ex
34b0: 70 72 20 6f 62 6a 65 63 74 20 77 68 69 63 68 20  pr object which 
34c0: 77 68 65 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a  when passed to.*
34d0: 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  * sqlite3ExprCod
34e0: 65 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  e() will generat
34f0: 65 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20  e all necessary 
3500: 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a  code to compute.
3510: 2a 2a 20 74 68 65 20 69 46 69 65 6c 64 2d 74 68  ** the iField-th
3520: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76   column of the v
3530: 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
3540: 20 70 56 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20   pVector..**.** 
3550: 49 74 20 69 73 20 6f 6b 20 66 6f 72 20 70 56 65  It is ok for pVe
3560: 63 74 6f 72 20 74 6f 20 62 65 20 61 20 73 63 61  ctor to be a sca
3570: 6c 61 72 20 28 61 73 20 6c 6f 6e 67 20 61 73 20  lar (as long as 
3580: 69 46 69 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a  iField==0).  .**
3590: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
35a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
35b0: 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78  s like sqlite3Ex
35c0: 70 72 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  prDup()..**.** T
35d0: 68 65 20 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74  he caller owns t
35e0: 68 65 20 72 65 74 75 72 6e 65 64 20 45 78 70 72  he returned Expr
35f0: 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 73 20 72   object and is r
3600: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a  esponsible for.*
3610: 2a 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  * ensuring that 
3620: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
3630: 75 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  ue eventually ge
3640: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
3650: 54 68 65 20 63 61 6c 6c 65 72 20 72 65 74 61 69  The caller retai
3660: 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  ns ownership of 
3670: 70 56 65 63 74 6f 72 2e 20 20 49 66 20 70 56 65  pVector.  If pVe
3680: 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c  ctor is a TK_SEL
3690: 45 43 54 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ECT,.** then the
36a0: 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74   returned object
36b0: 20 77 69 6c 6c 20 72 65 66 65 72 65 6e 63 65 20   will reference 
36c0: 70 56 65 63 74 6f 72 20 61 6e 64 20 73 6f 20 70  pVector and so p
36d0: 56 65 63 74 6f 72 20 6d 75 73 74 20 72 65 6d 61  Vector must rema
36e0: 69 6e 0a 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20  in.** valid for 
36f0: 74 68 65 20 6c 69 66 65 20 6f 66 20 74 68 65 20  the life of the 
3700: 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e  returned object.
3710: 20 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20    If pVector is 
3720: 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f  a TK_VECTOR.** o
3730: 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  r a scalar expre
3740: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63  ssion, then it c
3750: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 20 61 73  an be deleted as
3760: 20 73 6f 6f 6e 20 61 73 20 74 68 69 73 20 72 6f   soon as this ro
3770: 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
3780: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20  ..**.** A trick 
3790: 74 6f 20 63 61 75 73 65 20 61 20 54 4b 5f 53 45  to cause a TK_SE
37a0: 4c 45 43 54 20 70 56 65 63 74 6f 72 20 74 6f 20  LECT pVector to 
37b0: 62 65 20 64 65 6c 65 74 65 64 20 74 6f 67 65 74  be deleted toget
37c0: 68 65 72 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  her with.** the 
37d0: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
37e0: 6a 65 63 74 20 69 73 20 74 6f 20 61 74 74 61 63  ject is to attac
37f0: 68 20 74 68 65 20 70 56 65 63 74 6f 72 20 74 6f  h the pVector to
3800: 20 74 68 65 20 70 52 69 67 68 74 20 66 69 65 6c   the pRight fiel
3810: 64 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75  d.** of the retu
3820: 72 6e 65 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43  rned TK_SELECT_C
3830: 4f 4c 55 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63  OLUMN Expr objec
3840: 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  t..*/.Expr *sqli
3850: 74 65 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72  te3ExprForVector
3860: 46 69 65 6c 64 28 0a 20 20 50 61 72 73 65 20 2a  Field(.  Parse *
3870: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
3880: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
3890: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63   */.  Expr *pVec
38a0: 74 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  tor,       /* Th
38b0: 65 20 76 65 63 74 6f 72 2e 20 20 4c 69 73 74 20  e vector.  List 
38c0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  of expressions o
38d0: 72 20 61 20 73 75 62 2d 53 45 4c 45 43 54 20 2a  r a sub-SELECT *
38e0: 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 20 20  /.  int iField  
38f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
3900: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
3910: 76 65 63 74 6f 72 20 74 6f 20 72 65 74 75 72 6e  vector to return
3920: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
3930: 52 65 74 3b 0a 20 20 69 66 28 20 70 56 65 63 74  Ret;.  if( pVect
3940: 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  or->op==TK_SELEC
3950: 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  T ){.    assert(
3960: 20 70 56 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20   pVector->flags 
3970: 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
3980: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f  ;.    /* The TK_
3990: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78  SELECT_COLUMN Ex
39a0: 70 72 20 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a  pr node:.    **.
39b0: 20 20 20 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20      ** pLeft:   
39c0: 20 20 20 20 20 20 20 20 70 56 65 63 74 6f 72 20          pVector 
39d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45  containing TK_SE
39e0: 4c 45 43 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74  LECT.  Not delet
39f0: 65 64 2e 0a 20 20 20 20 2a 2a 20 70 52 69 67 68  ed..    ** pRigh
3a00: 74 3a 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20  t:          not 
3a10: 75 73 65 64 2e 20 20 42 75 74 20 72 65 63 75 72  used.  But recur
3a20: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a  sively deleted..
3a30: 20 20 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20      ** iColumn: 
3a40: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 6f 66          Index of
3a50: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65   a column in pVe
3a60: 63 74 6f 72 0a 20 20 20 20 2a 2a 20 69 54 61 62  ctor.    ** iTab
3a70: 6c 65 3a 20 20 20 20 20 20 20 20 20 20 30 20 6f  le:          0 o
3a80: 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
3a90: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c  columns on the L
3aa0: 48 53 20 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d  HS of an assignm
3ab0: 65 6e 74 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74  ent.    ** pLeft
3ac0: 2d 3e 69 54 61 62 6c 65 3a 20 20 20 46 69 72 73  ->iTable:   Firs
3ad0: 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  t in an array of
3ae0: 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
3af0: 67 20 72 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20  g result, or 0. 
3b00: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
3b10: 20 20 20 20 20 20 20 69 66 20 74 68 65 20 72 65         if the re
3b20: 73 75 6c 74 20 69 73 20 6e 6f 74 20 79 65 74 20  sult is not yet 
3b30: 63 6f 6d 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a  computed..    **
3b40: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45  .    ** sqlite3E
3b50: 78 70 72 44 65 6c 65 74 65 28 29 20 73 70 65 63  xprDelete() spec
3b60: 69 66 69 63 61 6c 6c 79 20 73 6b 69 70 73 20 74  ifically skips t
3b70: 68 65 20 72 65 63 75 72 73 69 76 65 20 64 65 6c  he recursive del
3b80: 65 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c  ete of.    ** pL
3b90: 65 66 74 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54  eft on TK_SELECT
3ba0: 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20  _COLUMN nodes.  
3bb0: 42 75 74 20 70 52 69 67 68 74 20 69 73 20 66 6f  But pRight is fo
3bc0: 6c 6c 6f 77 65 64 2c 20 73 6f 20 70 56 65 63 74  llowed, so pVect
3bd0: 6f 72 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  or.    ** can be
3be0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 70 52 69   attached to pRi
3bf0: 67 68 74 20 74 6f 20 63 61 75 73 65 20 74 68 69  ght to cause thi
3c00: 73 20 6e 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f  s node to take o
3c10: 77 6e 65 72 73 68 69 70 20 6f 66 0a 20 20 20 20  wnership of.    
3c20: 2a 2a 20 70 56 65 63 74 6f 72 2e 20 20 54 79 70  ** pVector.  Typ
3c30: 69 63 61 6c 6c 79 20 74 68 65 72 65 20 77 69 6c  ically there wil
3c40: 6c 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b  l be multiple TK
3c50: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e  _SELECT_COLUMN n
3c60: 6f 64 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68  odes.    ** with
3c70: 20 74 68 65 20 73 61 6d 65 20 70 4c 65 66 74 20   the same pLeft 
3c80: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
3c90: 56 65 63 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79  Vector, but only
3ca0: 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 20 20 20   one of them.   
3cb0: 20 2a 2a 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65   ** will own the
3cc0: 20 70 56 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f   pVector..    */
3cd0: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
3ce0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
3cf0: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
3d00: 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  N, 0, 0);.    if
3d10: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
3d20: 70 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pRet->iColumn = 
3d30: 69 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52  iField;.      pR
3d40: 65 74 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63  et->pLeft = pVec
3d50: 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
3d60: 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c  ssert( pRet==0 |
3d70: 7c 20 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d  | pRet->iTable==
3d80: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
3d90: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3da0: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70  p==TK_VECTOR ) p
3db0: 56 65 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72  Vector = pVector
3dc0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
3dd0: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
3de0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
3df0: 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
3e00: 2c 20 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20  , pVector, 0);. 
3e10: 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
3e20: 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73  TokenRemap(pPars
3e30: 65 2c 20 70 52 65 74 2c 20 70 56 65 63 74 6f 72  e, pRet, pVector
3e40: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
3e50: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pRet;.}../*.** I
3e60: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
3e70: 70 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b  pr is of type TK
3e80: 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74  _SELECT, generat
3e90: 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
3ea0: 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74 75 72 6e  te.** it. Return
3eb0: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
3ec0: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
3ed0: 74 20 69 73 20 73 74 6f 72 65 64 20 28 6f 72 2c  t is stored (or,
3ee0: 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d   if the .** sub-
3ef0: 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 6d  select returns m
3f00: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c  ore than one col
3f10: 75 6d 6e 2c 20 74 68 65 20 66 69 72 73 74 20 69  umn, the first i
3f20: 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20 6f 66  n an array.** of
3f30: 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 77 68   registers in wh
3f40: 69 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 69  ich the result i
3f50: 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a 2a 2a  s stored)..**.**
3f60: 20 49 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74   If pExpr is not
3f70: 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70   a TK_SELECT exp
3f80: 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20  ression, return 
3f90: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
3fa0: 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65   exprCodeSubsele
3fb0: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
3fc0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
3fd0: 20 20 69 6e 74 20 72 65 67 20 3d 20 30 3b 0a 23    int reg = 0;.#
3fe0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3ff0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
4000: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
4010: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65  SELECT ){.    re
4020: 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  g = sqlite3CodeS
4030: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
4040: 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 23 65 6e   pExpr);.  }.#en
4050: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67  dif.  return reg
4060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
4070: 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e  ent pVector poin
4080: 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65  ts to a vector e
4090: 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68  xpression - eith
40a0: 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a  er a TK_VECTOR.*
40b0: 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74  * or TK_SELECT t
40c0: 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65  hat returns more
40d0: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
40e0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
40f0: 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72  returns.** the r
4100: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f  egister number o
4110: 66 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  f a register tha
4120: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
4130: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65  alue of.** eleme
4140: 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65  nt iField of the
4150: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   vector..**.** I
4160: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
4170: 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73  K_SELECT express
4180: 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66  ion, then code f
4190: 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20  or it must have 
41a0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
41b0: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
41c0: 20 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62   the exprCodeSub
41d0: 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65  select() routine
41e0: 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
41f0: 65 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53  e parameter regS
4200: 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20  elect should be 
4210: 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
4220: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
4230: 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  rs.** containing
4240: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
4250: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  the sub-select. 
4260: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f  .**.** If pVecto
4270: 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f  r is of type TK_
4280: 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64  VECTOR, then cod
4290: 65 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73  e for the reques
42a0: 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20  ted field.** is 
42b0: 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68  generated. In th
42c0: 69 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72  is case (*pRegFr
42d0: 65 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74  ee) may be set t
42e0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
42f0: 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  ** a temporary r
4300: 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72  egister to be fr
4310: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
4320: 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
4330: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ng..**.** Before
4340: 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70   returning, outp
4350: 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  ut parameter (*p
4360: 70 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f  pExpr) is set to
4370: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
4380: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72   Expr object cor
4390: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c  responding to el
43a0: 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74  ement iElem of t
43b0: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74  he vector..*/.st
43c0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63  atic int exprVec
43d0: 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50  torRegister(.  P
43e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4400: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
4410: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74  */.  Expr *pVect
4420: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
4430: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74       /* Vector t
4440: 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e  o extract elemen
4450: 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
4460: 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20  iField,         
4470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4480: 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20  ield to extract 
4490: 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a  from pVector */.
44a0: 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c    int regSelect,
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44c0: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
44d0: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
44e0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
44f0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
4500: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78        /* OUT: Ex
4510: 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74  pression element
4520: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46   */.  int *pRegF
4530: 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
4540: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65        /* OUT: Te
4550: 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
4560: 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f  ree */.){.  u8 o
4570: 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b  p = pVector->op;
4580: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
4590: 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d  K_VECTOR || op==
45a0: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
45b0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
45c0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
45d0: 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70  ISTER ){.    *pp
45e0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65  Expr = sqlite3Ve
45f0: 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
4600: 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64  (pVector, iField
4610: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56  );.    return pV
4620: 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46  ector->iTable+iF
4630: 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ield;.  }.  if( 
4640: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
4650: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70  .    *ppExpr = p
4660: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
4670: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69  t->pEList->a[iFi
4680: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
4690: 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63   return regSelec
46a0: 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20  t+iField;.  }.  
46b0: 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f  *ppExpr = pVecto
46c0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46  r->x.pList->a[iF
46d0: 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72  ield].pExpr;.  r
46e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
46f0: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
4700: 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46  , *ppExpr, pRegF
4710: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ree);.}../*.** E
4720: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
4730: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
4740: 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74  between two vect
4750: 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75  or values. Compu
4760: 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  te.** the result
4770: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
4780: 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c  on (1, 0, or NUL
4790: 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  L) and write tha
47a0: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f  t.** result into
47b0: 20 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a   register dest..
47c0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
47d0: 20 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68   must satisfy th
47e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63  e following prec
47f0: 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  onditions:.**.**
4800: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
4810: 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70  ==TK_IS:      op
4820: 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d  ==TK_EQ and p5==
4830: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
4840: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
4850: 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70  ==TK_ISNOT:   op
4860: 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d  ==TK_NE and p5==
4870: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
4880: 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20      otherwise:  
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
48a0: 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  ==pExpr->op and 
48b0: 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20  p5==0.*/.static 
48c0: 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43  void codeVectorC
48d0: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
48e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
48f0: 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f  /* Code generato
4900: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
4910: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
4920: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
4930: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
4940: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
4950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
4960: 72 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74  rite results int
4970: 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
4980: 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20  */.  u8 op,     
4990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
49a0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
49b0: 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  r */.  u8 p5    
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49d0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72  SQLITE_NULLEQ or
49e0: 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64   zero */.){.  Vd
49f0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
4a00: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
4a10: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
4a20: 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69  eft;.  Expr *pRi
4a30: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
4a40: 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74  ght;.  int nLeft
4a50: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
4a60: 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
4a70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4a80: 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69  regLeft = 0;.  i
4a90: 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b  nt regRight = 0;
4aa0: 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a  .  u8 opx = op;.
4ab0: 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d    int addrDone =
4ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4ad0: 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  Label(pParse);..
4ae0: 20 20 69 66 28 20 6e 4c 65 66 74 21 3d 73 71 6c    if( nLeft!=sql
4af0: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
4b00: 7a 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  ze(pRight) ){.  
4b10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4b20: 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
4b30: 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
4b40: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
4b50: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
4b60: 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45  >op==TK_EQ || pE
4b70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 0a  xpr->op==TK_NE .
4b80: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
4b90: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45  >op==TK_IS || pE
4ba0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4bb0: 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78  T .       || pEx
4bc0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pr->op==TK_LT ||
4bd0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
4be0: 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78  T .       || pEx
4bf0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
4c00: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
4c10: 45 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  E .  );.  assert
4c20: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20  ( pExpr->op==op 
4c30: 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  || (pExpr->op==T
4c40: 4b 5f 49 53 20 26 26 20 6f 70 3d 3d 54 4b 5f 45  K_IS && op==TK_E
4c50: 51 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  Q).            |
4c60: 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  | (pExpr->op==TK
4c70: 5f 49 53 4e 4f 54 20 26 26 20 6f 70 3d 3d 54 4b  _ISNOT && op==TK
4c80: 5f 4e 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  _NE) );.  assert
4c90: 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78 70 72  ( p5==0 || pExpr
4ca0: 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20 61 73  ->op!=op );.  as
4cb0: 73 65 72 74 28 20 70 35 3d 3d 53 51 4c 49 54 45  sert( p5==SQLITE
4cc0: 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78 70 72  _NULLEQ || pExpr
4cd0: 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20 20 70  ->op==op );..  p
4ce0: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 53 54 4f 52  5 |= SQLITE_STOR
4cf0: 45 50 32 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d  EP2;.  if( opx==
4d00: 54 4b 5f 4c 45 20 29 20 6f 70 78 20 3d 20 54 4b  TK_LE ) opx = TK
4d10: 5f 4c 54 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d  _LT;.  if( opx==
4d20: 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20 54 4b  TK_GE ) opx = TK
4d30: 5f 47 54 3b 0a 0a 20 20 72 65 67 4c 65 66 74 20  _GT;..  regLeft 
4d40: 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c  = exprCodeSubsel
4d50: 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ect(pParse, pLef
4d60: 74 29 3b 0a 20 20 72 65 67 52 69 67 68 74 20 3d  t);.  regRight =
4d70: 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65   exprCodeSubsele
4d80: 63 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  ct(pParse, pRigh
4d90: 74 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t);..  for(i=0; 
4da0: 31 20 2f 2a 4c 6f 6f 70 20 65 78 69 74 73 20 62  1 /*Loop exits b
4db0: 79 20 22 62 72 65 61 6b 22 2a 2f 3b 20 69 2b 2b  y "break"*/; i++
4dc0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 46 72  ){.    int regFr
4dd0: 65 65 31 20 3d 20 30 2c 20 72 65 67 46 72 65 65  ee1 = 0, regFree
4de0: 32 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 72 20  2 = 0;.    Expr 
4df0: 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20 20 69  *pL, *pR; .    i
4e00: 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 61  nt r1, r2;.    a
4e10: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
4e20: 3c 6e 4c 65 66 74 20 29 3b 0a 20 20 20 20 72 31  <nLeft );.    r1
4e30: 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67   = exprVectorReg
4e40: 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c  ister(pParse, pL
4e50: 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c  eft, i, regLeft,
4e60: 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29   &pL, &regFree1)
4e70: 3b 0a 20 20 20 20 72 32 20 3d 20 65 78 70 72 56  ;.    r2 = exprV
4e80: 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50  ectorRegister(pP
4e90: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69 2c  arse, pRight, i,
4ea0: 20 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c 20   regRight, &pR, 
4eb0: 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
4ec0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
4ed0: 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f 70 78 2c  se, pL, pR, opx,
4ee0: 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 70   r1, r2, dest, p
4ef0: 35 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  5);.    testcase
4f00: 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
4f10: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4f20: 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 74 65  ==OP_Lt);.    te
4f30: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
4f40: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4f50: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
4f60: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4f70: 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
4f80: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f90: 5f 47 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Gt);.    testca
4fa0: 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
4fb0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4fc0: 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
4fd0: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4fe0: 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
4ff0: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
5000: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
5010: 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43  p==OP_Ne); VdbeC
5020: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
5030: 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71 6c 69  OP_Ne);.    sqli
5040: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5050: 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
5060: 65 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e1);.    sqlite3
5070: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5080: 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
5090: 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65  ;.    if( i==nLe
50a0: 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62 72  ft-1 ){.      br
50b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
50c0: 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29 7b  f( opx==TK_EQ ){
50d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
50e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
50f0: 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64 72  fNot, dest, addr
5100: 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Done); VdbeCover
5110: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35  age(v);.      p5
5120: 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e   |= SQLITE_KEEPN
5130: 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ULL;.    }else i
5140: 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b  f( opx==TK_NE ){
5150: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5160: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5170: 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e  f, dest, addrDon
5180: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
5190: 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d  (v);.      p5 |=
51a0: 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c   SQLITE_KEEPNULL
51b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
51c0: 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54     assert( op==T
51d0: 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LT || op==TK_G
51e0: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  T || op==TK_LE |
51f0: 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  | op==TK_GE );. 
5200: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5210: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c 73  AddOp2(v, OP_Els
5220: 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72 44  eNotEq, 0, addrD
5230: 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  one);.      Vdbe
5240: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
5250: 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20  ==TK_LT);.      
5260: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
5270: 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20  , op==TK_GT);.  
5280: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
5290: 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29  If(v, op==TK_LE)
52a0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
52b0: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
52c0: 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  _GE);.      if( 
52d0: 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70 78  i==nLeft-2 ) opx
52e0: 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d   = op;.    }.  }
52f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
5300: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
5310: 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66 20  drDone);.}..#if 
5320: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
5330: 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  DEPTH>0./*.** Ch
5340: 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e  eck that argumen
5350: 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73  t nHeight is les
5360: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
5370: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a  to the maximum.*
5380: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  * expression dep
5390: 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69  th allowed. If i
53a0: 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20  t is not, leave 
53b0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
53c0: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a   in.** pParse..*
53d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
53e0: 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72  rCheckHeight(Par
53f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
5400: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20  nHeight){.  int 
5410: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5420: 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d    int mxHeight =
5430: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
5440: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
5450: 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20  _EXPR_DEPTH];.  
5460: 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65  if( nHeight>mxHe
5470: 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
5480: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5490: 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70  se, .       "Exp
54a0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20  ression tree is 
54b0: 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d  too large (maxim
54c0: 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d  um depth %d)", m
54d0: 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20  xHeight.    );. 
54e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
54f0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
5500: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  rn rc;.}../* The
5510: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65   following three
5520: 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67   functions, heig
5530: 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67  htOfExpr(), heig
5540: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a  htOfExprList().*
5550: 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65  * and heightOfSe
5560: 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64  lect(), are used
5570: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
5580: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
5590: 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65  .** of any expre
55a0: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
55b0: 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72  enced by the str
55c0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
55d0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72   the.** first ar
55e0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
55f0: 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65   this maximum he
5600: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
5610: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
5620: 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a   value pointed.*
5630: 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74  * to by pnHeight
5640: 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  , the second par
5650: 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74  ameter, then set
5660: 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68   *pnHeight to th
5670: 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a  at.** value..*/.
5680: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5690: 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70  htOfExpr(Expr *p
56a0: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
56b0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
56c0: 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e   if( p->nHeight>
56d0: 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20  *pnHeight ){.   
56e0: 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70     *pnHeight = p
56f0: 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d  ->nHeight;.    }
5700: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
5710: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  id heightOfExprL
5720: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  ist(ExprList *p,
5730: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5740: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5750: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
5760: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
5770: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67  i++){.      heig
5780: 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d  htOfExpr(p->a[i]
5790: 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74  .pExpr, pnHeight
57a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  );.    }.  }.}.s
57b0: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
57c0: 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74  tOfSelect(Select
57d0: 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20 2a   *pSelect, int *
57e0: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53 65 6c  pnHeight){.  Sel
57f0: 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  ect *p;.  for(p=
5800: 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d 70 2d  pSelect; p; p=p-
5810: 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 68 65  >pPrior){.    he
5820: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57  ightOfExpr(p->pW
5830: 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b  here, pnHeight);
5840: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5850: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e  r(p->pHaving, pn
5860: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5870: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69  ghtOfExpr(p->pLi
5880: 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  mit, pnHeight);.
5890: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
58a0: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
58b0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
58c0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
58d0: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48  p->pGroupBy, pnH
58e0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
58f0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5900: 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67  pOrderBy, pnHeig
5910: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
5920: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
5930: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
5940: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
5950: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a   passed as an .*
5960: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65  * argument. An e
5970: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e  xpression with n
5980: 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72  o children, Expr
5990: 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78  .pList or .** Ex
59a0: 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65  pr.pSelect membe
59b0: 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f  r has a height o
59c0: 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65  f 1. Any other e
59d0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73  xpression.** has
59e0: 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20   a height equal 
59f0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  to the maximum h
5a00: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68  eight of any oth
5a10: 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  er .** reference
5a20: 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e  d Expr plus one.
5a30: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
5a40: 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61  agate EP_Propaga
5a50: 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d  te flags up from
5a60: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f   Expr.x.pList to
5a70: 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20   Expr.flags,.** 
5a80: 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  if appropriate..
5a90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5aa0: 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70  xprSetHeight(Exp
5ab0: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  r *p){.  int nHe
5ac0: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
5ad0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66  htOfExpr(p->pLef
5ae0: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5af0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5b00: 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74  pRight, &nHeight
5b10: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
5b20: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
5b30: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
5b40: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5b50: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e  p->x.pSelect, &n
5b60: 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  Height);.  }else
5b70: 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20   if( p->x.pList 
5b80: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
5b90: 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69  xprList(p->x.pLi
5ba0: 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  st, &nHeight);. 
5bb0: 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45     p->flags |= E
5bc0: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71  P_Propagate & sq
5bd0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
5be0: 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  gs(p->x.pList);.
5bf0: 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74    }.  p->nHeight
5c00: 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a   = nHeight + 1;.
5c10: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
5c20: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
5c30: 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65  riable using the
5c40: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29   exprSetHeight()
5c50: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a   function. If.**
5c60: 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67   the height is g
5c70: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
5c80: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  maximum allowed 
5c90: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
5ca0: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
5cb0: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
5cc0: 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67  *.** Also propag
5cd0: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
5ce0: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
5cf0: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
5d00: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
5d10: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
5d20: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
5d30: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
5d40: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
5d50: 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p){.  if( pParse
5d60: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
5d70: 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74  .  exprSetHeight
5d80: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (p);.  sqlite3Ex
5d90: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
5da0: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
5db0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
5dc0: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  rn the maximum h
5dd0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70  eight of any exp
5de0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5df0: 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68  erenced.** by th
5e00: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5e10: 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
5e20: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
5e30: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
5e40: 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20  prHeight(Select 
5e50: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
5e60: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
5e70: 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65  OfSelect(p, &nHe
5e80: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
5e90: 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65  nHeight;.}.#else
5ea0: 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67   /* ABOVE:  Heig
5eb0: 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65  ht enforcement e
5ec0: 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20  nabled.  BELOW: 
5ed0: 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65  Height enforceme
5ee0: 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20  nt off */./*.** 
5ef0: 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  Propagate all EP
5f00: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
5f10: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5f20: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5f30: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5f40: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5f50: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5f60: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5f70: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5f80: 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  p && p->x.pList 
5f90: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
5fa0: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
5fb0: 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66  ect) ){.    p->f
5fc0: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
5fd0: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
5fe0: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5ff0: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23  .pList);.  }.}.#
6000: 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65  define exprSetHe
6010: 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f  ight(y).#endif /
6020: 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  * SQLITE_MAX_EXP
6030: 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a  R_DEPTH>0 */../*
6040: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6050: 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c   is the core all
6060: 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20  ocator for Expr 
6070: 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e  nodes..**.** Con
6080: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
6090: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64  ression node and
60a0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
60b0: 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79  r to it.  Memory
60c0: 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64  .** for this nod
60d0: 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54  e and for the pT
60e0: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  oken argument is
60f0: 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   a single alloca
6100: 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  tion.** obtained
6110: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
6120: 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61  alloc().  The ca
6130: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
6140: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
6150: 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
6160: 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75   the node eventu
6170: 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e  ally gets freed.
6180: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74  .**.** If dequot
6190: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
61a0: 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74  the token (if it
61b0: 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75   exists) is dequ
61c0: 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75  oted..** If dequ
61d0: 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f  ote is false, no
61e0: 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65   dequoting is pe
61f0: 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64 65  rformed.  The de
6200: 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74  Quote.** paramet
6210: 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
6220: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20   pToken is NULL 
6230: 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20  or if the token 
6240: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65  does not.** appe
6250: 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ar to be quoted.
6260: 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20    If the quotes 
6270: 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  were of the form
6280: 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71   "..." (double-q
6290: 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74  uotes).** then t
62a0: 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20  he EP_DblQuoted 
62b0: 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
62c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
62d0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61  de..**.** Specia
62e0: 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d  l case:  If op==
62f0: 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70  TK_INTEGER and p
6300: 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Token points to 
6310: 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a  a string that.**
6320: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74   can be translat
6330: 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74  ed into a 32-bit
6340: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
6350: 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a  he token is not.
6360: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a  ** stored in u.z
6370: 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c  Token.  Instead,
6380: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
6390: 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ues is written.*
63a0: 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20  * into u.iValue 
63b0: 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61  and the EP_IntVa
63c0: 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e  lue flag is set.
63d0: 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61    No extra stora
63e0: 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74  ge.** is allocat
63f0: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69  ed to hold the i
6400: 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20  nteger text and 
6410: 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67  the dequote flag
6420: 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
6430: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
6440: 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65  rAlloc(.  sqlite
6450: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
6460: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
6470: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6480: 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  awNN() */.  int 
6490: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
64a0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
64b0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
64c0: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
64d0: 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61  n,    /* Token a
64e0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
64f0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
6500: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
6510: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
6520: 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20  dequote */.){.  
6530: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
6540: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
6550: 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a  int iValue = 0;.
6560: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
6570: 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e   );.  if( pToken
6580: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
6590: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
65a0: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
65b0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
65c0: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
65d0: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
65e0: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
65f0: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
6600: 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c      assert( iVal
6610: 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ue>=0 );.    }. 
6620: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
6630: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
6640: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
6650: 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  )+nExtra);.  if(
6660: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   pNew ){.    mem
6670: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
6680: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
6690: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
66a0: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
66b0: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
66c0: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
66d0: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
66e0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
66f0: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
6700: 6c 75 65 7c 45 50 5f 4c 65 61 66 7c 28 69 56 61  lue|EP_Leaf|(iVa
6710: 6c 75 65 3f 45 50 5f 49 73 54 72 75 65 3a 45 50  lue?EP_IsTrue:EP
6720: 5f 49 73 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  _IsFalse);.     
6730: 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
6740: 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20  e = iValue;.    
6750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6760: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
6770: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
6780: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
6790: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
67a0: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
67b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
67c0: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
67d0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
67e0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
67f0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
6800: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
6810: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
6820: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
6830: 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33 49 73  ote && sqlite3Is
6840: 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54  quote(pNew->u.zT
6850: 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20  oken[0]) ){.    
6860: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
6870: 75 6f 74 65 45 78 70 72 28 70 4e 65 77 29 3b 0a  uoteExpr(pNew);.
6880: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6890: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  }.    }.#if SQLI
68a0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
68b0: 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48  H>0.    pNew->nH
68c0: 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69  eight = 1;.#endi
68d0: 66 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f  .  }.  return
68e0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
68f0: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  Allocate a new e
6900: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
6910: 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69  rom a zero-termi
6920: 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74  nated token that
6930: 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   has.** already 
6940: 62 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a  been dequoted..*
6950: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
6960: 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
6970: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
6980: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c  * Handle for sql
6990: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
69a0: 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29  () (may be null)
69b0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
69d0: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
69e0: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
69f0: 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20  ar *zToken      
6a00: 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  /* Token argumen
6a10: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
6a20: 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20  L */.){.  Token 
6a30: 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65  x;.  x.z = zToke
6a40: 6e 3b 0a 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74  n;.  x.n = sqlit
6a50: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65  e3Strlen30(zToke
6a60: 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  n);.  return sql
6a70: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
6a80: 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a  , op, &x, 0);.}.
6a90: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75  ./*.** Attach su
6aa0: 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64  btrees pLeft and
6ab0: 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20 45   pRight to the E
6ac0: 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a  xpr node pRoot..
6ad0: 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d  **.** If pRoot==
6ae0: 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
6af0: 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c  that a memory al
6b00: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
6b10: 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  as occurred..** 
6b20: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 65  In that case, de
6b30: 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65 65  lete the subtree
6b40: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
6b50: 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ht..*/.void sqli
6b60: 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62  te3ExprAttachSub
6b70: 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33  trees(.  sqlite3
6b80: 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52   *db,.  Expr *pR
6b90: 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65  oot,.  Expr *pLe
6ba0: 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft,.  Expr *pRig
6bb0: 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f  ht.){.  if( pRoo
6bc0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  t==0 ){.    asse
6bd0: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
6be0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69  iled );.    sqli
6bf0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6c00: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  , pLeft);.    sq
6c10: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6c20: 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  db, pRight);.  }
6c30: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52  else{.    if( pR
6c40: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52  ight ){.      pR
6c50: 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 52  oot->pRight = pR
6c60: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  ight;.      pRoo
6c70: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  t->flags |= EP_P
6c80: 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67 68  ropagate & pRigh
6c90: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
6ca0: 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b      if( pLeft ){
6cb0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c  .      pRoot->pL
6cc0: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  eft = pLeft;.   
6cd0: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
6ce0: 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  |= EP_Propagate 
6cf0: 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a  & pLeft->flags;.
6d00: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
6d10: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
6d20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
6d30: 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e 6f  ocate an Expr no
6d40: 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61  de which joins a
6d50: 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75  s many as two su
6d60: 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  btrees..**.** On
6d70: 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
6d80: 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65   subtrees can be
6d90: 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61   NULL.  Return a
6da0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6db0: 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65  new.** Expr node
6dc0: 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d  .  Or, if an OOM
6dd0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
6de0: 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  et pParse->db->m
6df0: 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20  allocFailed,.** 
6e00: 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65  free the subtree
6e10: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
6e20: 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  L..*/.Expr *sqli
6e30: 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73  te3PExpr(.  Pars
6e40: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6e50: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
6e60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
6e70: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6e80: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6e90: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78  n opcode */.  Ex
6ea0: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
6eb0: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70        /* Left op
6ec0: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
6ed0: 2a 70 52 69 67 68 74 20 20 20 20 20 20 20 20 20  *pRight         
6ee0: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
6ef0: 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  and */.){.  Expr
6f00: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
6f10: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
6f20: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
6f30: 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 69 66 28  of(Expr));.  if(
6f40: 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74   p ){.    memset
6f50: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  (p, 0, sizeof(Ex
6f60: 70 72 29 29 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  pr));.    p->op 
6f70: 3d 20 6f 70 20 26 20 30 78 66 66 3b 0a 20 20 20  = op & 0xff;.   
6f80: 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20   p->iAgg = -1;. 
6f90: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74     sqlite3ExprAt
6fa0: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
6fb0: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
6fc0: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
6fd0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
6fe0: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
6ff0: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65  ->nHeight);.  }e
7000: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
7010: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
7020: 65 2d 3e 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20  e->db, pLeft);. 
7030: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
7040: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7050: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20   pRight);.  }.  
7060: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
7070: 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74 20 74  ** Add pSelect t
7080: 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70 53 65  o the Expr.x.pSe
7090: 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c  lect field.  Or,
70a0: 20 69 66 20 70 45 78 70 72 20 69 73 20 4e 55 4c   if pExpr is NUL
70b0: 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d  L (due.** do a m
70c0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
70d0: 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e 20 64   failure) then d
70e0: 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c 65 63  elete the pSelec
70f0: 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69  t object..*/.voi
7100: 64 20 73 71 6c 69 74 65 33 50 45 78 70 72 41 64  d sqlite3PExprAd
7110: 64 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  dSelect(Parse *p
7120: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7130: 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  pr, Select *pSel
7140: 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70  ect){.  if( pExp
7150: 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  r ){.    pExpr->
7160: 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  x.pSelect = pSel
7170: 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ect;.    ExprSet
7180: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
7190: 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50 5f  EP_xIsSelect|EP_
71a0: 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 73  Subquery);.    s
71b0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
71c0: 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72  ghtAndFlags(pPar
71d0: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 65  se, pExpr);.  }e
71e0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
71f0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
7200: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
7210: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
7220: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7230: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d   pSelect);.  }.}
7240: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  .../*.** Join tw
7250: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
7260: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
7270: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
7280: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
7290: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
72a0: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
72b0: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
72c0: 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20  .** If one side 
72d0: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
72e0: 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e  the AND is known
72f0: 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68   to be false, th
7300: 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  en instead.** of
7310: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e   returning an AN
7320: 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75  D expression, ju
7330: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73  st return a cons
7340: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
7350: 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20  with.** a value 
7360: 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70  of false..*/.Exp
7370: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e  r *sqlite3ExprAn
7380: 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
7390: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
73a0: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 73  pr *pRight){.  s
73b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
73c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
73d0: 4c 65 66 74 3d 3d 30 20 20 29 7b 0a 20 20 20 20  Left==0  ){.    
73e0: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
73f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
7400: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
7410: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
7420: 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73  e if( ExprAlways
7430: 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20  False(pLeft) || 
7440: 45 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  ExprAlwaysFalse(
7450: 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73  pRight) ){.    s
7460: 71 6c 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41  qlite3ExprUnmapA
7470: 6e 64 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c  ndDelete(pParse,
7480: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c   pLeft);.    sql
7490: 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41 6e 64  ite3ExprUnmapAnd
74a0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70  Delete(pParse, p
74b0: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
74c0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
74d0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
74e0: 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
74f0: 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20  okens[0], 0);.  
7500: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
7510: 6e 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  n sqlite3PExpr(p
7520: 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 70  Parse, TK_AND, p
7530: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
7540: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
7550: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
7560: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
7570: 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  a function with 
7580: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75  multiple.** argu
7590: 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ments..*/.Expr *
75a0: 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74  sqlite3ExprFunct
75b0: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
75c0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
75d0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
75e0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
75f0: 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 41 72  List,      /* Ar
7600: 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20  gument list */. 
7610: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20   Token *pToken, 
7620: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
7630: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  f the function *
7640: 2f 0a 20 20 69 6e 74 20 65 44 69 73 74 69 6e 63  /.  int eDistinc
7650: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 46 5f  t         /* SF_
7660: 44 69 73 74 69 6e 63 74 20 6f 72 20 53 46 5f 41  Distinct or SF_A
7670: 4c 4c 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20 20  LL or 0 */.){.  
7680: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71  Expr *pNew;.  sq
7690: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
76a0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
76b0: 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e  ( pToken );.  pN
76c0: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
76d0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e  Alloc(db, TK_FUN
76e0: 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31  CTION, pToken, 1
76f0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
7700: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
7710: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
7720: 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f  , pList); /* Avo
7730: 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77  id memory leak w
7740: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
7750: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
7760: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
7770: 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 45 78 70  t && pList->nExp
7780: 72 20 3e 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  r > pParse->db->
7790: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
77a0: 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MIT_FUNCTION_ARG
77b0: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
77c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
77d0: 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75 6d   "too many argum
77e0: 65 6e 74 73 20 6f 6e 20 66 75 6e 63 74 69 6f 6e  ents on function
77f0: 20 25 54 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20   %T", pToken);. 
7800: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
7810: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45 78  st = pList;.  Ex
7820: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e  prSetProperty(pN
7830: 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29 3b  ew, EP_HasFunc);
7840: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
7850: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
7860: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
7870: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
7880: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
7890: 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b  s(pParse, pNew);
78a0: 0a 20 20 69 66 28 20 65 44 69 73 74 69 6e 63 74  .  if( eDistinct
78b0: 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  ==SF_Distinct ) 
78c0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
78d0: 70 4e 65 77 2c 20 45 50 5f 44 69 73 74 69 6e 63  pNew, EP_Distinc
78e0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  t);.  return pNe
78f0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
7900: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
7910: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
7920: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
7930: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
7940: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
7950: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
7960: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
7970: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
7980: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
7990: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
79a0: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
79b0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
79c0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
79d0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
79e0: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
79f0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
7a00: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
7a10: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
7a20: 74 20 74 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f  t too big to avo
7a30: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
7a40: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
7a50: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
7a60: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
7a70: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
7a80: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
7a90: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
7aa0: 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61  rm ":aaa", "@aaa
7ab0: 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65  ", or "$aaa" are
7ac0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61   assigned the sa
7ad0: 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20  me number.** as 
7ae0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73  the previous ins
7af0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  tance of the sam
7b00: 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20  e wildcard.  Or 
7b10: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
7b20: 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65  irst.** instance
7b30: 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64   of the wildcard
7b40: 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  , the next seque
7b50: 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  ntial variable n
7b60: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
7b70: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
7b80: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
7b90: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
7ba0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
7bb0: 78 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73  xpr, u32 n){.  s
7bc0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7bd0: 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74  rse->db;.  const
7be0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61   char *z;.  ynVa
7bf0: 72 20 78 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  r x;..  if( pExp
7c00: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
7c10: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
7c20: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
7c30: 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f   EP_IntValue|EP_
7c40: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
7c50: 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70  Only) );.  z = p
7c60: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
7c70: 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
7c80: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d  ;.  assert( z[0]
7c90: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7ca0: 20 6e 3d 3d 28 75 33 32 29 73 71 6c 69 74 65 33   n==(u32)sqlite3
7cb0: 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20  Strlen30(z) );. 
7cc0: 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a   if( z[1]==0 ){.
7cd0: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
7ce0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e  of the form "?".
7cf0: 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78    Assign the nex
7d00: 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  t variable numbe
7d10: 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  r */.    assert(
7d20: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20   z[0]=='?' );.  
7d30: 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b    x = (ynVar)(++
7d40: 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20  pParse->nVar);. 
7d50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
7d60: 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20 20 69  doAdd = 0;.    i
7d70: 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[0]=='?' ){.
7d80: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
7d90: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
7da0: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
7db0: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
7dc0: 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  er and.      ** 
7dd0: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
7de0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
7df0: 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20  .      i64 i;.  
7e00: 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20      int bOk;.   
7e10: 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f     if( n==2 ){ /
7e20: 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46  *OPTIMIZATION-IF
7e30: 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 20 20  -TRUE*/.        
7e40: 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f  i = z[1]-'0';  /
7e50: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
7e60: 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73 69  e of ?N for a si
7e70: 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a  ngle digit N */.
7e80: 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b          bOk = 1;
7e90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7ea0: 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73        bOk = 0==s
7eb0: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b  qlite3Atoi64(&z[
7ec0: 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c  1], &i, n-1, SQL
7ed0: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
7ee0: 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
7ef0: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( i==0 );.     
7f00: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20   testcase( i==1 
7f10: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7f20: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
7f30: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7f40: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31  RIABLE_NUMBER]-1
7f50: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7f60: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
7f70: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7f80: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
7f90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b  );.      if( bOk
7fa0: 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e  ==0 || i<1 || i>
7fb0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7fc0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
7fd0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
7fe0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7ff0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
8000: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
8010: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
8020: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
8030: 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74        db->aLimit
8040: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
8050: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b  RIABLE_NUMBER]);
8060: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
8070: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 78  .      }.      x
8080: 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20   = (ynVar)i;.   
8090: 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d     if( x>pParse-
80a0: 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20  >nVar ){.       
80b0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
80c0: 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20 20 20  (int)x;.        
80d0: 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20  doAdd = 1;.     
80e0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
80f0: 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65  e3VListNumToName
8100: 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c  (pParse->pVList,
8110: 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   x)==0 ){.      
8120: 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20    doAdd = 1;.   
8130: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
8140: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
8150: 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20  ds like ":aaa", 
8160: 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61 22  "$aaa" or "@aaa"
8170: 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d  .  Reuse the sam
8180: 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20  e variable.     
8190: 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68   ** number as th
81a0: 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e  e prior appearan
81b0: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ce of the same n
81c0: 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e  ame, or if the n
81d0: 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ame.      ** has
81e0: 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20   never appeared 
81f0: 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68  before, reuse th
8200: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20  e same variable 
8210: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a  number.      */.
8220: 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72        x = (ynVar
8230: 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d  )sqlite3VListNam
8240: 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70  eToNum(pParse->p
8250: 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20  VList, z, n);.  
8260: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a      if( x==0 ){.
8270: 20 20 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56          x = (ynV
8280: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
8290: 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64 6f 41  ar);.        doA
82a0: 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  dd = 1;.      }.
82b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f      }.    if( do
82c0: 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Add ){.      pPa
82d0: 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71  rse->pVList = sq
82e0: 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28 64 62  lite3VListAdd(db
82f0: 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  , pParse->pVList
8300: 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20  , z, n, x);.    
8310: 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69  }.  }.  pExpr->i
8320: 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66  Column = x;.  if
8330: 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  ( x>db->aLimit[S
8340: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8350: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
8360: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8370: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
8380: 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62   many SQL variab
8390: 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  les");.  }.}../*
83a0: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
83b0: 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73  delete an expres
83c0: 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74  sion tree..*/.st
83d0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
83e0: 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65  LINE void sqlite
83f0: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71  3ExprDeleteNN(sq
8400: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
8410: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
8420: 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69  !=0 );.  /* Sani
8430: 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74  ty check: Assert
8440: 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c   that the IntVal
8450: 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  ue is non-negati
8460: 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  ve if it exists 
8470: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  */.  assert( !Ex
8480: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8490: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
84a0: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20   p->u.iValue>=0 
84b0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45  );..  assert( !E
84c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
84d0: 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 7c 7c  , EP_WinFunc) ||
84e0: 20 70 2d 3e 79 2e 70 57 69 6e 21 3d 30 20 7c 7c   p->y.pWin!=0 ||
84f0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
8500: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  d );.  assert( p
8510: 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op!=TK_FUNCTIO
8520: 4e 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  N || ExprHasProp
8530: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
8540: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
8550: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d  .          || p-
8560: 3e 79 2e 70 57 69 6e 3d 3d 30 20 7c 7c 20 45 78  >y.pWin==0 || Ex
8570: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8580: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a   EP_WinFunc) );.
8590: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
85a0: 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48 61  BUG.  if( ExprHa
85b0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
85c0: 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48 61  Leaf) && !ExprHa
85d0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
85e0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
85f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 65    assert( p->pLe
8600: 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ft==0 );.    ass
8610: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
8620: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8630: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30   p->x.pSelect==0
8640: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
8650: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
8660: 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f 6b  perty(p, (EP_Tok
8670: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29  enOnly|EP_Leaf))
8680: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45   ){.    /* The E
8690: 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e  xpr.x union is n
86a0: 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65  ever used at the
86b0: 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78   same time as Ex
86c0: 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20  pr.pRight */.   
86d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c   assert( p->x.pL
86e0: 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ist==0 || p->pRi
86f0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
8700: 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70 2d  ( p->pLeft && p-
8710: 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op!=TK_SELECT_C
8720: 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33 45  OLUMN ) sqlite3E
8730: 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20  xprDeleteNN(db, 
8740: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  p->pLeft);.    i
8750: 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a  f( p->pRight ){.
8760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8770: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 2d  rDeleteNN(db, p-
8780: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 65  >pRight);.    }e
8790: 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50  lse if( ExprHasP
87a0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
87b0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
87c0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
87d0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
87e0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c  Select);.    }el
87f0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
8800: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
8810: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  db, p->x.pList);
8820: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 45  .    }.    if( E
8830: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8840: 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b  , EP_WinFunc) ){
8850: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8860: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
8870: 4e 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  N );.      sqlit
8880: 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 64  e3WindowDelete(d
8890: 62 2c 20 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20  b, p->y.pWin);. 
88a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 45     }.  }.  if( E
88b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
88c0: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
88d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
88e0: 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  b, p->u.zToken);
88f0: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
8900: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 74  roperty(p, EP_St
8910: 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71 6c  atic) ){.    sql
8920: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
8930: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20   p);.  }.}.void 
8940: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8950: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
8960: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
8970: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65   ) sqlite3ExprDe
8980: 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d  leteNN(db, p);.}
8990: 0a 0a 2f 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69  ../* Invoke sqli
89a0: 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d  te3RenameExprUnm
89b0: 61 70 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  ap() and sqlite3
89c0: 45 78 70 72 44 65 6c 65 74 65 28 29 20 6f 6e 20  ExprDelete() on 
89d0: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
89e0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
89f0: 65 33 45 78 70 72 55 6e 6d 61 70 41 6e 64 44 65  e3ExprUnmapAndDe
8a00: 6c 65 74 65 28 50 61 72 73 65 20 2a 70 50 61 72  lete(Parse *pPar
8a10: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
8a20: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
8a30: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
8a40: 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
8a50: 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61  e3RenameExprUnma
8a60: 70 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  p(pParse, p);.  
8a70: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
8a80: 78 70 72 44 65 6c 65 74 65 4e 4e 28 70 50 61 72  xprDeleteNN(pPar
8a90: 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  se->db, p);.  }.
8aa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8ab0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
8ac0: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
8ad0: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
8ae0: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70   structure .** p
8af0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
8b00: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  st argument. Thi
8b10: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
8b20: 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  of EXPR_FULLSIZE
8b30: 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45  ,.** EXPR_REDUCE
8b40: 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f  DSIZE or EXPR_TO
8b50: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a  KENONLYSIZE..*/.
8b60: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
8b70: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
8b80: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
8b90: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8ba0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74  TokenOnly) ) ret
8bb0: 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  urn EXPR_TOKENON
8bc0: 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78  LYSIZE;.  if( Ex
8bd0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8be0: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72   EP_Reduced) ) r
8bf0: 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43  eturn EXPR_REDUC
8c00: 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  EDSIZE;.  return
8c10: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
8c20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
8c30: 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
8c40: 6e 74 20 6f 66 20 61 6e 20 45 78 70 72 20 6e 6f  nt of an Expr no
8c50: 64 65 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  de, taking care 
8c60: 6e 6f 74 20 74 6f 20 72 65 61 64 0a 2a 2a 20 70  not to read.** p
8c70: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
8c80: 68 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  he structure for
8c90: 20 61 20 72 65 64 75 63 65 64 2d 73 69 7a 65 20   a reduced-size 
8ca0: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  version of the s
8cb0: 6f 75 72 63 65 0a 2a 2a 20 45 78 70 72 2e 0a 2a  ource.** Expr..*
8cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
8cd0: 70 72 4e 6f 64 65 43 6f 70 79 28 45 78 70 72 20  prNodeCopy(Expr 
8ce0: 2a 70 44 65 73 74 2c 20 45 78 70 72 20 2a 70 53  *pDest, Expr *pS
8cf0: 72 63 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 44  rc){.  memset(pD
8d00: 65 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  est, 0, sizeof(E
8d10: 78 70 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28  xpr));.  memcpy(
8d20: 70 44 65 73 74 2c 20 70 53 72 63 2c 20 65 78 70  pDest, pSrc, exp
8d30: 72 53 74 72 75 63 74 53 69 7a 65 28 70 53 72 63  rStructSize(pSrc
8d40: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ));.}../*.** The
8d50: 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28   dupedExpr*Size(
8d60: 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20  ) routines each 
8d70: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
8d80: 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
8d90: 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  red.** to store 
8da0: 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70  a copy of an exp
8db0: 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65  ression or expre
8dc0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65  ssion tree.  The
8dd0: 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68  y differ in.** h
8de0: 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74  ow much of the t
8df0: 72 65 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e  ree is measured.
8e00: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  .**.**     duped
8e10: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29  ExprStructSize()
8e20: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c       Size of onl
8e30: 79 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  y the Expr struc
8e40: 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70  ture .**     dup
8e50: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29  edExprNodeSize()
8e60: 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45         Size of E
8e70: 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20  xpr + space for 
8e80: 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70  token.**     dup
8e90: 65 64 45 78 70 72 53 69 7a 65 28 29 20 20 20 20  edExprSize()    
8ea0: 20 20 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f         Expr + to
8eb0: 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f  ken + subtree co
8ec0: 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a  mponents.**.****
8ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f10: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
8f20: 65 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  e dupedExprStruc
8f30: 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e  tSize() function
8f40: 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c   returns two val
8f50: 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68  ues OR-ed togeth
8f60: 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65  er:  .** (1) the
8f70: 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
8f80: 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68  for a copy of th
8f90: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
8fa0: 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32   only and .** (2
8fb0: 29 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61  ) the EP_xxx fla
8fc0: 67 73 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  gs that indicate
8fd0: 20 77 68 61 74 20 74 68 65 20 73 74 72 75 63 74   what the struct
8fe0: 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20  ure size should 
8ff0: 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  be..** The retur
9000: 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61  n values is alwa
9010: 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a  ys one of:.**.**
9020: 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53        EXPR_FULLS
9030: 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  IZE.**      EXPR
9040: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c  _REDUCEDSIZE   |
9050: 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20   EP_Reduced.**  
9060: 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e      EXPR_TOKENON
9070: 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65  LYSIZE | EP_Toke
9080: 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nOnly.**.** The 
9090: 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75  size of the stru
90a0: 63 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75  cture can be fou
90b0: 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68  nd by masking th
90c0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
90d0: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
90e0: 65 20 77 69 74 68 20 30 78 66 66 66 2e 20 20 54  e with 0xfff.  T
90f0: 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20  he flags can be 
9100: 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67  found by masking
9110: 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   the.** return v
9120: 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65 64  alue with EP_Red
9130: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
9140: 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  y..**.** Note th
9150: 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45  at with flags==E
9160: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74  XPRDUP_REDUCE, t
9170: 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72  his routines wor
9180: 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a  ks on full-size.
9190: 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20 45  ** (unreduced) E
91a0: 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74  xpr objects as t
91b0: 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c  hey or originall
91c0: 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  y constructed by
91d0: 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20   the parser..** 
91e0: 44 75 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f  During expressio
91f0: 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72  n analysis, extr
9200: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  a information is
9210: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f   computed and mo
9220: 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65  ved into.** late
9230: 72 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 45  r parts of the E
9240: 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74  xpr object and t
9250: 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  hat extra inform
9260: 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20  ation might get 
9270: 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69  chopped.** off i
9280: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9290: 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f   is reduced.  No
92a0: 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20  te also that it 
92b0: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f  does not work to
92c0: 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52  .** make an EXPR
92d0: 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20  DUP_REDUCE copy 
92e0: 6f 66 20 61 20 72 65 64 75 63 65 64 20 65 78 70  of a reduced exp
92f0: 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20  ression.  It is 
9300: 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f  only legal.** to
9310: 20 72 65 64 75 63 65 20 61 20 70 72 69 73 74 69   reduce a pristi
9320: 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ne expression tr
9330: 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73  ee from the pars
9340: 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65  er.  The impleme
9350: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75  ntation.** of du
9360: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
9370: 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74  e() contain mult
9380: 69 70 6c 65 20 61 73 73 65 72 74 28 29 20 73 74  iple assert() st
9390: 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74  atements that at
93a0: 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f  tempt.** to enfo
93b0: 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61  rce this constra
93c0: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
93d0: 6e 74 20 64 75 70 65 64 45 78 70 72 53 74 72 75  nt dupedExprStru
93e0: 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  ctSize(Expr *p, 
93f0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
9400: 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  t nSize;.  asser
9410: 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  t( flags==EXPRDU
9420: 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67  P_REDUCE || flag
9430: 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20  s==0 ); /* Only 
9440: 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61  one flag value a
9450: 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65  llowed */.  asse
9460: 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  rt( EXPR_FULLSIZ
9470: 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73  E<=0xfff );.  as
9480: 73 65 72 74 28 20 28 30 78 66 66 66 20 26 20 28  sert( (0xfff & (
9490: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
94a0: 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a  kenOnly))==0 );.
94b0: 20 20 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c    if( 0==flags |
94c0: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  | p->op==TK_SELE
94d0: 43 54 5f 43 4f 4c 55 4d 4e 20 0a 23 69 66 6e 64  CT_COLUMN .#ifnd
94e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
94f0: 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 7c 7c 20  INDOWFUNC.   || 
9500: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9510: 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 0a 23  p, EP_WinFunc).#
9520: 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 6e  endif.  ){.    n
9530: 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c  Size = EXPR_FULL
9540: 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  SIZE;.  }else{. 
9550: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9560: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9570: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
9580: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
9590: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
95a0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
95b0: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
95c0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
95d0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
95e0: 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20  emToken) );.    
95f0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9600: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
9610: 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20  oReduce) );.    
9620: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20  if( p->pLeft || 
9630: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
9640: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
9650: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45  _REDUCEDSIZE | E
9660: 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d  P_Reduced;.    }
9670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
9680: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
9690: 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   );.      nSize 
96a0: 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  = EXPR_TOKENONLY
96b0: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
96c0: 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nly;.    }.  }. 
96d0: 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d   return nSize;.}
96e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
96f0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
9700: 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  e space in bytes
9710: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
9720: 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20  re the copy .** 
9730: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
9740: 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79  cture and a copy
9750: 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a   of the Expr.u.z
9760: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
9770: 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20   that.** string 
9780: 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a  is defined.).*/.
9790: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
97a0: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70  ExprNodeSize(Exp
97b0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
97c0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
97d0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
97e0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20  ize(p, flags) & 
97f0: 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78  0xfff;.  if( !Ex
9800: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9810: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
9820: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
9830: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
9840: 69 74 65 33 53 74 72 6c 65 6e 33 30 4e 4e 28 70  ite3Strlen30NN(p
9850: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20  ->u.zToken)+1;. 
9860: 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e   }.  return ROUN
9870: 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a  D8(nByte);.}../*
9880: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
9890: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
98a0: 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74  equired to creat
98b0: 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  e a duplicate of
98c0: 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73   the .** express
98d0: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
98e0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
98f0: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
9900: 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61  ument is a.** ma
9910: 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58  sk containing EX
9920: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
9930: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
9940: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
9950: 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65 61  es space to crea
9960: 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  te a copy of the
9970: 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20   Expr struct.** 
9980: 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62  itself and the b
9990: 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20 74  uffer referred t
99a0: 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  o by Expr.u.zTok
99b0: 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a  en, if any..**.*
99c0: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
99d0: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
99e0: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65  set, then the re
99f0: 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75  turn value inclu
9a00: 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f  des .** space to
9a10: 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45   duplicate all E
9a20: 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65  xpr nodes in the
9a30: 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20   tree formed by 
9a40: 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61  Expr.pLeft .** a
9a50: 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20 76  nd Expr.pRight v
9a60: 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f  ariables (but no
9a70: 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74  t for any struct
9a80: 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  ures pointed to 
9a90: 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64  or .** descended
9aa0: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
9ab0: 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78  .pList or Expr.x
9ac0: 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c  .pSelect variabl
9ad0: 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  es)..*/.static i
9ae0: 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  nt dupedExprSize
9af0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
9b00: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
9b10: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  e = 0;.  if( p )
9b20: 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75  {.    nByte = du
9b30: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
9b40: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  p, flags);.    i
9b50: 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50  f( flags&EXPRDUP
9b60: 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20  _REDUCE ){.     
9b70: 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45   nByte += dupedE
9b80: 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74  xprSize(p->pLeft
9b90: 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64  , flags) + duped
9ba0: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67  ExprSize(p->pRig
9bb0: 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ht, flags);.    
9bc0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
9bd0: 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Byte;.}../*.** T
9be0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
9bf0: 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
9c00: 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78 63  e3ExprDup(), exc
9c10: 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42 75  ept that if pzBu
9c20: 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20  ffer .** is not 
9c30: 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66  NULL then *pzBuf
9c40: 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  fer is assumed t
9c50: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
9c60: 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  fer large enough
9c70: 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68   .** to store th
9c80: 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73  e copy of expres
9c90: 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69  sion p, the copi
9ca0: 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65  es of p->u.zToke
9cb0: 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61  n.** (if applica
9cc0: 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f  ble), and the co
9cd0: 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70  pies of the p->p
9ce0: 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67  Left and p->pRig
9cf0: 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  ht expressions,.
9d00: 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72  ** if any. Befor
9d10: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
9d20: 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f  Buffer is set to
9d30: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
9d40: 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74  past the.** port
9d50: 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65  ion of the buffe
9d60: 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79  r copied into by
9d70: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
9d80: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
9d90: 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  exprDup(sqlite3 
9da0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
9db0: 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a  t dupFlags, u8 *
9dc0: 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78  *pzBuffer){.  Ex
9dd0: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
9de0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
9df0: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a  return */.  u8 *
9e00: 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  zAlloc;         
9e10: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63    /* Memory spac
9e20: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
9e30: 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63  build Expr objec
9e40: 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69  t */.  u32 stati
9e50: 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  cFlag;       /* 
9e60: 45 50 5f 53 74 61 74 69 63 20 69 66 20 73 70 61  EP_Static if spa
9e70: 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  ce not obtained 
9e80: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a  from malloc */..
9e90: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
9ea0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  );.  assert( p )
9eb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75 70 46  ;.  assert( dupF
9ec0: 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c  lags==0 || dupFl
9ed0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
9ee0: 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UCE );.  assert(
9ef0: 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20   pzBuffer==0 || 
9f00: 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55  dupFlags==EXPRDU
9f10: 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f  P_REDUCE );..  /
9f20: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  * Figure out whe
9f30: 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
9f40: 6e 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75  new Expr structu
9f50: 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42  re. */.  if( pzB
9f60: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c  uffer ){.    zAl
9f70: 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b  loc = *pzBuffer;
9f80: 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20  .    staticFlag 
9f90: 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d  = EP_Static;.  }
9fa0: 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63  else{.    zAlloc
9fb0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
9fc0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65  ocRawNN(db, dupe
9fd0: 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70  dExprSize(p, dup
9fe0: 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61  Flags));.    sta
9ff0: 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d  ticFlag = 0;.  }
a000: 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20  .  pNew = (Expr 
a010: 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28  *)zAlloc;..  if(
a020: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20   pNew ){.    /* 
a030: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
a040: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
a050: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
a060: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
a070: 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20      ** by pNew. 
a080: 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45  This is either E
a090: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58  XPR_FULLSIZE, EX
a0a0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
a0b0: 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f  r.    ** EXPR_TO
a0c0: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f  KENONLYSIZE. nTo
a0d0: 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  ken is set to th
a0e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
a0f0: 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a  s consumed.    *
a100: 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66  * by the copy of
a110: 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e   the p->u.zToken
a120: 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29   string (if any)
a130: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e  ..    */.    con
a140: 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72  st unsigned nStr
a150: 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45  uctSize = dupedE
a160: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
a170: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a180: 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69  const int nNewSi
a190: 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  ze = nStructSize
a1a0: 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e   & 0xfff;.    in
a1b0: 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66  t nToken;.    if
a1c0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a1d0: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
a1e0: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
a1f0: 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65  n ){.      nToke
a200: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
a210: 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  n30(p->u.zToken)
a220: 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   + 1;.    }else{
a230: 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20  .      nToken = 
a240: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
a250: 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20   dupFlags ){.   
a260: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
a270: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
a280: 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a  _Reduced)==0 );.
a290: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
a2a0: 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65  loc, p, nNewSize
a2b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a2c0: 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20      u32 nSize = 
a2d0: 28 75 33 32 29 65 78 70 72 53 74 72 75 63 74 53  (u32)exprStructS
a2e0: 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65  ize(p);.      me
a2f0: 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20  mcpy(zAlloc, p, 
a300: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  nSize);.      if
a310: 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c  ( nSize<EXPR_FUL
a320: 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20  LSIZE ){ .      
a330: 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63    memset(&zAlloc
a340: 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52  [nSize], 0, EXPR
a350: 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29  _FULLSIZE-nSize)
a360: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a370: 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
a380: 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54  EP_Reduced, EP_T
a390: 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50  okenOnly, and EP
a3a0: 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70  _Static flags ap
a3b0: 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a  propriately. */.
a3c0: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
a3d0: 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c  &= ~(EP_Reduced|
a3e0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
a3f0: 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b  Static|EP_MemTok
a400: 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66  en);.    pNew->f
a410: 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53  lags |= nStructS
a420: 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65  ize & (EP_Reduce
a430: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b  d|EP_TokenOnly);
a440: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
a450: 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a   |= staticFlag;.
a460: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
a470: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72   p->u.zToken str
a480: 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  ing, if any. */.
a490: 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29      if( nToken )
a4a0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
a4b0: 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a  oken = pNew->u.z
a4c0: 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26  Token = (char*)&
a4d0: 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d  zAlloc[nNewSize]
a4e0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
a4f0: 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  Token, p->u.zTok
a500: 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
a510: 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28   }..    if( 0==(
a520: 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e  (p->flags|pNew->
a530: 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f 6b  flags) & (EP_Tok
a540: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29  enOnly|EP_Leaf))
a550: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c   ){.      /* Fil
a560: 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78  l in the pNew->x
a570: 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77  .pSelect or pNew
a580: 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72  ->x.pList member
a590: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45  . */.      if( E
a5a0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a5b0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
a5c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
a5d0: 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  >x.pSelect = sql
a5e0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
a5f0: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  , p->x.pSelect, 
a600: 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  dupFlags);.     
a610: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a620: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20  pNew->x.pList = 
a630: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
a640: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73  up(db, p->x.pLis
a650: 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  t, dupFlags);.  
a660: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a670: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77   /* Fill in pNew
a680: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77  ->pLeft and pNew
a690: 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20  ->pRight. */.   
a6a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
a6b0: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65  erty(pNew, EP_Re
a6c0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
a6d0: 6c 79 7c 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  ly|EP_WinFunc) )
a6e0: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b  {.      zAlloc +
a6f0: 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53  = dupedExprNodeS
a700: 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29  ize(p, dupFlags)
a710: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70  ;.      if( !Exp
a720: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
a730: 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  w, EP_TokenOnly|
a740: 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  EP_Leaf) ){.    
a750: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
a760: 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a 20 20 20  = p->pLeft ?.   
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20 70     exprDup(db, p
a790: 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50  ->pLeft, EXPRDUP
a7a0: 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63  _REDUCE, &zAlloc
a7b0: 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 70  ) : 0;.        p
a7c0: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 2d  New->pRight = p-
a7d0: 3e 70 52 69 67 68 74 20 3f 0a 20 20 20 20 20 20  >pRight ?.      
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7f0: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
a800: 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f  pRight, EXPRDUP_
a810: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
a820: 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   : 0;.      }.#i
a830: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a840: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
a850: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
a860: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e  operty(p, EP_Win
a870: 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
a880: 20 70 4e 65 77 2d 3e 79 2e 70 57 69 6e 20 3d 20   pNew->y.pWin = 
a890: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75 70  sqlite3WindowDup
a8a0: 28 64 62 2c 20 70 4e 65 77 2c 20 70 2d 3e 79 2e  (db, pNew, p->y.
a8b0: 70 57 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  pWin);.        a
a8c0: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
a8d0: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
a8e0: 57 69 6e 46 75 6e 63 29 20 29 3b 0a 20 20 20 20  WinFunc) );.    
a8f0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
a900: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
a910: 46 55 4e 43 20 2a 2f 0a 20 20 20 20 20 20 69 66  FUNC */.      if
a920: 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20  ( pzBuffer ){.  
a930: 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20        *pzBuffer 
a940: 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  = zAlloc;.      
a950: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
a960: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
a970: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
a980: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
a990: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
a9a0: 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  pNew->op==TK_SEL
a9b0: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  ECT_COLUMN ){.  
a9c0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
a9d0: 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a  eft = p->pLeft;.
a9e0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
a9f0: 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20  ( p->iColumn==0 
aa00: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  || p->pRight==0 
aa10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
aa20: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
aa30: 30 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d  0  || p->pRight=
aa40: 3d 70 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20  =p->pLeft );.   
aa50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aa60: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66        pNew->pLef
aa70: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
aa80: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c  up(db, p->pLeft,
aa90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
aaa0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
aab0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
aac0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
aad0: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ht, 0);.      }.
aae0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
aaf0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
ab00: 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74  * Create and ret
ab10: 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20  urn a deep copy 
ab20: 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61  of the object pa
ab30: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
ab40: 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  nd .** argument.
ab50: 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69   If an OOM condi
ab60: 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65  tion is encounte
ab70: 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  red, NULL is ret
ab80: 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  urned.** and the
ab90: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
aba0: 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23  d flag set..*/.#
abb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
abc0: 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69  IT_CTE.static Wi
abd0: 74 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69  th *withDup(sqli
abe0: 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70  te3 *db, With *p
abf0: 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20  ){.  With *pRet 
ac00: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
ac10: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
ac20: 34 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  4 nByte = sizeof
ac30: 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d  (*p) + sizeof(p-
ac40: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74  >a[0]) * (p->nCt
ac50: 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d  e-1);.    pRet =
ac60: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
ac70: 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
ac80: 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b  .    if( pRet ){
ac90: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
aca0: 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d      pRet->nCte =
acb0: 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20   p->nCte;.      
acc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
acd0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
ace0: 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65    pRet->a[i].pSe
acf0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
ad00: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61  lectDup(db, p->a
ad10: 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b  [i].pSelect, 0);
ad20: 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61  .        pRet->a
ad30: 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69  [i].pCols = sqli
ad40: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
ad50: 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73  b, p->a[i].pCols
ad60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
ad70: 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  et->a[i].zName =
ad80: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
ad90: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  (db, p->a[i].zNa
ada0: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
adb0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
adc0: 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  pRet;.}.#else.# 
add0: 64 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78  define withDup(x
ade0: 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69  ,y) 0.#endif..#i
adf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ae00: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 2f 2a 0a  T_WINDOWFUNC./*.
ae10: 2a 2a 20 54 68 65 20 67 61 74 68 65 72 53 65 6c  ** The gatherSel
ae20: 65 63 74 57 69 6e 64 6f 77 73 28 29 20 70 72 6f  ectWindows() pro
ae30: 63 65 64 75 72 65 20 61 6e 64 20 69 74 73 20 68  cedure and its h
ae40: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 0a 2a 2a  elper routine.**
ae50: 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e   gatherSelectWin
ae60: 64 6f 77 73 43 61 6c 6c 62 61 63 6b 28 29 20 61  dowsCallback() a
ae70: 72 65 20 75 73 65 64 20 74 6f 20 73 63 61 6e 20  re used to scan 
ae80: 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69  all the expressi
ae90: 6f 6e 73 0a 2a 2a 20 61 6e 20 61 20 6e 65 77 6c  ons.** an a newl
aea0: 79 20 64 75 70 6c 69 63 61 74 65 64 20 53 45 4c  y duplicated SEL
aeb0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
aec0: 64 20 67 61 74 68 65 72 20 61 6c 6c 20 6f 66 20  d gather all of 
aed0: 74 68 65 20 57 69 6e 64 6f 77 0a 2a 2a 20 6f 62  the Window.** ob
aee0: 6a 65 63 74 73 20 66 6f 75 6e 64 20 74 68 65 72  jects found ther
aef0: 65 2c 20 61 73 73 65 6d 62 6c 69 6e 67 20 74 68  e, assembling th
af00: 65 6d 20 6f 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  em onto the link
af10: 65 64 20 6c 69 73 74 20 61 74 20 53 65 6c 65 63  ed list at Selec
af20: 74 2d 3e 70 57 69 6e 2e 0a 2a 2f 0a 73 74 61 74  t->pWin..*/.stat
af30: 69 63 20 69 6e 74 20 67 61 74 68 65 72 53 65 6c  ic int gatherSel
af40: 65 63 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62 61  ectWindowsCallba
af50: 63 6b 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ck(Walker *pWalk
af60: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
af70: 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
af80: 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26  p==TK_FUNCTION &
af90: 26 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 21  & pExpr->y.pWin!
afa0: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
afb0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
afc0: 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46  y(pExpr, EP_WinF
afd0: 75 6e 63 29 20 29 3b 0a 20 20 20 20 70 45 78 70  unc) );.    pExp
afe0: 72 2d 3e 79 2e 70 57 69 6e 2d 3e 70 4e 65 78 74  r->y.pWin->pNext
aff0: 57 69 6e 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  Win = pWalker->u
b000: 2e 70 53 65 6c 65 63 74 2d 3e 70 57 69 6e 3b 0a  .pSelect->pWin;.
b010: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70      pWalker->u.p
b020: 53 65 6c 65 63 74 2d 3e 70 57 69 6e 20 3d 20 70  Select->pWin = p
b030: 45 78 70 72 2d 3e 79 2e 70 57 69 6e 3b 0a 20 20  Expr->y.pWin;.  
b040: 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
b050: 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
b060: 63 20 69 6e 74 20 67 61 74 68 65 72 53 65 6c 65  c int gatherSele
b070: 63 74 57 69 6e 64 6f 77 73 53 65 6c 65 63 74 43  ctWindowsSelectC
b080: 61 6c 6c 62 61 63 6b 28 57 61 6c 6b 65 72 20 2a  allback(Walker *
b090: 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
b0a0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 3d  *p){.  return p=
b0b0: 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c  =pWalker->u.pSel
b0c0: 65 63 74 20 3f 20 57 52 43 5f 43 6f 6e 74 69 6e  ect ? WRC_Contin
b0d0: 75 65 20 3a 20 57 52 43 5f 50 72 75 6e 65 3b 0a  ue : WRC_Prune;.
b0e0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 61  }.static void ga
b0f0: 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77  therSelectWindow
b100: 73 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  s(Select *p){.  
b110: 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45  Walker w;.  w.xE
b120: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 67 61  xprCallback = ga
b130: 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77  therSelectWindow
b140: 73 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 77 2e 78  sCallback;.  w.x
b150: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
b160: 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e   gatherSelectWin
b170: 64 6f 77 73 53 65 6c 65 63 74 43 61 6c 6c 62 61  dowsSelectCallba
b180: 63 6b 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ck;.  w.xSelectC
b190: 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20  allback2 = 0;.  
b1a0: 77 2e 70 50 61 72 73 65 20 3d 20 30 3b 0a 20 20  w.pParse = 0;.  
b1b0: 77 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b  w.u.pSelect = p;
b1c0: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
b1d0: 6c 65 63 74 28 26 77 2c 20 70 29 3b 0a 7d 0a 23  lect(&w, p);.}.#
b1e0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
b1f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75  e following grou
b200: 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61  p of routines ma
b210: 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f  ke deep copies o
b220: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  f expressions,.*
b230: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
b240: 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e  ts, ID lists, an
b250: 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d select stateme
b260: 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73  nts.  The copies
b270: 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74   can.** be delet
b280: 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73  ed (by being pas
b290: 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73  sed to their res
b2a0: 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74  pective ...Delet
b2b0: 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a  e() routines).**
b2c0: 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69   without effecti
b2d0: 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73  ng the originals
b2e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ..**.** The expr
b2f0: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c  ession list, ID,
b300: 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74   and source list
b310: 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69  s return by sqli
b320: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29  te3ExprListDup()
b330: 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69  ,.** sqlite3IdLi
b340: 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c  stDup(), and sql
b350: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29  ite3SrcListDup()
b360: 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74   can not be furt
b370: 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a  her expanded .**
b380: 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
b390: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c  alls to sqlite*L
b3a0: 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74  istAppend() rout
b3b0: 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  ines..**.** Any 
b3c0: 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20  tables that the 
b3d0: 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f  SrcList might po
b3e0: 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64  int to are not d
b3f0: 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  uplicated..**.**
b400: 20 54 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   The flags param
b410: 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20  eter contains a 
b420: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74  combination of t
b430: 68 65 20 45 58 50 52 44 55 50 5f 58 58 58 20 66  he EXPRDUP_XXX f
b440: 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20  lags..** If the 
b450: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66  EXPRDUP_REDUCE f
b460: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
b470: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72   the structure r
b480: 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20  eturned is a.** 
b490: 74 72 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f  truncated versio
b4a0: 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45  n of the usual E
b4b0: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 74 68  xpr structure th
b4c0: 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65  at will be store
b4d0: 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20  d as.** part of 
b4e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
b4f0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
b500: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
b510: 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ema..*/.Expr *sq
b520: 6c 69 74 65 33 45 78 70 72 44 75 70 28 73 71 6c  lite3ExprDup(sql
b530: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
b540: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
b550: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
b560: 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52  0 || flags==EXPR
b570: 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20  DUP_REDUCE );.  
b580: 72 65 74 75 72 6e 20 70 20 3f 20 65 78 70 72 44  return p ? exprD
b590: 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c  up(db, p, flags,
b5a0: 20 30 29 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c   0) : 0;.}.ExprL
b5b0: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
b5c0: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
b5d0: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
b5e0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
b5f0: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
b600: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
b610: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a  t_item *pItem, *
b620: 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20  pOldItem;.  int 
b630: 69 3b 0a 20 20 45 78 70 72 20 2a 70 50 72 69 6f  i;.  Expr *pPrio
b640: 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20 30 3b 0a  rSelectCol = 0;.
b650: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
b660: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
b670: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
b680: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
b690: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 71 6c 69  ocRawNN(db, sqli
b6a0: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
b6b0: 64 62 2c 20 70 29 29 3b 0a 20 20 69 66 28 20 70  db, p));.  if( p
b6c0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
b6d0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72  0;.  pNew->nExpr
b6e0: 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70   = p->nExpr;.  p
b6f0: 49 74 65 6d 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a  Item = pNew->a;.
b700: 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e    pOldItem = p->
b710: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
b720: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
b730: 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d  Item++, pOldItem
b740: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
b750: 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74  OldExpr = pOldIt
b760: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 45  em->pExpr;.    E
b770: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
b780: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
b790: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
b7a0: 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66  (db, pOldExpr, f
b7b0: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lags);.    if( p
b7c0: 4f 6c 64 45 78 70 72 20 0a 20 20 20 20 20 26 26  OldExpr .     &&
b7d0: 20 70 4f 6c 64 45 78 70 72 2d 3e 6f 70 3d 3d 54   pOldExpr->op==T
b7e0: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a  K_SELECT_COLUMN.
b7f0: 20 20 20 20 20 26 26 20 28 70 4e 65 77 45 78 70       && (pNewExp
b800: 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  r = pItem->pExpr
b810: 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
b820: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45     assert( pNewE
b830: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20  xpr->iColumn==0 
b840: 7c 7c 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  || i>0 );.      
b850: 69 66 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43  if( pNewExpr->iC
b860: 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  olumn==0 ){.    
b870: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
b880: 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c  Expr->pLeft==pOl
b890: 64 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 3b  dExpr->pRight );
b8a0: 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 53  .        pPriorS
b8b0: 65 6c 65 63 74 43 6f 6c 20 3d 20 70 4e 65 77 45  electCol = pNewE
b8c0: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65  xpr->pLeft = pNe
b8d0: 77 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  wExpr->pRight;. 
b8e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b8f0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
b900: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
b910: 74 28 20 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78  t( pItem[-1].pEx
b920: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
b930: 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70   assert( pNewExp
b940: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65  r->iColumn==pIte
b950: 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  m[-1].pExpr->iCo
b960: 6c 75 6d 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20  lumn+1 );.      
b970: 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
b980: 53 65 6c 65 63 74 43 6f 6c 3d 3d 70 49 74 65 6d  SelectCol==pItem
b990: 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 70 4c 65 66  [-1].pExpr->pLef
b9a0: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  t );.        pNe
b9b0: 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70  wExpr->pLeft = p
b9c0: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3b 0a  PriorSelectCol;.
b9d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b9e0: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
b9f0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
ba00: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
ba10: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
ba20: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
ba30: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
ba40: 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a  ldItem->zSpan);.
ba50: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
ba60: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
ba70: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
ba80: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
ba90: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
baa0: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
bab0: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
bac0: 20 20 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65     pItem->bSorte
bad0: 72 52 65 66 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rRef = pOldItem-
bae0: 3e 62 53 6f 72 74 65 72 52 65 66 3b 0a 20 20 20  >bSorterRef;.   
baf0: 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64   pItem->u = pOld
bb00: 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72  Item->u;.  }.  r
bb10: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
bb20: 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c  *.** If cursors,
bb30: 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73   triggers, views
bb40: 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
bb50: 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20  are all omitted 
bb60: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c  from.** the buil
bb70: 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20  d, then none of 
bb80: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
bb90: 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66  utines, except f
bba0: 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65  or .** sqlite3Se
bbb0: 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62  lectDup(), can b
bbc0: 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65  e called. sqlite
bbd0: 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20  3SelectDup() is 
bbe0: 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c  sometimes.** cal
bbf0: 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  led with a NULL 
bc00: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  argument..*/.#if
bc10: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
bc20: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
bc30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
bc40: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20  MIT_TRIGGER) \. 
bc50: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
bc60: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
bc70: 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  ).SrcList *sqlit
bc80: 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c  e3SrcListDup(sql
bc90: 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
bca0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
bcb0: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  {.  SrcList *pNe
bcc0: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  w;.  int i;.  in
bcd0: 74 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72  t nByte;.  asser
bce0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
bcf0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
bd00: 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  0;.  nByte = siz
bd10: 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53  eof(*p) + (p->nS
bd20: 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d  rc>0 ? sizeof(p-
bd30: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72  >a[0]) * (p->nSr
bd40: 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65  c-1) : 0);.  pNe
bd50: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
bd60: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79  locRawNN(db, nBy
bd70: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  te );.  if( pNew
bd80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
bd90: 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70    pNew->nSrc = p
bda0: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
bdb0: 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >nSrc;.  for(i=0
bdc0: 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b  ; i<p->nSrc; i++
bdd0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
bde0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  cList_item *pNew
bdf0: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
be00: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
be10: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
be20: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
be30: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
be40: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
be50: 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49  >pSchema = pOldI
be60: 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  tem->pSchema;.  
be70: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74    pNewItem->zDat
be80: 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44  abase = sqlite3D
be90: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
bea0: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
beb0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
bec0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
bed0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
bee0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
bef0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69    pNewItem->zAli
bf00: 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  as = sqlite3DbSt
bf10: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
bf20: 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
bf30: 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70  pNewItem->fg = p
bf40: 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20  OldItem->fg;.   
bf50: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73   pNewItem->iCurs
bf60: 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  or = pOldItem->i
bf70: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77  Cursor;.    pNew
bf80: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
bf90: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64  b = pOldItem->ad
bfa0: 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70  drFillSub;.    p
bfb0: 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  NewItem->regRetu
bfc0: 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72  rn = pOldItem->r
bfd0: 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  egReturn;.    if
bfe0: 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69  ( pNewItem->fg.i
bff0: 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20  sIndexedBy ){.  
c000: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
c010: 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71  .zIndexedBy = sq
c020: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
c030: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a  , pOldItem->u1.z
c040: 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20  IndexedBy);.    
c050: 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  }.    pNewItem->
c060: 70 49 42 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49  pIBIndex = pOldI
c070: 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20  tem->pIBIndex;. 
c080: 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d     if( pNewItem-
c090: 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
c0a0: 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  .      pNewItem-
c0b0: 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a  >u1.pFuncArg = .
c0c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c0d0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
c0e0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46   pOldItem->u1.pF
c0f0: 75 6e 63 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a  uncArg, flags);.
c100: 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
c110: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
c120: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
c130: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
c140: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54  {.      pTab->nT
c150: 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20  abRef++;.    }. 
c160: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65     pNewItem->pSe
c170: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
c180: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  lectDup(db, pOld
c190: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66  Item->pSelect, f
c1a0: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lags);.    pNewI
c1b0: 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74  tem->pOn = sqlit
c1c0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
c1d0: 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61  ldItem->pOn, fla
c1e0: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  gs);.    pNewIte
c1f0: 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69  m->pUsing = sqli
c200: 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c  te3IdListDup(db,
c210: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e   pOldItem->pUsin
c220: 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  g);.    pNewItem
c230: 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64  ->colUsed = pOld
c240: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
c250: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
c260: 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  ;.}.IdList *sqli
c270: 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c  te3IdListDup(sql
c280: 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
c290: 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a   *p){.  IdList *
c2a0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
c2b0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
c2c0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
c2d0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
c2e0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c2f0: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
c300: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
c310: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
c320: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49  rn 0;.  pNew->nI
c330: 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e  d = p->nId;.  pN
c340: 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  ew->a = sqlite3D
c350: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
c360: 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70   p->nId*sizeof(p
c370: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
c380: 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20   pNew->a==0 ){. 
c390: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c3a0: 4e 4e 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  NN(db, pNew);.  
c3b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
c3c0: 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    /* Note that b
c3d0: 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65 20  ecause the size 
c3e0: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  of the allocatio
c3f0: 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20  n for p->a[] is 
c400: 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61  not.  ** necessa
c410: 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66 20  rily a power of 
c420: 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c 69  two, sqlite3IdLi
c430: 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20 6e  stAppend() may n
c440: 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a  ot be called.  *
c450: 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63 61  * on the duplica
c460: 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  te created by th
c470: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a  is function. */.
c480: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
c490: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
c4a0: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
c4b0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
c4c0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
c4d0: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
c4e0: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
c4f0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
c500: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
c510: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
c520: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
c530: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
c540: 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d  ->idx = pOldItem
c550: 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ->idx;.  }.  ret
c560: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
c570: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
c580: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
c590: 2c 20 53 65 6c 65 63 74 20 2a 70 44 75 70 2c 20  , Select *pDup, 
c5a0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65  int flags){.  Se
c5b0: 6c 65 63 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a  lect *pRet = 0;.
c5c0: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 78 74 20    Select *pNext 
c5d0: 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 2a  = 0;.  Select **
c5e0: 70 70 20 3d 20 26 70 52 65 74 3b 0a 20 20 53 65  pp = &pRet;.  Se
c5f0: 6c 65 63 74 20 2a 70 3b 0a 0a 20 20 61 73 73 65  lect *p;..  asse
c600: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 66  rt( db!=0 );.  f
c610: 6f 72 28 70 3d 70 44 75 70 3b 20 70 3b 20 70 3d  or(p=pDup; p; p=
c620: 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
c630: 53 65 6c 65 63 74 20 2a 70 4e 65 77 20 3d 20 73  Select *pNew = s
c640: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c650: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  wNN(db, sizeof(*
c660: 70 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  p) );.    if( pN
c670: 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ew==0 ) break;. 
c680: 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20     pNew->pEList 
c690: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
c6a0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
c6b0: 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  st, flags);.    
c6c0: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
c6d0: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64  ite3SrcListDup(d
c6e0: 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67  b, p->pSrc, flag
c6f0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57  s);.    pNew->pW
c700: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
c710: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68  prDup(db, p->pWh
c720: 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ere, flags);.   
c730: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
c740: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
c750: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f  tDup(db, p->pGro
c760: 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  upBy, flags);.  
c770: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
c780: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c790: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
c7a0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c7b0: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
c7c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c7d0: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
c7e0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c7f0: 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  ew->op = p->op;.
c800: 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
c810: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 70 4e 65  = pNext;.    pNe
c820: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  w->pPrior = 0;. 
c830: 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20     pNew->pLimit 
c840: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c850: 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  (db, p->pLimit, 
c860: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c870: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
c880: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
c890: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73  = 0;.    pNew->s
c8a0: 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
c8b0: 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73  Flags & ~SF_Uses
c8c0: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 70  Ephemeral;.    p
c8d0: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
c8e0: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70  m[0] = -1;.    p
c8f0: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
c900: 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70  m[1] = -1;.    p
c910: 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  New->nSelectRow 
c920: 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  = p->nSelectRow;
c930: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  .    pNew->pWith
c940: 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c 20 70   = withDup(db, p
c950: 2d 3e 70 57 69 74 68 29 3b 0a 23 69 66 6e 64 65  ->pWith);.#ifnde
c960: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
c970: 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 70 4e 65  NDOWFUNC.    pNe
c980: 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20  w->pWin = 0;.   
c990: 20 70 4e 65 77 2d 3e 70 57 69 6e 44 65 66 6e 20   pNew->pWinDefn 
c9a0: 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c  = sqlite3WindowL
c9b0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  istDup(db, p->pW
c9c0: 69 6e 44 65 66 6e 29 3b 0a 20 20 20 20 69 66 28  inDefn);.    if(
c9d0: 20 70 2d 3e 70 57 69 6e 20 29 20 67 61 74 68 65   p->pWin ) gathe
c9e0: 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 28 70  rSelectWindows(p
c9f0: 4e 65 77 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  New);.#endif.   
ca00: 20 70 4e 65 77 2d 3e 73 65 6c 49 64 20 3d 20 70   pNew->selId = p
ca10: 2d 3e 73 65 6c 49 64 3b 0a 20 20 20 20 2a 70 70  ->selId;.    *pp
ca20: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 70 20   = pNew;.    pp 
ca30: 3d 20 26 70 4e 65 77 2d 3e 70 50 72 69 6f 72 3b  = &pNew->pPrior;
ca40: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 4e 65  .    pNext = pNe
ca50: 77 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  w;.  }..  return
ca60: 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 53   pRet;.}.#else.S
ca70: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
ca80: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
ca90: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
caa0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
cab0: 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
cac0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
cad0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
cae0: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
caf0: 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78  the end of an ex
cb00: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
cb10: 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69  If pList is.** i
cb20: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
cb30: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
cb40: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
cb50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 4c 69 73  ..**.** The pLis
cb60: 74 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  t argument must 
cb70: 62 65 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f  be either NULL o
cb80: 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
cb90: 6e 20 45 78 70 72 4c 69 73 74 0a 2a 2a 20 6f 62  n ExprList.** ob
cba0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 70 72  tained from a pr
cbb0: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
cbc0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
cbd0: 64 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  d().  This routi
cbe0: 6e 65 0a 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65  ne.** may not be
cbf0: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 45 78   used with an Ex
cc00: 70 72 4c 69 73 74 20 6f 62 74 61 69 6e 65 64 20  prList obtained 
cc10: 66 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 70 72  from sqlite3Expr
cc20: 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a 20 52 65  ListDup()..** Re
cc30: 61 73 6f 6e 3a 20 20 54 68 69 73 20 72 6f 75 74  ason:  This rout
cc40: 69 6e 65 20 61 73 73 75 6d 65 73 20 74 68 61 74  ine assumes that
cc50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
cc60: 6c 6f 74 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61  lots in pList->a
cc70: 5b 5d 0a 2a 2a 20 69 73 20 61 20 70 6f 77 65 72  [].** is a power
cc80: 20 6f 66 20 74 77 6f 2e 20 20 54 68 61 74 20 69   of two.  That i
cc90: 73 20 74 72 75 65 20 66 6f 72 20 73 71 6c 69 74  s true for sqlit
cca0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
ccb0: 28 29 20 72 65 74 75 72 6e 73 0a 2a 2a 20 62 75  () returns.** bu
ccc0: 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
ccd0: 72 69 6c 79 20 74 72 75 65 20 66 72 6f 6d 20 74  rily true from t
cce0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
ccf0: 6f 66 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  of sqlite3ExprLi
cd00: 73 74 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  stDup()..**.** I
cd10: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
cd20: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
cd30: 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c  rs, the entire l
cd40: 69 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64  ist is freed and
cd50: 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  .** NULL is retu
cd60: 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55  rned.  If non-NU
cd70: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  LL is returned, 
cd80: 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
cd90: 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68  nteed.** that th
cda0: 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20  e new entry was 
cdb0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70  successfully app
cdc0: 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69  ended..*/.ExprLi
cdd0: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
cde0: 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72  istAppend(.  Par
cdf0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ce00: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
ce10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
ce20: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
ce30: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
ce40: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
ce50: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
ce60: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
ce80: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
ce90: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
cea0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
ceb0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
cec0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
ced0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
cee0: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
cef0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
cf00: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
cf10: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
cf20: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
cf30: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69  b, sizeof(ExprLi
cf40: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
cf50: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
cf60: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
cf70: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e    }.    pList->n
cf80: 45 78 70 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Expr = 0;.  }els
cf90: 65 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45  e if( (pList->nE
cfa0: 78 70 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45  xpr & (pList->nE
cfb0: 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20  xpr-1))==0 ){.  
cfc0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
cfd0: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
cfe0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
cff0: 2c 20 70 4c 69 73 74 2c 20 0a 20 20 20 20 20 20  , pList, .      
d000: 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74     sizeof(*pList
d010: 29 2b 28 32 2a 28 73 71 6c 69 74 65 33 5f 69 6e  )+(2*(sqlite3_in
d020: 74 36 34 29 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t64)pList->nExpr
d030: 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  -1)*sizeof(pList
d040: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
d050: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
d060: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
d070: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20      }.    pList 
d080: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49  = pNew;.  }.  pI
d090: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
d0a0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b  pList->nExpr++];
d0b0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
d0c0: 74 6f 66 28 73 74 72 75 63 74 20 45 78 70 72 4c  tof(struct ExprL
d0d0: 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29 3d  ist_item,zName)=
d0e0: 3d 73 69 7a 65 6f 66 28 70 49 74 65 6d 2d 3e 70  =sizeof(pItem->p
d0f0: 45 78 70 72 29 20 29 3b 0a 20 20 61 73 73 65 72  Expr) );.  asser
d100: 74 28 20 6f 66 66 73 65 74 6f 66 28 73 74 72 75  t( offsetof(stru
d110: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
d120: 2c 70 45 78 70 72 29 3d 3d 30 20 29 3b 0a 20 20  ,pExpr)==0 );.  
d130: 6d 65 6d 73 65 74 28 26 70 49 74 65 6d 2d 3e 7a  memset(&pItem->z
d140: 4e 61 6d 65 2c 30 2c 73 69 7a 65 6f 66 28 2a 70  Name,0,sizeof(*p
d150: 49 74 65 6d 29 2d 6f 66 66 73 65 74 6f 66 28 73  Item)-offsetof(s
d160: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
d170: 74 65 6d 2c 7a 4e 61 6d 65 29 29 3b 0a 20 20 70  tem,zName));.  p
d180: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
d190: 78 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  xpr;.  return pL
d1a0: 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20  ist;..no_mem:   
d1b0: 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65    .  /* Avoid le
d1c0: 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20  aking memory if 
d1d0: 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65  malloc has faile
d1e0: 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  d. */.  sqlite3E
d1f0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
d200: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  xpr);.  sqlite3E
d210: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
d220: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  , pList);.  retu
d230: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  rn 0;.}../*.** p
d240: 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78 70  Columns and pExp
d250: 72 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72 20  r form a vector 
d260: 61 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63 68  assignment which
d270: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
d280: 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 66  SET.** clause of
d290: 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65   an UPDATE state
d2a0: 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69 73  ment.  Like this
d2b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 28  :.**.**        (
d2c0: 61 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31 2c  a,b,c) = (expr1,
d2d0: 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 20  expr2,expr3).** 
d2e0: 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20 3d  Or:    (a,b,c) =
d2f0: 20 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20 46   (SELECT x,y,z F
d300: 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  ROM ....).**.** 
d310: 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66  For each term of
d320: 20 74 68 65 20 76 65 63 74 6f 72 20 61 73 73 69   the vector assi
d330: 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20 6e  gnment, append n
d340: 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68  ew entries to th
d350: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
d360: 6c 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e 20  list pList.  In 
d370: 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 73 75  the case of a su
d380: 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 52 48  bquery on the RH
d390: 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f  S, append.** TK_
d3a0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65 78  SELECT_COLUMN ex
d3b0: 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78  pressions..*/.Ex
d3c0: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
d3d0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65 63  xprListAppendVec
d3e0: 74 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tor(.  Parse *pP
d3f0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
d400: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d410: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
d420: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  pList,       /* 
d430: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
d440: 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62   append. Might b
d450: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69  e NULL */.  IdLi
d460: 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20 20  st *pColumns,   
d470: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61     /* List of na
d480: 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74 68  mes of LHS of th
d490: 65 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a  e assignment */.
d4a0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
d4b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74           /* Vect
d4c0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  or expression to
d4d0: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69   be appended. Mi
d4e0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
d4f0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
d500: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
d510: 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  int n;.  int i;.
d520: 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70    int iFirst = p
d530: 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
d540: 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70 43  xpr : 0;.  /* pC
d550: 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79 20  olumns can only 
d560: 62 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20 61  be NULL due to a
d570: 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f 4d  n OOM but an OOM
d580: 20 77 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a 20   will cause an. 
d590: 20 2a 2a 20 65 78 69 74 20 70 72 69 6f 72 20 74   ** exit prior t
d5a0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  o this routine b
d5b0: 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a  eing invoked */.
d5c0: 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 6f 6c    if( NEVER(pCol
d5d0: 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f 20  umns==0) ) goto 
d5e0: 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72  vector_append_er
d5f0: 72 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ror;.  if( pExpr
d600: 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74 6f  ==0 ) goto vecto
d610: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a  r_append_error;.
d620: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53  .  /* If the RHS
d630: 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20 74 68   is a vector, th
d640: 65 6e 20 77 65 20 63 61 6e 20 69 6d 6d 65 64 69  en we can immedi
d650: 61 74 65 6c 79 20 63 68 65 63 6b 20 74 6f 20 73  ately check to s
d660: 65 65 20 74 68 61 74 20 0a 20 20 2a 2a 20 74 68  ee that .  ** th
d670: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 52 48  e size of the RH
d680: 53 20 61 6e 64 20 4c 48 53 20 6d 61 74 63 68 2e  S and LHS match.
d690: 20 20 42 75 74 20 69 66 20 74 68 65 20 52 48 53    But if the RHS
d6a0: 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 0a 20   is a SELECT, . 
d6b0: 20 2a 2a 20 77 69 6c 64 63 61 72 64 73 20 28 22   ** wildcards ("
d6c0: 2a 22 29 20 69 6e 20 74 68 65 20 72 65 73 75 6c  *") in the resul
d6d0: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
d6e0: 45 43 54 20 6d 75 73 74 20 62 65 20 65 78 70 61  ECT must be expa
d6f0: 6e 64 65 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a  nded before.  **
d700: 20 77 65 20 63 61 6e 20 64 6f 20 74 68 65 20 73   we can do the s
d710: 69 7a 65 20 63 68 65 63 6b 2c 20 73 6f 20 64 65  ize check, so de
d720: 66 65 72 20 74 68 65 20 73 69 7a 65 20 63 68 65  fer the size che
d730: 63 6b 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65  ck until code ge
d740: 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  neration..  */. 
d750: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
d760: 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 43 6f  TK_SELECT && pCo
d770: 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d 28 6e 3d 73  lumns->nId!=(n=s
d780: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
d790: 53 69 7a 65 28 70 45 78 70 72 29 29 20 29 7b 0a  Size(pExpr)) ){.
d7a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d7b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20  Msg(pParse, "%d 
d7c0: 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64  columns assigned
d7d0: 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20   %d values",.   
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20   pColumns->nId, 
d800: 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65 63  n);.    goto vec
d810: 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72  tor_append_error
d820: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30  ;.  }..  for(i=0
d830: 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49  ; i<pColumns->nI
d840: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  d; i++){.    Exp
d850: 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20 73 71  r *pSubExpr = sq
d860: 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63 74  lite3ExprForVect
d870: 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65 2c 20  orField(pParse, 
d880: 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20 20 70  pExpr, i);.    p
d890: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
d8a0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
d8b0: 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53 75 62  rse, pList, pSub
d8c0: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
d8d0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73  List ){.      as
d8e0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
d8f0: 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31 20 29  pr==iFirst+i+1 )
d900: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ;.      pList->a
d910: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
d920: 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e  .zName = pColumn
d930: 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  s->a[i].zName;. 
d940: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61       pColumns->a
d950: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [i].zName = 0;. 
d960: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
d970: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
d980: 64 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  d && pExpr->op==
d990: 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 41 4c 57  TK_SELECT && ALW
d9a0: 41 59 53 28 70 4c 69 73 74 21 3d 30 29 20 29 7b  AYS(pList!=0) ){
d9b0: 0a 20 20 20 20 45 78 70 72 20 2a 70 46 69 72 73  .    Expr *pFirs
d9c0: 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69  t = pList->a[iFi
d9d0: 72 73 74 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  rst].pExpr;.    
d9e0: 61 73 73 65 72 74 28 20 70 46 69 72 73 74 21 3d  assert( pFirst!=
d9f0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
da00: 20 70 46 69 72 73 74 2d 3e 6f 70 3d 3d 54 4b 5f   pFirst->op==TK_
da10: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b  SELECT_COLUMN );
da20: 0a 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 74  .     .    /* St
da30: 6f 72 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ore the SELECT s
da40: 74 61 74 65 6d 65 6e 74 20 69 6e 20 70 52 69 67  tatement in pRig
da50: 68 74 20 73 6f 20 69 74 20 77 69 6c 6c 20 62 65  ht so it will be
da60: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 0a 20 20   deleted when.  
da70: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
da80: 4c 69 73 74 44 65 6c 65 74 65 28 29 20 69 73 20  ListDelete() is 
da90: 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 70 46  called */.    pF
daa0: 69 72 73 74 2d 3e 70 52 69 67 68 74 20 3d 20 70  irst->pRight = p
dab0: 45 78 70 72 3b 0a 20 20 20 20 70 45 78 70 72 20  Expr;.    pExpr 
dac0: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  = 0;..    /* Rem
dad0: 65 6d 62 65 72 20 74 68 65 20 73 69 7a 65 20 6f  ember the size o
dae0: 66 20 74 68 65 20 4c 48 53 20 69 6e 20 69 54 61  f the LHS in iTa
daf0: 62 6c 65 20 73 6f 20 74 68 61 74 20 77 65 20 63  ble so that we c
db00: 61 6e 20 63 68 65 63 6b 20 74 68 61 74 0a 20 20  an check that.  
db10: 20 20 2a 2a 20 74 68 65 20 52 48 53 20 61 6e 64    ** the RHS and
db20: 20 4c 48 53 20 73 69 7a 65 73 20 6d 61 74 63 68   LHS sizes match
db30: 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65 6e   during code gen
db40: 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  eration. */.    
db50: 70 46 69 72 73 74 2d 3e 69 54 61 62 6c 65 20 3d  pFirst->iTable =
db60: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a   pColumns->nId;.
db70: 20 20 7d 0a 0a 76 65 63 74 6f 72 5f 61 70 70 65    }..vector_appe
db80: 6e 64 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  nd_error:.  sqli
db90: 74 65 33 45 78 70 72 55 6e 6d 61 70 41 6e 64 44  te3ExprUnmapAndD
dba0: 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70 45  elete(pParse, pE
dbb0: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  xpr);.  sqlite3I
dbc0: 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
dbd0: 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74  pColumns);.  ret
dbe0: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
dbf0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74  .** Set the sort
dc00: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c   order for the l
dc10: 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74  ast element on t
dc20: 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73  he given ExprLis
dc30: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
dc40: 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72  e3ExprListSetSor
dc50: 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74 20  tOrder(ExprList 
dc60: 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64  *p, int iSortOrd
dc70: 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  er){.  if( p==0 
dc80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
dc90: 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e  rt( SQLITE_SO_UN
dca0: 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c  DEFINED<0 && SQL
dcb0: 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26  ITE_SO_ASC>=0 &&
dcc0: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e   SQLITE_SO_DESC>
dcd0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
dce0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69  ->nExpr>0 );.  i
dcf0: 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20  f( iSortOrder<0 
dd00: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
dd10: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
dd20: 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54  sortOrder==SQLIT
dd30: 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20  E_SO_ASC );.    
dd40: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d  return;.  }.  p-
dd50: 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73  >a[p->nExpr-1].s
dd60: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69  ortOrder = (u8)i
dd70: 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a  SortOrder;.}../*
dd80: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
dd90: 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65  List.a[].zName e
dda0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
ddb0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
ddc0: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
ddd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
dde0: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
ddf0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
de00: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
de10: 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73  or.  But pName s
de20: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
de30: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
de40: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
de50: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
de60: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
de70: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
de80: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
de90: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
dea0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
deb0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
dec0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
ded0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
dee0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
def0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
df00: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
df10: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
df20: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
df30: 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64  Name to be added
df40: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
df50: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
df60: 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74   True to cause t
df70: 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65  he name to be de
df80: 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  quoted */.){.  a
df90: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
dfa0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
dfb0: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
dfc0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
dfd0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
dfe0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
dff0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
e000: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
e010: 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69      pItem = &pLi
e020: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
e030: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
e040: 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d  t( pItem->zName=
e050: 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
e060: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
e070: 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65  DbStrNDup(pParse
e080: 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  ->db, pName->z, 
e090: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69  pName->n);.    i
e0a0: 66 28 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c  f( dequote ) sql
e0b0: 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65  ite3Dequote(pIte
e0c0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  m->zName);.    i
e0d0: 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
e0e0: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ECT ){.      sql
e0f0: 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d  ite3RenameTokenM
e100: 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64  ap(pParse, (void
e110: 2a 29 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  *)pItem->zName, 
e120: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pName);.    }.  
e130: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
e140: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
e150: 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  zSpan element of
e160: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e170: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
e180: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
e190: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
e1a0: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
e1b0: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
e1c0: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
e1d0: 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76  pSpan should nev
e1e0: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
e1f0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
e200: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
e210: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
e220: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
e230: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
e240: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
e250: 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72  stSetSpan(.  Par
e260: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e270: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e280: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
e290: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
e2a0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
e2b0: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
e2c0: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73   span. */.  cons
e2d0: 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c 20  t char *zStart, 
e2e0: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
e2f0: 74 68 65 20 73 70 61 6e 20 2a 2f 0a 20 20 63 6f  the span */.  co
e300: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20  nst char *zEnd  
e310: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
e320: 74 68 65 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a 20  the span */.){. 
e330: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
e340: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
e350: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
e360: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e370: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  d!=0 );.  if( pL
e380: 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ist ){.    struc
e390: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
e3a0: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
e3b0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
e3c0: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
e3d0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
e3e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
e3f0: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
e400: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
e410: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
e420: 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a  3DbSpanDup(db, z
e430: 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20  Start, zEnd);.  
e440: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
e450: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
e460: 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e  t pEList contain
e470: 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d  s more than iLim
e480: 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20  it elements,.** 
e490: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
e4a0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
e4b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e4c0: 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
e4d0: 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70  ngth(.  Parse *p
e4e0: 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
e4f0: 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e  t *pEList,.  con
e500: 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74  st char *zObject
e510: 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70  .){.  int mx = p
e520: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
e530: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
e540: 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61  OLUMN];.  testca
e550: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
e560: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20  List->nExpr==mx 
e570: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
e580: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
e590: 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a  >nExpr==mx+1 );.
e5a0: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
e5b0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78  pEList->nExpr>mx
e5c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
e5d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e5e0: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
e5f0: 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63  s in %s", zObjec
e600: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
e610: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
e620: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
e630: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  t..*/.static SQL
e640: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
e650: 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65  d exprListDelete
e660: 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  NN(sqlite3 *db, 
e670: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
e680: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73  {.  int i = pLis
e690: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 74 72 75  t->nExpr;.  stru
e6a0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
e6b0: 20 2a 70 49 74 65 6d 20 3d 20 20 70 4c 69 73 74   *pItem =  pList
e6c0: 2d 3e 61 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ->a;.  assert( p
e6d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
e6e0: 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
e6f0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
e700: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
e710: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e720: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  e(db, pItem->zNa
e730: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
e740: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
e750: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
e760: 74 65 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  tem++;.  }while(
e770: 20 2d 2d 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69   --i>0 );.  sqli
e780: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
e790: 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73  pList);.}.void s
e7a0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
e7b0: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
e7c0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
e7d0: 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20  t){.  if( pList 
e7e0: 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65  ) exprListDelete
e7f0: 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
e800: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
e810: 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f 66  he bitwise-OR of
e820: 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73 20   all Expr.flags 
e830: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67 69  fields in the gi
e840: 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e  ven.** ExprList.
e850: 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 45  .*/.u32 sqlite3E
e860: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e  xprListFlags(con
e870: 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  st ExprList *pLi
e880: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
e890: 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73  u32 m = 0;.  ass
e8a0: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
e8b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
e8c0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
e8d0: 7b 0a 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  {.     Expr *pEx
e8e0: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
e8f0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 61 73 73  .pExpr;.     ass
e900: 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
e910: 0a 20 20 20 20 20 6d 20 7c 3d 20 70 45 78 70 72  .     m |= pExpr
e920: 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72  ->flags;.  }.  r
e930: 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn m;.}../*.*
e940: 2a 20 54 68 69 73 20 69 73 20 61 20 53 45 4c 45  * This is a SELE
e950: 43 54 2d 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b  CT-node callback
e960: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
e970: 69 6f 6e 20 77 61 6c 6b 65 72 20 74 68 61 74 0a  ion walker that.
e980: 2a 2a 20 61 6c 77 61 79 73 20 22 66 61 69 6c 73  ** always "fails
e990: 22 2e 20 20 42 79 20 22 66 61 69 6c 22 20 69 6e  ".  By "fail" in
e9a0: 20 74 68 69 73 20 63 61 73 65 2c 20 77 65 20 6d   this case, we m
e9b0: 65 61 6e 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b  ean set.** pWalk
e9c0: 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72  er->eCode to zer
e9d0: 6f 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a  o and abort..**.
e9e0: 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b  ** This callback
e9f0: 20 69 73 20 75 73 65 64 20 62 79 20 6d 75 6c 74   is used by mult
ea00: 69 70 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20  iple expression 
ea10: 77 61 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20  walkers..*/.int 
ea20: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
ea30: 6b 46 61 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57  kFail(Walker *pW
ea40: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e  alker, Select *N
ea50: 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
ea60: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
ea70: 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  sed);.  pWalker-
ea80: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65  >eCode = 0;.  re
ea90: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
eaa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
eab0: 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e  input expression
eac0: 20 69 73 20 61 6e 20 49 44 20 77 69 74 68 20 74   is an ID with t
ead0: 68 65 20 6e 61 6d 65 20 22 74 72 75 65 22 20 6f  he name "true" o
eae0: 72 20 22 66 61 6c 73 65 22 0a 2a 2a 20 74 68 65  r "false".** the
eaf0: 6e 20 63 6f 6e 76 65 72 74 20 69 74 20 69 6e 74  n convert it int
eb00: 6f 20 61 6e 20 54 4b 5f 54 52 55 45 46 41 4c 53  o an TK_TRUEFALS
eb10: 45 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20  E term.  Return 
eb20: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20 74  non-zero if.** t
eb30: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 68 61  he conversion ha
eb40: 70 70 65 6e 65 64 2c 20 61 6e 64 20 7a 65 72 6f  ppened, and zero
eb50: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
eb60: 6f 6e 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e  on is unaltered.
eb70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
eb80: 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65  xprIdToTrueFalse
eb90: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
eba0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
ebb0: 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 78  op==TK_ID || pEx
ebc0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  pr->op==TK_STRIN
ebd0: 47 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72  G );.  if( !Expr
ebe0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
ebf0: 72 2c 20 45 50 5f 51 75 6f 74 65 64 29 0a 20 20  r, EP_Quoted).  
ec00: 20 26 26 20 28 73 71 6c 69 74 65 33 53 74 72 49   && (sqlite3StrI
ec10: 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Cmp(pExpr->u.zTo
ec20: 6b 65 6e 2c 20 22 74 72 75 65 22 29 3d 3d 30 0a  ken, "true")==0.
ec30: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
ec40: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
ec50: 75 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c 73 65  u.zToken, "false
ec60: 22 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  ")==0).  ){.    
ec70: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 54  pExpr->op = TK_T
ec80: 52 55 45 46 41 4c 53 45 3b 0a 20 20 20 20 45 78  RUEFALSE;.    Ex
ec90: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
eca0: 78 70 72 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  xpr, pExpr->u.zT
ecb0: 6f 6b 65 6e 5b 34 5d 3d 3d 30 20 3f 20 45 50 5f  oken[4]==0 ? EP_
ecc0: 49 73 54 72 75 65 20 3a 20 45 50 5f 49 73 46 61  IsTrue : EP_IsFa
ecd0: 6c 73 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  lse);.    return
ece0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
ecf0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   0;.}../*.** The
ed00: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
ed10: 65 20 61 20 54 4b 5f 54 52 55 45 46 41 4c 53 45  e a TK_TRUEFALSE
ed20: 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 52 65 74   Expr node.  Ret
ed30: 75 72 6e 20 31 20 69 66 20 69 74 20 69 73 20 54  urn 1 if it is T
ed40: 52 55 45 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  RUE.** and 0 if 
ed50: 69 74 20 69 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a  it is FALSE..*/.
ed60: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 54  int sqlite3ExprT
ed70: 72 75 74 68 56 61 6c 75 65 28 63 6f 6e 73 74 20  ruthValue(const 
ed80: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
ed90: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
eda0: 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 20  p==TK_TRUEFALSE 
edb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
edc0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
edd0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 74 72 75  r->u.zToken,"tru
ede0: 65 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  e")==0.       ||
edf0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
ee00: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
ee10: 22 66 61 6c 73 65 22 29 3d 3d 30 20 29 3b 0a 20  "false")==0 );. 
ee20: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 75   return pExpr->u
ee30: 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b 0a 7d  .zToken[4]==0;.}
ee40: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ../*.** If pExpr
ee50: 20 69 73 20 61 6e 20 41 4e 44 20 6f 72 20 4f 52   is an AND or OR
ee60: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 72 79   expression, try
ee70: 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 69 74 20   to simplify it 
ee80: 62 79 20 65 6c 69 6d 69 6e 61 74 69 6e 67 0a 2a  by eliminating.*
ee90: 2a 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  * terms that are
eea0: 20 61 6c 77 61 79 73 20 74 72 75 65 20 6f 72 20   always true or 
eeb0: 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 20 74  false.  Return t
eec0: 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 65 78  he simplified ex
eed0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 4f 72 20  pression..** Or 
eee0: 72 65 74 75 72 6e 20 74 68 65 20 6f 72 69 67 69  return the origi
eef0: 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69  nal expression i
ef00: 66 20 6e 6f 20 73 69 6d 70 6c 69 66 69 63 61 74  f no simplificat
ef10: 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 2e  ion is possible.
ef20: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a  .**.** Examples:
ef30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 78 3c 31 30  .**.**     (x<10
ef40: 29 20 41 4e 44 20 74 72 75 65 20 20 20 20 20 20  ) AND true      
ef50: 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 28            =>   (
ef60: 78 3c 31 30 29 0a 2a 2a 20 20 20 20 20 28 78 3c  x<10).**     (x<
ef70: 31 30 29 20 41 4e 44 20 66 61 6c 73 65 20 20 20  10) AND false   
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
ef90: 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 28 78   false.**     (x
efa0: 3c 31 30 29 20 41 4e 44 20 28 79 3d 32 32 20 4f  <10) AND (y=22 O
efb0: 52 20 66 61 6c 73 65 29 20 20 20 20 20 3d 3e 20  R false)     => 
efc0: 20 20 28 78 3c 31 30 29 20 41 4e 44 20 28 79 3d    (x<10) AND (y=
efd0: 32 32 29 0a 2a 2a 20 20 20 20 20 28 78 3c 31 30  22).**     (x<10
efe0: 29 20 41 4e 44 20 28 79 3d 32 32 20 4f 52 20 74  ) AND (y=22 OR t
eff0: 72 75 65 29 20 20 20 20 20 20 3d 3e 20 20 20 28  rue)      =>   (
f000: 78 3c 31 30 29 0a 2a 2a 20 20 20 20 20 28 79 3d  x<10).**     (y=
f010: 32 32 29 20 4f 52 20 74 72 75 65 20 20 20 20 20  22) OR true     
f020: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
f030: 20 74 72 75 65 0a 2a 2f 0a 45 78 70 72 20 2a 73   true.*/.Expr *s
f040: 71 6c 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69  qlite3ExprSimpli
f050: 66 69 65 64 41 6e 64 4f 72 28 45 78 70 72 20 2a  fiedAndOr(Expr *
f060: 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74  pExpr){.  assert
f070: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
f080: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
f090: 4b 5f 41 4e 44 20 7c 7c 20 70 45 78 70 72 2d 3e  K_AND || pExpr->
f0a0: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20  op==TK_OR ){.   
f0b0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
f0c0: 73 71 6c 69 74 65 33 45 78 70 72 53 69 6d 70 6c  sqlite3ExprSimpl
f0d0: 69 66 69 65 64 41 6e 64 4f 72 28 70 45 78 70 72  ifiedAndOr(pExpr
f0e0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 45  ->pRight);.    E
f0f0: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c  xpr *pLeft = sql
f100: 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66 69  ite3ExprSimplifi
f110: 65 64 41 6e 64 4f 72 28 70 45 78 70 72 2d 3e 70  edAndOr(pExpr->p
f120: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 45  Left);.    if( E
f130: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 4c  xprAlwaysTrue(pL
f140: 65 66 74 29 20 7c 7c 20 45 78 70 72 41 6c 77 61  eft) || ExprAlwa
f150: 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20  ysFalse(pRight) 
f160: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  ){.      pExpr =
f170: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
f180: 4e 44 20 3f 20 70 52 69 67 68 74 20 3a 20 70 4c  ND ? pRight : pL
f190: 65 66 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eft;.    }else i
f1a0: 66 28 20 45 78 70 72 41 6c 77 61 79 73 54 72 75  f( ExprAlwaysTru
f1b0: 65 28 70 52 69 67 68 74 29 20 7c 7c 20 45 78 70  e(pRight) || Exp
f1c0: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65  rAlwaysFalse(pLe
f1d0: 66 74 29 20 29 7b 0a 20 20 20 20 20 20 70 45 78  ft) ){.      pEx
f1e0: 70 72 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  pr = pExpr->op==
f1f0: 54 4b 5f 41 4e 44 20 3f 20 70 4c 65 66 74 20 3a  TK_AND ? pLeft :
f200: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20   pRight;.    }. 
f210: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
f220: 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  r;.}.../*.** The
f230: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
f240: 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73  Walker callbacks
f250: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65   used to check e
f260: 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a  xpressions to.**
f270: 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72 65   see if they are
f280: 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20   "constant" for 
f290: 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  some definition 
f2a0: 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68  of constant.  Th
f2b0: 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64  e.** Walker.eCod
f2c0: 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e  e value determin
f2d0: 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 22  es the type of "
f2e0: 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65  constant" we are
f2f0: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e   looking.** for.
f300: 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c  .**.** These cal
f310: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61  lback routines a
f320: 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  re used to imple
f330: 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ment the followi
f340: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71  ng:.**.**     sq
f350: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
f360: 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20  ant()           
f370: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
f380: 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20  eCode==1.**     
f390: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
f3a0: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20  stantNotJoin()  
f3b0: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
f3c0: 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20  ->eCode==2.**   
f3d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54    sqlite3ExprIsT
f3e0: 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20  ableConstant()  
f3f0: 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b             pWalk
f400: 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20  er->eCode==3.** 
f410: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
f420: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
f430: 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57 61  ion()        pWa
f440: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f  lker->eCode==4 o
f450: 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c  r 5.**.** In all
f460: 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c   cases, the call
f470: 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72  backs set Walker
f480: 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f  .eCode=0 and abo
f490: 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  rt if the expres
f4a0: 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64  sion.** is found
f4b0: 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e   to not be a con
f4c0: 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stant..**.** The
f4d0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
f4e0: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
f4f0: 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  () is used for e
f500: 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73  valuating expres
f510: 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52  sions.** in a CR
f520: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
f530: 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65  ment.  The Walke
f540: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73  r.eCode value is
f550: 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a   5 when parsing.
f560: 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  ** an existing s
f570: 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e  chema and 4 when
f580: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65   processing a ne
f590: 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  w statement.  A 
f5a0: 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74  bound.** paramet
f5b0: 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72 72  er raises an err
f5c0: 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65  or for new state
f5d0: 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69  ments, but is si
f5e0: 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64  lently converted
f5f0: 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20  .** to NULL for 
f600: 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73  existing schemas
f610: 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73  .  This allows s
f620: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
f630: 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e  les that .** con
f640: 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72  tain a bound par
f650: 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20 74  ameter because t
f660: 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61 74  hey were generat
f670: 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73  ed by older vers
f680: 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
f690: 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20 62  e to be parsed b
f6a0: 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  y newer versions
f6b0: 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f   of SQLite witho
f6c0: 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20  ut raising a.** 
f6d0: 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61  malformed schema
f6e0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
f6f0: 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73  c int exprNodeIs
f700: 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20  Constant(Walker 
f710: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
f720: 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66  pExpr){..  /* If
f730: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
f740: 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65  is 2 then any te
f750: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
f760: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20  sion that comes 
f770: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e  from.  ** the ON
f780: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
f790: 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e  s of a left join
f7a0: 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68   disqualifies th
f7b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  e expression.  *
f7c0: 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e  * from being con
f7d0: 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74  sidered constant
f7e0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b  . */.  if( pWalk
f7f0: 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20  er->eCode==2 && 
f800: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f810: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
f820: 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b  in) ){.    pWalk
f830: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
f840: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
f850: 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  ort;.  }..  swit
f860: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
f870: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72  .    /* Consider
f880: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65   functions to be
f890: 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c   constant if all
f8a0: 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73   their arguments
f8b0: 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20   are constant.  
f8c0: 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20    ** and either 
f8d0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
f8e0: 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75  4 or 5 or the fu
f8f0: 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20  nction has the. 
f900: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e     ** SQLITE_FUN
f910: 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f  C_CONST flag. */
f920: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
f930: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
f940: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e   pWalker->eCode>
f950: 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =4 || ExprHasPro
f960: 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43  perty(pExpr,EP_C
f970: 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20  onstFunc) ){.   
f980: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
f990: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  Continue;.      
f9a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
f9b0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
f9c0: 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
f9d0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
f9e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
f9f0: 5f 49 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  _ID:.      /* Co
fa00: 6e 76 65 72 74 20 22 74 72 75 65 22 20 6f 72 20  nvert "true" or 
fa10: 22 66 61 6c 73 65 22 20 69 6e 20 61 20 44 45 46  "false" in a DEF
fa20: 41 55 4c 54 20 63 6c 61 75 73 65 20 69 6e 74 6f  AULT clause into
fa30: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 61 70   the.      ** ap
fa40: 70 72 6f 70 72 69 61 74 65 20 54 4b 5f 54 52 55  propriate TK_TRU
fa50: 45 46 41 4c 53 45 20 6f 70 65 72 61 74 6f 72 20  EFALSE operator 
fa60: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
fa70: 69 74 65 33 45 78 70 72 49 64 54 6f 54 72 75 65  ite3ExprIdToTrue
fa80: 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
fa90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
faa0: 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
fab0: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  }.      /* Fall 
fac0: 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65  thru */.    case
fad0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
fae0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
faf0: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
fb00: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
fb10: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
fb20: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
fb30: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
fb40: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
fb50: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
fb60: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
fb70: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
fb80: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  TION );.      te
fb90: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
fba0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
fbb0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
fbc0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
fbd0: 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  xpr, EP_FixedCol
fbe0: 29 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 65 43  ) && pWalker->eC
fbf0: 6f 64 65 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  ode!=2 ){.      
fc00: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
fc10: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
fc20: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
fc30: 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45  ->eCode==3 && pE
fc40: 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61  xpr->iTable==pWa
fc50: 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a  lker->u.iCur ){.
fc60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
fc70: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
fc80: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
fc90: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
fca0: 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c    case TK_IF_NUL
fcb0: 4c 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20  L_ROW:.    case 
fcc0: 54 4b 5f 52 45 47 49 53 54 45 52 3a 0a 20 20 20  TK_REGISTER:.   
fcd0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
fce0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
fcf0: 54 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  TER );.      tes
fd00: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
fd10: 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  ==TK_IF_NULL_ROW
fd20: 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65   );.      pWalke
fd30: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
fd40: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
fd50: 62 6f 72 74 3b 0a 20 20 20 20 63 61 73 65 20 54  bort;.    case T
fd60: 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20  K_VARIABLE:.    
fd70: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65    if( pWalker->e
fd80: 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20  Code==5 ){.     
fd90: 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63     /* Silently c
fda0: 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72  onvert bound par
fdb0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70 70  ameters that app
fdc0: 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52  ear inside of CR
fdd0: 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20  EATE.        ** 
fde0: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20  statements into 
fdf0: 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73  a NULL when pars
fe00: 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20 73  ing the CREATE s
fe10: 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75  tatement text ou
fe20: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  t.        ** of 
fe30: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
fe40: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
fe50: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
fe60: 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65  K_NULL;.      }e
fe70: 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d  lse if( pWalker-
fe80: 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20  >eCode==4 ){.   
fe90: 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20       /* A bound 
fea0: 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43  parameter in a C
feb0: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
fec0: 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20  that originates 
fed0: 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20  from.        ** 
fee0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
fef0: 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f  ) causes an erro
ff00: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61  r */.        pWa
ff10: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
ff20: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ff30: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
ff40: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
ff50: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20   through */.    
ff60: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74  default:.      t
ff70: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
ff80: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
ff90: 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63   /* sqlite3Selec
ffa0: 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61  tWalkFail() disa
ffb0: 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 74  llows */.      t
ffc0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
ffd0: 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
ffe0: 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63   /* sqlite3Selec
fff0: 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61  tWalkFail() disa
10000 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 72  llows */.      r
10010 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
10020 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ue;.  }.}.static
10030 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74   int exprIsConst
10040 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e  (Expr *p, int in
10050 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72  itFlag, int iCur
10060 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
10070 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46   w.eCode = initF
10080 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
10090 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
100a0 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
100b0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
100c0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
100d0 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66  WalkFail;.#ifdef
100e0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
100f0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
10100 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  k2 = sqlite3Sele
10110 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23  ctWalkAssert2;.#
10120 65 6e 64 69 66 0a 20 20 77 2e 75 2e 69 43 75 72  endif.  w.u.iCur
10130 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74   = iCur;.  sqlit
10140 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
10150 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
10160 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  ode;.}../*.** Wa
10170 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
10180 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
10190 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
101a0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
101b0 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
101c0 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
101d0 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
101e0 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  ion calls..**.**
101f0 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
10200 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
10210 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
10220 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
10230 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
10240 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
10250 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
10260 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
10270 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
10280 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
10290 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
102a0 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
102b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
102c0 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29  IsConst(p, 1, 0)
102d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
102e0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
102f0 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
10300 7a 65 72 6f 20 69 66 0a 2a 2a 0a 2a 2a 20 20 20  zero if.**.**   
10310 28 31 29 20 74 68 65 20 65 78 70 72 65 73 73 69  (1) the expressi
10320 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20  on is constant, 
10330 61 6e 64 0a 2a 2a 20 20 20 28 32 29 20 74 68 65  and.**   (2) the
10340 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
10350 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68   originate in th
10360 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
10370 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  ause.**       of
10380 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e   a LEFT JOIN, an
10390 64 0a 2a 2a 20 20 20 28 33 29 20 74 68 65 20 65  d.**   (3) the e
103a0 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
103b0 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 45  ot contain any E
103c0 50 5f 46 69 78 65 64 43 6f 6c 20 54 4b 5f 43 4f  P_FixedCol TK_CO
103d0 4c 55 4d 4e 0a 2a 2a 20 20 20 20 20 20 20 6f 70  LUMN.**       op
103e0 65 72 61 6e 64 73 20 63 72 65 61 74 65 64 20 62  erands created b
103f0 79 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 70  y the constant p
10400 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d  ropagation optim
10410 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  ization..**.** W
10420 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10430 20 72 65 74 75 72 6e 73 20 74 72 75 65 2c 20 69   returns true, i
10440 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  t indicates that
10450 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
10460 2a 2a 20 63 61 6e 20 62 65 20 61 64 64 65 64 20  ** can be added 
10470 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70  to the pParse->p
10480 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 20 61  ConstExpr list a
10490 6e 64 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63  nd evaluated onc
104a0 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 72  e when.** the pr
104b0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
104c0 20 73 74 61 72 74 73 20 75 70 2e 20 20 53 65 65   starts up.  See
104d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
104e0 41 74 49 6e 69 74 28 29 2e 0a 2a 2f 0a 69 6e 74  AtInit()..*/.int
104f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
10500 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78  nstantNotJoin(Ex
10510 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
10520 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
10530 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2, 0);.}../*.** 
10540 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
10550 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
10560 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
10570 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
10580 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61  onstant.** for a
10590 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66  ny single row of
105a0 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
105b0 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e  cursor iCur.  In
105c0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
105d0 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
105e0 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74  must not refer t
105f0 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d  o any non-determ
10600 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e  inistic function
10610 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c   nor any.** tabl
10620 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75  e other than iCu
10630 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
10640 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
10650 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  tant(Expr *p, in
10660 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72  t iCur){.  retur
10670 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
10680 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f   3, iCur);.}.../
10690 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b  *.** sqlite3Walk
106a0 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20  Expr() callback 
106b0 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 45  used by sqlite3E
106c0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47  xprIsConstantOrG
106d0 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74 61  roupBy()..*/.sta
106e0 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
106f0 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75  IsConstantOrGrou
10700 70 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  pBy(Walker *pWal
10710 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
10720 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
10730 47 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b 65  GroupBy = pWalke
10740 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a 20  r->u.pGroupBy;. 
10750 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43 68   int i;..  /* Ch
10760 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20  eck if pExpr is 
10770 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e 79  identical to any
10780 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e 20   GROUP BY term. 
10790 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 0a  If so, consider.
107a0 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e 74    ** it constant
107b0 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
107c0 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
107d0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
107e0 70 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42 79  pr *p = pGroupBy
107f0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
10800 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
10810 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70  rCompare(0, pExp
10820 72 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a 20  r, p, -1)<2 ){. 
10830 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
10840 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
10850 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c 6b  rNNCollSeq(pWalk
10860 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b 0a  er->pParse, p);.
10870 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
10880 33 49 73 42 69 6e 61 72 79 28 70 43 6f 6c 6c 29  3IsBinary(pColl)
10890 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
108a0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
108b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
108c0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70  .  /* Check if p
108d0 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73 65  Expr is a sub-se
108e0 6c 65 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f 6e  lect. If so, con
108f0 73 69 64 65 72 20 69 74 20 76 61 72 69 61 62 6c  sider it variabl
10900 65 2e 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72  e. */.  if( Expr
10910 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
10920 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
10930 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
10940 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
10950 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
10960 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
10970 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
10980 6e 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70  nt(pWalker, pExp
10990 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  r);.}../*.** Wal
109a0 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  k the expression
109b0 20 74 72 65 65 20 70 61 73 73 65 64 20 61 73 20   tree passed as 
109c0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
109d0 6e 74 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  nt. Return non-z
109e0 65 72 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65 78  ero.** if the ex
109f0 70 72 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73 74  pression consist
10a00 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f  s entirely of co
10a10 6e 73 74 61 6e 74 73 20 6f 72 20 63 6f 70 69 65  nstants or copie
10a20 73 20 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20 69  s of terms .** i
10a30 6e 20 70 47 72 6f 75 70 42 79 20 74 68 61 74 20  n pGroupBy that 
10a40 73 6f 72 74 20 77 69 74 68 20 74 68 65 20 42 49  sort with the BI
10a50 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  NARY collation s
10a60 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
10a70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
10a80 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
10a90 20 69 66 20 61 20 74 65 72 6d 20 6f 66 20 74 68   if a term of th
10aa0 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
10ab0 63 61 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f 74  can.** be promot
10ac0 65 64 20 69 6e 74 6f 20 74 68 65 20 57 48 45 52  ed into the WHER
10ad0 45 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72  E clause.  In or
10ae0 64 65 72 20 66 6f 72 20 73 75 63 68 20 61 20 70  der for such a p
10af0 72 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72 6b  romotion to work
10b00 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
10b10 66 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  f the HAVING cla
10b20 75 73 65 20 74 65 72 6d 20 6d 75 73 74 20 62 65  use term must be
10b30 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 61 6c   the same for al
10b40 6c 20 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a 20  l members of.** 
10b50 61 20 22 67 72 6f 75 70 22 2e 20 20 54 68 65 20  a "group".  The 
10b60 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74  requirement that
10b70 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
10b80 72 6d 20 6d 75 73 74 20 62 65 20 42 49 4e 41 52  rm must be BINAR
10b90 59 0a 2a 2a 20 61 73 73 75 6d 65 73 20 74 68 61  Y.** assumes tha
10ba0 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c 61  t no other colla
10bb0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69  ting sequence wi
10bc0 6c 6c 20 68 61 76 65 20 61 20 66 69 6e 65 72 2d  ll have a finer-
10bd0 67 72 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75 70  grained.** group
10be0 69 6e 67 20 74 68 61 6e 20 62 69 6e 61 72 79 2e  ing than binary.
10bf0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
10c00 20 28 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62 69   (A=B COLLATE bi
10c10 6e 61 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a 2a  nary) implies.**
10c20 20 41 3d 42 20 69 6e 20 65 76 65 72 79 20 6f 74   A=B in every ot
10c30 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  her collating se
10c40 71 75 65 6e 63 65 2e 20 20 54 68 65 20 72 65 71  quence.  The req
10c50 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68  uirement that th
10c60 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 62 65  e.** GROUP BY be
10c70 20 42 49 4e 41 52 59 20 69 73 20 73 74 72 69 63   BINARY is stric
10c80 74 65 72 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ter than necessa
10c90 72 79 2e 20 20 49 74 20 77 6f 75 6c 64 20 61 6c  ry.  It would al
10ca0 73 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72  so work.** to pr
10cb0 6f 6d 6f 74 65 20 48 41 56 49 4e 47 20 63 6c 61  omote HAVING cla
10cc0 75 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68  uses that use th
10cd0 65 20 73 61 6d 65 20 61 6c 74 65 72 6e 61 74 69  e same alternati
10ce0 76 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  ve collating.** 
10cf0 73 65 71 75 65 6e 63 65 20 61 73 20 74 68 65 20  sequence as the 
10d00 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2c 20 62  GROUP BY term, b
10d10 75 74 20 74 68 61 74 20 69 73 20 6d 75 63 68 20  ut that is much 
10d20 68 61 72 64 65 72 20 74 6f 20 63 68 65 63 6b 2c  harder to check,
10d30 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20  .** alternative 
10d40 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
10d50 63 65 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e  ces are uncommon
10d60 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 6f 6e  , and this is on
10d70 6c 79 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a  ly an.** optimiz
10d80 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61 6b  ation, so we tak
10d90 65 20 74 68 65 20 65 61 73 79 20 77 61 79 20 6f  e the easy way o
10da0 75 74 20 61 6e 64 20 73 69 6d 70 6c 79 20 72 65  ut and simply re
10db0 71 75 69 72 65 20 74 68 65 0a 2a 2a 20 47 52 4f  quire the.** GRO
10dc0 55 50 20 42 59 20 74 6f 20 75 73 65 20 74 68 65  UP BY to use the
10dd0 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e   BINARY collatin
10de0 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69  g sequence..*/.i
10df0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
10e00 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
10e10 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
10e20 20 45 78 70 72 20 2a 70 2c 20 45 78 70 72 4c 69   Expr *p, ExprLi
10e30 73 74 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a 20  st *pGroupBy){. 
10e40 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65   Walker w;.  w.e
10e50 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45  Code = 1;.  w.xE
10e60 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
10e70 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
10e80 4f 72 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 78  OrGroupBy;.  w.x
10e90 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
10ea0 20 30 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75 70   0;.  w.u.pGroup
10eb0 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
10ec0 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
10ed0 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
10ee0 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
10ef0 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a  return w.eCode;.
10f00 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
10f10 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
10f20 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
10f30 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
10f40 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
10f50 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f  .** or a functio
10f60 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73  n call with cons
10f70 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
10f80 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66   Return and 0 if
10f90 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e   there.** are an
10fa0 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  y variables..**.
10fb0 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
10fc0 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
10fd0 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
10fe0 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
10ff0 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
11000 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
11010 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
11020 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
11030 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
11040 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
11050 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
11060 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
11070 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75 38  tion(Expr *p, u8
11080 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73 65   isInit){.  asse
11090 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  rt( isInit==0 ||
110a0 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20   isInit==1 );.  
110b0 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
110c0 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20  st(p, 4+isInit, 
110d0 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  0);.}..#ifdef SQ
110e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
110f0 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57  OR_HINTS./*.** W
11100 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
11110 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
11120 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
11130 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ion contains a.*
11140 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20 73 6f  * subquery of so
11150 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e  me kind.  Return
11160 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20   0 if there are 
11170 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  no subqueries..*
11180 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
11190 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72  rContainsSubquer
111a0 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61  y(Expr *p){.  Wa
111b0 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64  lker w;.  w.eCod
111c0 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72  e = 1;.  w.xExpr
111d0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
111e0 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
111f0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
11200 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ack = sqlite3Sel
11210 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66  ectWalkFail;.#if
11220 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
11230 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
11240 62 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53  back2 = sqlite3S
11250 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32  electWalkAssert2
11260 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
11270 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
11280 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
11290 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  ode==0;.}.#endif
112a0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
112b0 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
112c0 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
112d0 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
112e0 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
112f0 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
11300 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
11310 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
11320 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
11330 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
11340 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
11350 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
11360 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
11370 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
11380 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
11390 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
113a0 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
113b0 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
113c0 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
113d0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
113e0 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
113f0 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20  *pValue){.  int 
11400 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 4e 45  rc = 0;.  if( NE
11410 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75  VER(p==0) ) retu
11420 72 6e 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74  rn 0;  /* Used t
11430 6f 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f  o only happen fo
11440 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a  llowing on OOM *
11450 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78  /..  /* If an ex
11460 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69  pression is an i
11470 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74  nteger literal t
11480 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73 69  hat fits in a si
11490 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a  gned 32-bit.  **
114a0 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
114b0 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
114c0 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  lag will have al
114d0 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a  ready been set *
114e0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  /.  assert( p->o
114f0 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
11500 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f   (p->flags & EP_
11510 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20  IntValue)!=0.   
11520 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
11530 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e  e3GetInt32(p->u.
11540 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20  zToken, &rc)==0 
11550 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61  );..  if( p->fla
11560 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
11570 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20   ){.    *pValue 
11580 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  = p->u.iValue;. 
11590 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
115a0 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
115b0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
115c0 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
115d0 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  c = sqlite3ExprI
115e0 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
115f0 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  t, pValue);.    
11600 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11610 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
11620 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
11630 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
11640 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
11650 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29  (p->pLeft, &v) )
11660 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
11670 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34  ( v!=(-214748364
11680 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  7-1) );.        
11690 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
116a0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
116b0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
116c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
116d0 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
116e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
116f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  ./*.** Return FA
11700 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20  LSE if there is 
11710 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
11720 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
11730 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n be NULL..**.**
11740 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
11750 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  on might be NULL
11760 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
11770 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d  ssion is too com
11780 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20  plex.** to tell 
11790 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a  return TRUE.  .*
117a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
117b0 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20  e is used as an 
117c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
117d0 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20   skip OP_IsNull 
117e0 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20  opcodes.** when 
117f0 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76  we know that a v
11800 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  alue cannot be N
11810 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66  ULL.  Hence, a f
11820 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a  alse positive.**
11830 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45   (returning TRUE
11840 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68   when in fact th
11850 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
11860 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20   never be NULL) 
11870 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d  might.** be a sm
11880 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  all performance 
11890 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72  hit but is other
118a0 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20  wise harmless.  
118b0 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  On the other.** 
118c0 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65  hand, a false ne
118d0 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e  gative (returnin
118e0 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65  g FALSE when the
118f0 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65   result could be
11900 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c   NULL).** will l
11910 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
11920 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  an incorrect ans
11930 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e  wer.  So when in
11940 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a   doubt, return.*
11950 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73  * TRUE..*/.int s
11960 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
11970 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  ull(const Expr *
11980 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77  p){.  u8 op;.  w
11990 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
119a0 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
119b0 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 0a 20 20 20  TK_UMINUS ){.   
119c0 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
119d0 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
119e0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
119f0 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
11a00 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
11a10 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
11a20 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  K_INTEGER:.    c
11a30 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
11a40 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
11a50 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  :.    case TK_BL
11a60 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
11a70 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   0;.    case TK_
11a80 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 72 65  COLUMN:.      re
11a90 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70  turn ExprHasProp
11aa0 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65  erty(p, EP_CanBe
11ab0 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20  Null) ||.       
11ac0 20 20 20 20 20 20 70 2d 3e 79 2e 70 54 61 62 3d        p->y.pTab=
11ad0 3d 30 20 7c 7c 20 20 2f 2a 20 52 65 66 65 72 65  =0 ||  /* Refere
11ae0 6e 63 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 6f 66  nce to column of
11af0 20 69 6e 64 65 78 20 6f 6e 20 65 78 70 72 65 73   index on expres
11b00 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  sion */.        
11b10 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e       (p->iColumn
11b20 3e 3d 30 20 26 26 20 70 2d 3e 79 2e 70 54 61 62  >=0 && p->y.pTab
11b30 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d  ->aCol[p->iColum
11b40 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a  n].notNull==0);.
11b50 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
11b60 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
11b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11b80 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
11b90 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
11ba0 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63   a constant whic
11bb0 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e  h would be.** un
11bc0 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66  changed by OP_Af
11bd0 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20  finity with the 
11be0 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69  affinity given i
11bf0 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  n the second.** 
11c00 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
11c10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
11c20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
11c30 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69  e if the OP_Affi
11c40 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  nity operation.*
11c50 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  * can be omitted
11c60 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  .  When in doubt
11c70 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20   return FALSE.  
11c80 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  A false negative
11c90 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  .** is harmless.
11ca0 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69    A false positi
11cb0 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e  ve, however, can
11cc0 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77   result in the w
11cd0 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a  rong.** answer..
11ce0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
11cf0 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
11d00 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78  yChange(const Ex
11d10 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29  pr *p, char aff)
11d20 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28  {.  u8 op;.  if(
11d30 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
11d40 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31  _BLOB ) return 1
11d50 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
11d60 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
11d70 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
11d80 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
11d90 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
11da0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
11db0 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
11dc0 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
11dd0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
11de0 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
11df0 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
11e00 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
11e10 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
11e20 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
11e30 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
11e40 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65  LOAT: {.      re
11e50 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
11e60 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66  _AFF_REAL || aff
11e70 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
11e80 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERIC;.    }.    
11e90 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
11ea0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
11eb0 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
11ec0 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  EXT;.    }.    c
11ed0 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
11ee0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
11ef0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
11f00 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
11f10 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62   assert( p->iTab
11f20 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63  le>=0 );  /* p c
11f30 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66  annot be part of
11f40 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61   a CHECK constra
11f50 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  int */.      ret
11f60 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  urn p->iColumn<0
11f70 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61  .          && (a
11f80 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
11f90 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
11fa0 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
11fb0 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  C);.    }.    de
11fc0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
11fd0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
11fe0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
11ff0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
12000 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61  iven string is a
12010 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e   row-id column n
12020 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ame..*/.int sqli
12030 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74  te3IsRowid(const
12040 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28   char *z){.  if(
12050 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
12060 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
12070 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
12080 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
12090 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30  p(z, "ROWID")==0
120a0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
120b0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
120c0 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29  p(z, "OID")==0 )
120d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
120e0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
120f0 70 58 20 69 73 20 74 68 65 20 52 48 53 20 6f 66  pX is the RHS of
12100 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e   an IN operator.
12110 20 20 49 66 20 70 58 20 69 73 20 61 20 53 45 4c    If pX is a SEL
12120 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a  ECT statement .*
12130 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 69  * that can be si
12140 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69  mplified to a di
12150 72 65 63 74 20 74 61 62 6c 65 20 61 63 63 65 73  rect table acces
12160 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a  s, then return.*
12170 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
12180 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
12190 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e  ent.  If pX is n
121a0 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ot a SELECT stat
121b0 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20  ement,.** or if 
121c0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
121d0 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65  ment needs to be
121e0 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f   manifested into
121f0 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20   a transient.** 
12200 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75  table, then retu
12210 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e  rn NULL..*/.#ifn
12220 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12230 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20  SUBQUERY.static 
12240 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64  Select *isCandid
12250 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72  ateForInOpt(Expr
12260 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20   *pX){.  Select 
12270 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  *p;.  SrcList *p
12280 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Src;.  ExprList 
12290 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65  *pEList;.  Table
122a0 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b   *pTab;.  int i;
122b0 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
122c0 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
122d0 49 73 53 65 6c 65 63 74 29 20 29 20 72 65 74 75  IsSelect) ) retu
122e0 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20  rn 0;  /* Not a 
122f0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  subquery */.  if
12300 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
12310 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65  y(pX, EP_VarSele
12320 63 74 29 20 20 29 20 72 65 74 75 72 6e 20 30 3b  ct)  ) return 0;
12330 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20    /* Correlated 
12340 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58  subq */.  p = pX
12350 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69  ->x.pSelect;.  i
12360 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72  f( p->pPrior ) r
12370 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
12380 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63        /* Not a c
12390 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
123a0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
123b0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
123c0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
123d0 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
123e0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
123f0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
12400 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
12410 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
12420 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73   testcase( (p->s
12430 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
12440 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
12450 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
12460 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ate );.    retur
12470 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49  n 0; /* No DISTI
12480 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20  NCT keyword and 
12490 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  no aggregate fun
124a0 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20  ctions */.  }.  
124b0 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
124c0 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  pBy==0 );       
124d0 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
124e0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
124f0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
12500 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12520 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61  Has no LIMIT cla
12530 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
12540 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
12550 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12560 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20  /* Has no WHERE 
12570 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63  clause */.  pSrc
12580 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
12590 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
125a0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
125b0 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
125c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
125d0 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d  gle term in FROM
125e0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
125f0 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
12600 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ect ) return 0; 
12610 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e      /* FROM is n
12620 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72  ot a subquery or
12630 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20   view */.  pTab 
12640 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
12650 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  b;.  assert( pTa
12660 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
12670 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
12680 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
12690 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
126a0 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f  is not a view */
126b0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
126c0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
126d0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f  0;        /* FRO
126e0 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76  M clause not a v
126f0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
12700 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
12710 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
12720 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 2f  pEList!=0 );.  /
12730 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72 65 73  * All SELECT res
12740 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63 6f 6c  ults must be col
12750 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  umns. */.  for(i
12760 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
12770 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
12780 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45 4c 69  xpr *pRes = pELi
12790 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
127a0 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 6f 70      if( pRes->op
127b0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
127c0 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73 73 65  turn 0;.    asse
127d0 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65  rt( pRes->iTable
127e0 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  ==pSrc->a[0].iCu
127f0 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20  rsor );  /* Not 
12800 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
12810 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72  query */.  }.  r
12820 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69  eturn p;.}.#endi
12830 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12840 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
12850 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12860 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
12870 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
12880 68 61 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c  hat checks the l
12890 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
128a0 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69  of index table i
128b0 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a  Cur to see if.**
128c0 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79   it contains any
128d0 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20   NULL entries.  
128e0 43 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74  Cause the regist
128f0 65 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c  er at regHasNull
12900 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f   to be set.** to
12910 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
12920 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69  e if iCur contai
12930 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61  ns no NULLs.  Ca
12940 75 73 65 20 72 65 67 69 73 74 65 72 20 72 65 67  use register reg
12950 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65  HasNull.** to be
12960 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20   set to NULL if 
12970 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  iCur contains on
12980 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76  e or more NULL v
12990 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
129a0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74   void sqlite3Set
129b0 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65  HasNullFlag(Vdbe
129c0 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69   *v, int iCur, i
129d0 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a  nt regHasNull){.
129e0 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73    int addr1;.  s
129f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12a00 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
12a10 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
12a20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
12a30 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12a40 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b  P_Rewind, iCur);
12a50 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12a60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12a70 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
12a80 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67  mn, iCur, 0, reg
12a90 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69  HasNull);.  sqli
12aa0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
12ab0 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  v, OPFLAG_TYPEOF
12ac0 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ARG);.  VdbeComm
12ad0 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65  ent((v, "first_e
12ae0 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43  ntry_in(%d)", iC
12af0 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ur));.  sqlite3V
12b00 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
12b10 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ddr1);.}.#endif.
12b20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12b30 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
12b40 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
12b50 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  t is an IN opera
12b60 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74 20  tor with a list 
12b70 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29  (not a subquery)
12b80 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68   on the .** righ
12b90 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65  t-hand side.  Re
12ba0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 61  turn TRUE if tha
12bb0 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61  t list is consta
12bc0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
12bd0 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  t sqlite3InRhsIs
12be0 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
12bf0 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48  In){.  Expr *pLH
12c00 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  S;.  int res;.  
12c10 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
12c20 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50  Property(pIn, EP
12c30 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
12c40 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65   pLHS = pIn->pLe
12c50 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  ft;.  pIn->pLeft
12c60 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71   = 0;.  res = sq
12c70 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
12c80 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d  ant(pIn);.  pIn-
12c90 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20  >pLeft = pLHS;. 
12ca0 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23   return res;.}.#
12cb0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
12cc0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
12cd0 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d  ed by the implem
12ce0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
12cf0 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f  IN (...) operato
12d00 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72  r..** The pX par
12d10 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78  ameter is the ex
12d20 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20  pression on the 
12d30 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
12d40 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a  erator, which.**
12d50 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72   might be either
12d60 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65   a list of expre
12d70 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71  ssions or a subq
12d80 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
12d90 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
12da0 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f  ine is to find o
12db0 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65  r create a b-tre
12dc0 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61  e object that ca
12dd0 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74  n.** be used eit
12de0 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
12df0 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68  membership in th
12e00 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20  e RHS set or to 
12e10 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a  iterate through.
12e20 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f  ** all members o
12e30 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73  f the RHS set, s
12e40 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74  kipping duplicat
12e50 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73  es..**.** A curs
12e60 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  or is opened on 
12e70 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
12e80 74 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48  t that is the RH
12e90 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
12ea0 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e  ator.** and pX->
12eb0 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
12ec0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
12ed0 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  at cursor..**.**
12ee0 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
12ef0 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
12f00 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74  tion indicates t
12f10 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20  he b-tree type, 
12f20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
12f30 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  *   IN_INDEX_ROW
12f40 49 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75  ID      - The cu
12f50 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
12f60 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61  on a database ta
12f70 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  ble..**   IN_IND
12f80 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20  EX_INDEX_ASC  - 
12f90 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
12fa0 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65  pened on an asce
12fb0 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20  nding index..** 
12fc0 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
12fd0 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73  _DESC - The curs
12fe0 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
12ff0 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
13000 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
13010 45 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20  EX_EPH        - 
13020 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
13030 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69  pened on a speci
13040 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  ally created and
13050 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13060 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75              popu
13070 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20  lated epheremal 
13080 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49  table..**   IN_I
13090 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20  NDEX_NOOP       
130a0 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20  - No cursor was 
130b0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20  allocated.  The 
130c0 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  IN operator must
130d0 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
130e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
130f0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
13100 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70  sequence of comp
13110 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41  arisons..**.** A
13120 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65  n existing b-tre
13130 65 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20  e might be used 
13140 69 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65  if the RHS expre
13150 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69  ssion pX is a si
13160 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79  mple.** subquery
13170 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20   such as:.**.** 
13180 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75      SELECT <colu
13190 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e  mn1>, <column2>.
131a0 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  .. FROM <table>.
131b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53  **.** If the RHS
131c0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
131d0 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72  tor is a list or
131e0 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
131f0 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  subquery, then.*
13200 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  * an ephemeral t
13210 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20  able might need 
13220 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
13230 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64  from the RHS and
13240 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61   then.** pX->iTa
13250 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e  ble made to poin
13260 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  t to the ephemer
13270 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  al table instead
13280 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69   of an.** existi
13290 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ng table..**.** 
132a0 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61  The inFlags para
132b0 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61  meter must conta
132c0 69 6e 2c 20 61 74 20 61 20 6d 69 6e 69 6d 75 6d  in, at a minimum
132d0 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74  , one of the bit
132e0 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  s.** IN_INDEX_ME
132f0 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49  MBERSHIP or IN_I
13300 4e 44 45 58 5f 4c 4f 4f 50 20 62 75 74 20 6e 6f  NDEX_LOOP but no
13310 74 20 62 6f 74 68 2e 20 20 49 66 20 69 6e 46 6c  t both.  If inFl
13320 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ags contains.** 
13330 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
13340 48 49 50 2c 20 74 68 65 6e 20 74 68 65 20 67 65  HIP, then the ge
13350 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20 77 69  nerated table wi
13360 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  ll be used for a
13370 20 66 61 73 74 0a 2a 2a 20 6d 65 6d 62 65 72 73   fast.** members
13380 68 69 70 20 74 65 73 74 2e 20 20 57 68 65 6e 20  hip test.  When 
13390 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  the IN_INDEX_LOO
133a0 50 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68  P bit is set, th
133b0 65 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 0a  e IN index will.
133c0 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 6c 6f  ** be used to lo
133d0 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  op over all valu
133e0 65 73 20 6f 66 20 74 68 65 20 52 48 53 20 6f 66  es of the RHS of
133f0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
13400 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
13410 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73  INDEX_LOOP is us
13420 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72  ed (and the b-tr
13430 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
13440 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
13450 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
13460 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68 65 20  mbers) then the 
13470 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20  b-tree must not 
13480 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74  contain duplicat
13490 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65  es..** An ephere
134a0 6d 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  mal table will b
134b0 65 20 63 72 65 61 74 65 64 20 75 6e 6c 65 73 73  e created unless
134c0 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f   the selected co
134d0 6c 75 6d 6e 73 20 61 72 65 20 67 75 61 72 61 6e  lumns are guaran
134e0 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e  teed.** to be un
134f0 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65  ique - either be
13500 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49  cause it is an I
13510 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
13520 45 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a 2a 20  EY or due to.** 
13530 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  a UNIQUE constra
13540 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  int or index..**
13550 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
13560 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20  X_MEMBERSHIP is 
13570 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d  used (and the b-
13580 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
13590 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73  d .** for fast s
135a0 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
135b0 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68  sts) then an eph
135c0 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
135d0 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e  t .** be used un
135e0 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69  less <columns> i
135f0 73 20 61 20 73 69 6e 67 6c 65 20 49 4e 54 45 47  s a single INTEG
13600 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
13610 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20  olumn or an .** 
13620 69 6e 64 65 78 20 63 61 6e 20 62 65 20 66 6f 75  index can be fou
13630 6e 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  nd with the spec
13640 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20  ified <columns> 
13650 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74  as its left-most
13660 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49  ..**.** If the I
13670 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20  N_INDEX_NOOP_OK 
13680 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  and IN_INDEX_MEM
13690 42 45 52 53 48 49 50 20 61 72 65 20 62 6f 74 68  BERSHIP are both
136a0 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74   set and.** if t
136b0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
136c0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
136d0 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75  ist (not a subqu
136e0 65 72 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a  ery) then this.*
136f0 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  * routine might 
13700 64 65 63 69 64 65 20 74 68 61 74 20 63 72 65 61  decide that crea
13710 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ting an ephemera
13720 6c 20 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d  l b-tree for mem
13730 62 65 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69  bership.** testi
13740 6e 67 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73  ng is too expens
13750 69 76 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49  ive and return I
13760 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49  N_INDEX_NOOP.  I
13770 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
13780 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  .** calling rout
13790 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65  ine should imple
137a0 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72  ment the IN oper
137b0 61 74 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71  ator using a seq
137c0 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f  uence.** of Eq o
137d0 72 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20  r Ne comparison 
137e0 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
137f0 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65  * When the b-tre
13800 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  e is being used 
13810 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74  for membership t
13820 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ests, the callin
13830 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69  g function.** mi
13840 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77  ght need to know
13850 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
13860 74 68 65 20 52 48 53 20 73 69 64 65 20 6f 66 20  the RHS side of 
13870 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
13880 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55  ** contains a NU
13890 4c 4c 2e 20 20 49 66 20 70 72 52 68 73 48 61 73  LL.  If prRhsHas
138a0 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55  Null is not a NU
138b0 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a  LL pointer and .
138c0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ** if there is a
138d0 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  ny chance that t
138e0 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63  he (...) might c
138f0 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61  ontain a NULL va
13900 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d  lue at.** runtim
13910 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74  e, then a regist
13920 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
13930 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72  and the register
13940 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a   number written.
13950 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e  ** to *prRhsHasN
13960 75 6c 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73  ull. If there is
13970 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
13980 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69  the (...) contai
13990 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  ns a.** NULL val
139a0 75 65 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48  ue, then *prRhsH
139b0 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75  asNull is left u
139c0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
139d0 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73  If a register is
139e0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69   allocated and i
139f0 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72  ts location stor
13a00 65 64 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e  ed in *prRhsHasN
13a10 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ull, then.** the
13a20 20 76 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72   value in that r
13a30 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20  egister will be 
13a40 4e 55 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72  NULL if the b-tr
13a50 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  ee contains one 
13a60 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20  or more.** NULL 
13a70 76 61 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77  values, and it w
13a80 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d  ill be some non-
13a90 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68  NULL value if th
13aa0 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
13ab0 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  s no.** NULL val
13ac0 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ues..**.** If th
13ad0 65 20 61 69 4d 61 70 20 70 61 72 61 6d 65 74 65  e aiMap paramete
13ae0 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  r is not NULL, i
13af0 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  t must point to 
13b00 61 6e 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  an array contain
13b10 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65  ing.** one eleme
13b20 6e 74 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  nt for each colu
13b30 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  mn returned by t
13b40 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
13b50 65 6e 74 20 6f 6e 20 74 68 65 20 52 48 53 0a 2a  ent on the RHS.*
13b60 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29  * of the IN(...)
13b70 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20 69   operator. The i
13b80 27 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  'th entry of the
13b90 20 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61   array is popula
13ba0 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ted with the.** 
13bb0 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 69 6e  offset of the in
13bc0 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  dex column that 
13bd0 6d 61 74 63 68 65 73 20 74 68 65 20 69 27 74 68  matches the i'th
13be0 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64   column returned
13bf0 20 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   by the.** SELEC
13c00 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  T. For example, 
13c10 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
13c20 6e 20 61 6e 64 20 73 65 6c 65 63 74 65 64 20 69  n and selected i
13c30 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ndex are:.**.** 
13c40 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53 45    (?,?,?) IN (SE
13c50 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f  LECT a, b, c FRO
13c60 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52 45 41 54  M t1).**   CREAT
13c70 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
13c80 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a  (b, c, a);.**.**
13c90 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20 69 73   then aiMap[] is
13ca0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
13cb0 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69  {2, 0, 1}..*/.#i
13cc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13cd0 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
13ce0 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
13cf0 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
13d00 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
13d10 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
13d20 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58  xt */.  Expr *pX
13d30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13d40 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
13d50 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20  hand side (RHS) 
13d60 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
13d70 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69 6e 46 6c  or */.  u32 inFl
13d80 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
13d90 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f 4c     /* IN_INDEX_L
13da0 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53 48 49 50  OOP, _MEMBERSHIP
13db0 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f  , and/or _NOOP_O
13dc0 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 72 52 68  K */.  int *prRh
13dd0 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20 20 20 20  sHasNull,       
13de0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
13df0 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74 61 74 75  lding NULL statu
13e00 73 2e 20 20 53 65 65 20 6e 6f 74 65 73 20 2a 2f  s.  See notes */
13e10 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 2c 20 20  .  int *aiMap,  
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13e30 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 49 6e   Mapping from In
13e40 64 65 78 20 66 69 65 6c 64 73 20 74 6f 20 52 48  dex fields to RH
13e50 53 20 66 69 65 6c 64 73 20 2a 2f 0a 20 20 69 6e  S fields */.  in
13e60 74 20 2a 70 69 54 61 62 20 20 20 20 20 20 20 20  t *piTab        
13e70 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
13e80 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f   index to use */
13e90 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  .){.  Select *p;
13ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
13ec0 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67  ELECT to the rig
13ed0 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  ht of IN operato
13ee0 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  r */.  int eType
13ef0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f10 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c  Type of RHS tabl
13f20 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f  e. IN_INDEX_* */
13f30 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
13f40 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
13f50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
13f60 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61  or of the RHS ta
13f70 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73  ble */.  int mus
13f80 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20  tBeUnique;      
13f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13fa0 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75  * True if RHS mu
13fb0 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a  st be unique */.
13fc0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
13fd0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13fe0 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75  e);     /* Virtu
13ff0 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67  al machine being
14000 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73   coded */..  ass
14010 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
14020 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e  IN );.  mustBeUn
14030 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20  ique = (inFlags 
14040 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29  & IN_INDEX_LOOP)
14050 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  !=0;..  /* If th
14060 65 20 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e  e RHS of this IN
14070 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69  (...) operator i
14080 73 20 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20  s a SELECT, and 
14090 69 66 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20  if it matters . 
140a0 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
140b0 6f 74 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  ot the SELECT re
140c0 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55  sult contains NU
140d0 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b  LL values, check
140e0 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72   whether.  ** or
140f0 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74   not NULL is act
14100 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28  ually possible (
14110 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66  it may not be, f
14120 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20  or example, due 
14130 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c  .  ** to NOT NUL
14140 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  L constraints in
14150 20 74 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66   the schema). If
14160 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20   no NULL values 
14170 61 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20  are possible,.  
14180 2a 2a 20 73 65 74 20 70 72 52 68 73 48 61 73 4e  ** set prRhsHasN
14190 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20  ull to 0 before 
141a0 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a  continuing.  */.
141b0 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75    if( prRhsHasNu
141c0 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73  ll && (pX->flags
141d0 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
141e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
141f0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
14200 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c  ist = pX->x.pSel
14210 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
14220 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
14230 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
14240 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
14250 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
14260 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
14270 70 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  pr) ) break;.   
14280 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45   }.    if( i==pE
14290 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
142a0 20 20 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c       prRhsHasNul
142b0 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 0;.    }.  }
142c0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
142d0 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69  see if an existi
142e0 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
142f0 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
14300 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68  .  ** satisfy th
14310 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69  e query.  This i
14320 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20  s preferable to 
14330 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77  generating a new
14340 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c   .  ** ephemeral
14350 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66   table.  */.  if
14360 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
14370 30 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64  0 && (p = isCand
14380 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58  idateForInOpt(pX
14390 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
143a0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
143b0 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  e->db;          
143c0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
143d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
143e0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
143f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14400 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
14410 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  e <table>. */.  
14420 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20    i16 iDb;      
14430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14440 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
14450 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61  base idx for pTa
14460 62 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73  b */.    ExprLis
14470 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  t *pEList = p->p
14480 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e  EList;.    int n
14490 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
144a0 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  Expr;..    asser
144b0 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
144c0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
144d0 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
144e0 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
144f0 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
14500 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  t( p->pEList->a[
14510 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f  0].pExpr!=0 ); /
14520 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
14530 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
14540 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
14550 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b  t( p->pSrc!=0 );
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14570 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
14580 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
14590 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20  (p) */.    pTab 
145a0 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
145b0 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  pTab;..    /* Co
145c0 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63  de an OP_Transac
145d0 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c  tion and OP_Tabl
145e0 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65  eLock for <table
145f0 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  >. */.    iDb = 
14600 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
14610 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
14620 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c  Schema);.    sql
14630 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
14640 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
14650 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61  );.    sqlite3Ta
14660 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
14670 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
14680 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
14690 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 76 29  ;..    assert(v)
146a0 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 74  ;  /* sqlite3Get
146b0 56 64 62 65 28 29 20 68 61 73 20 61 6c 77 61 79  Vdbe() has alway
146c0 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  s been previousl
146d0 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  y called */.    
146e0 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20  if( nExpr==1 && 
146f0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
14700 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
14710 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78  .      /* The "x
14720 20 49 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69   IN (SELECT rowi
14730 64 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 20 63  d FROM table)" c
14740 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ase */.      int
14750 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33   iAddr = sqlite3
14760 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
14770 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 56 64  _Once);.      Vd
14780 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
14790 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
147a0 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
147b0 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
147c0 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
147d0 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
147e0 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20  NDEX_ROWID;.    
147f0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
14800 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 0a 20  an((pParse, 0,. 
14810 20 20 20 20 20 20 20 20 20 20 20 22 55 53 49 4e             "USIN
14820 47 20 52 4f 57 49 44 20 53 45 41 52 43 48 20 4f  G ROWID SEARCH O
14830 4e 20 54 41 42 4c 45 20 25 73 20 46 4f 52 20 49  N TABLE %s FOR I
14840 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70 54 61 62  N-OPERATOR",pTab
14850 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
14860 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
14870 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
14880 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14890 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
148c0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
148d0 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79      int affinity
148e0 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  _ok = 1;.      i
148f0 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  nt i;..      /* 
14900 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  Check that the a
14910 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c  ffinity that wil
14920 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72  l be used to per
14930 66 6f 72 6d 20 65 61 63 68 20 0a 20 20 20 20 20  form each .     
14940 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   ** comparison i
14950 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
14960 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 65 61  e affinity of ea
14970 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62  ch column in tab
14980 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
14990 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
149a0 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 69   operator.  If i
149b0 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  t not, it is not
149c0 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a 20 20 20   possible to.   
149d0 20 20 20 2a 2a 20 75 73 65 20 61 6e 79 20 69 6e     ** use any in
149e0 64 65 78 20 6f 66 20 74 68 65 20 52 48 53 20 74  dex of the RHS t
149f0 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  able.  */.      
14a00 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
14a10 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b   && affinity_ok;
14a20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
14a30 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69  xpr *pLhs = sqli
14a40 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
14a50 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c  bexpr(pX->pLeft,
14a60 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74   i);.        int
14a70 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e   iCol = pEList->
14a80 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[i].pExpr->iCol
14a90 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61  umn;.        cha
14aa0 72 20 69 64 78 61 66 66 20 3d 20 73 71 6c 69 74  r idxaff = sqlit
14ab0 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66  e3TableColumnAff
14ac0 69 6e 69 74 79 28 70 54 61 62 2c 69 43 6f 6c 29  inity(pTab,iCol)
14ad0 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c 65 20 2a  ; /* RHS table *
14ae0 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  /.        char c
14af0 6d 70 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43  mpaff = sqlite3C
14b00 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
14b10 4c 68 73 2c 20 69 64 78 61 66 66 29 3b 0a 20 20  Lhs, idxaff);.  
14b20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14b30 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  cmpaff==SQLITE_A
14b40 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20  FF_BLOB );.     
14b50 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d 70     testcase( cmp
14b60 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
14b70 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20  TEXT );.        
14b80 73 77 69 74 63 68 28 20 63 6d 70 61 66 66 20 29  switch( cmpaff )
14b90 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  {.          case
14ba0 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
14bb0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  :.            br
14bc0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  eak;.          c
14bd0 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
14be0 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20  EXT:.           
14bf0 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f 6d 70 61   /* sqlite3Compa
14c00 72 65 41 66 66 69 6e 69 74 79 28 29 20 6f 6e 6c  reAffinity() onl
14c10 79 20 72 65 74 75 72 6e 73 20 54 45 58 54 20 69  y returns TEXT i
14c20 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68  f one side or th
14c30 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
14c40 20 6f 74 68 65 72 20 68 61 73 20 6e 6f 20 61 66   other has no af
14c50 66 69 6e 69 74 79 20 61 6e 64 20 74 68 65 20 6f  finity and the o
14c60 74 68 65 72 20 73 69 64 65 20 69 73 20 54 45 58  ther side is TEX
14c70 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20 20 20 20  T.  Hence,.     
14c80 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e         ** the on
14c90 6c 79 20 77 61 79 20 66 6f 72 20 63 6d 70 61 66  ly way for cmpaf
14ca0 66 20 74 6f 20 62 65 20 54 45 58 54 20 69 73 20  f to be TEXT is 
14cb0 66 6f 72 20 69 64 78 61 66 66 20 74 6f 20 62 65  for idxaff to be
14cc0 20 54 45 58 54 0a 20 20 20 20 20 20 20 20 20 20   TEXT.          
14cd0 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20 74 68 65    ** and for the
14ce0 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 4c 48 53   term on the LHS
14cf0 20 6f 66 20 74 68 65 20 49 4e 20 74 6f 20 68 61   of the IN to ha
14d00 76 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 20  ve no affinity. 
14d10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  */.            a
14d20 73 73 65 72 74 28 20 69 64 78 61 66 66 3d 3d 53  ssert( idxaff==S
14d30 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
14d40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
14d50 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64  eak;.          d
14d60 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
14d70 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20      affinity_ok 
14d80 3d 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  = sqlite3IsNumer
14d90 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 61 66  icAffinity(idxaf
14da0 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  f);.        }.  
14db0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
14dc0 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a   affinity_ok ){.
14dd0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
14de0 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
14df0 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 69 6c  g index that wil
14e00 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68 69 73 20  l work for this 
14e10 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
14e20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
14e30 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
14e40 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 3b 20  dx && eType==0; 
14e50 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
14e60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42 69 74  ){.          Bit
14e70 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b 20 20 20  mask colUsed;   
14e80 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66     /* Columns of
14e90 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20   the index used 
14ea0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 42 69 74  */.          Bit
14eb0 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20 20 20 20  mask mCol;      
14ec0 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 74     /* Mask for t
14ed0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d  he current colum
14ee0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  n */.          i
14ef0 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
14f00 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74 69 6e 75  <nExpr ) continu
14f10 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
14f20 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
14f30 68 65 72 65 21 3d 30 20 29 20 63 6f 6e 74 69 6e  here!=0 ) contin
14f40 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ue;.          /*
14f50 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e   Maximum nColumn
14f60 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74 20 42   is BMS-2, not B
14f70 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74 20 77 65  MS-1, so that we
14f80 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20 20 20   can compute.   
14f90 20 20 20 20 20 20 20 2a 2a 20 42 49 54 4d 41 53         ** BITMAS
14fa0 4b 28 6e 45 78 70 72 29 20 77 69 74 68 6f 75 74  K(nExpr) without
14fb0 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a   overflowing */.
14fc0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
14fd0 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  se( pIdx->nColum
14fe0 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20  n==BMS-2 );.    
14ff0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15000 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42  pIdx->nColumn==B
15010 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  MS-1 );.        
15020 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
15030 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63 6f 6e  umn>=BMS-1 ) con
15040 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
15050 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71 75   if( mustBeUniqu
15060 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
15070 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43   if( pIdx->nKeyC
15080 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20  ol>nExpr.       
15090 20 20 20 20 20 20 7c 7c 28 70 49 64 78 2d 3e 6e        ||(pIdx->n
150a0 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26 26 20  Column>nExpr && 
150b0 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70  !IsUniqueIndex(p
150c0 49 64 78 29 29 0a 20 20 20 20 20 20 20 20 20 20  Idx)).          
150d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
150e0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
150f0 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e   This index is n
15100 6f 74 20 75 6e 69 71 75 65 20 6f 76 65 72 20 74  ot unique over t
15110 68 65 20 49 4e 20 52 48 53 20 63 6f 6c 75 6d 6e  he IN RHS column
15120 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
15130 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
15140 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55   .          colU
15150 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  sed = 0;   /* Co
15160 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 20 75  lumns of index u
15170 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  sed so far */.  
15180 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
15190 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a   i<nExpr; i++){.
151a0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
151b0 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33   *pLhs = sqlite3
151c0 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
151d0 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29  pr(pX->pLeft, i)
151e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  ;.            Ex
151f0 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69 73  pr *pRhs = pELis
15200 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
15210 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53             CollS
15220 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74  eq *pReq = sqlit
15230 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
15240 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
15250 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20  Lhs, pRhs);.    
15260 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
15270 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73   .            as
15280 73 65 72 74 28 20 70 52 65 71 21 3d 30 20 7c 7c  sert( pReq!=0 ||
15290 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   pRhs->iColumn==
152a0 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 61 72  XN_ROWID || pPar
152b0 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 20 20  se->nErr );.    
152c0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
152d0 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a   j<nExpr; j++){.
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
152f0 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
15300 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75  [j]!=pRhs->iColu
15310 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
15330 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ert( pIdx->azCol
15340 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  l[j] );.        
15350 20 20 20 20 20 20 69 66 28 20 70 52 65 71 21 3d        if( pReq!=
15360 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
15370 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c  Cmp(pReq->zName,
15380 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
15390 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
153a0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
153b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
153c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
153d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
153e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
153f0 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20   if( j==nExpr ) 
15400 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
15410 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42 49     mCol = MASKBI
15420 54 28 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  T(j);.          
15430 20 20 69 66 28 20 6d 43 6f 6c 20 26 20 63 6f 6c    if( mCol & col
15440 55 73 65 64 20 29 20 62 72 65 61 6b 3b 20 2f 2a  Used ) break; /*
15450 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75 73 65   Each column use
15460 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20  d only once */. 
15470 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73             colUs
15480 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20  ed |= mCol;.    
15490 20 20 20 20 20 20 20 20 69 66 28 20 61 69 4d 61          if( aiMa
154a0 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 6a  p ) aiMap[i] = j
154b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
154c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
154d0 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c 20 63  t( i==nExpr || c
154e0 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42 49 54  olUsed!=(MASKBIT
154f0 28 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a 20 20  (nExpr)-1) );.  
15500 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 55          if( colU
15510 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28 6e 45  sed==(MASKBIT(nE
15520 78 70 72 29 2d 31 29 20 29 7b 0a 20 20 20 20 20  xpr)-1) ){.     
15530 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
15540 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
15550 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
15560 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20 75   index pIdx is u
15570 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  sable */.       
15580 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d       int iAddr =
15590 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
155a0 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
155b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
155c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
155d0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
155e0 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20  Parse, 0,.      
155f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15600 20 20 20 20 20 20 20 20 22 55 53 49 4e 47 20 49          "USING I
15610 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f  NDEX %s FOR IN-O
15620 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a  PERATOR",pIdx->z
15630 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
15640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15650 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
15660 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78  Read, iTab, pIdx
15670 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
15680 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15690 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
156a0 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
156b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
156c0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
156d0 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
156e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
156f0 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49  sert( IN_INDEX_I
15700 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f  NDEX_DESC == IN_
15710 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b  INDEX_INDEX_ASC+
15720 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1 );.           
15730 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
15740 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49  X_INDEX_ASC + pI
15750 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  dx->aSortOrder[0
15760 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  ];.  .          
15770 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75    if( prRhsHasNu
15780 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ll ){.#ifdef SQL
15790 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
157a0 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20  N_USED_MASK.    
157b0 20 20 20 20 20 20 20 20 20 20 69 36 34 20 6d 61            i64 ma
157c0 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d  sk = (1<<nExpr)-
157d0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
157e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
157f0 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
15800 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20  umnsUsed, .     
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61               iTa
15820 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d  b, 0, 0, (u8*)&m
15830 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  ask, P4_INT64);.
15840 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
15850 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75       *prRhsHasNu
15860 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
15870 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
15880 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20     if( nExpr==1 
15890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
158a0 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73     sqlite3SetHas
158b0 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62  NullFlag(v, iTab
158c0 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29  , *prRhsHasNull)
158d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
158e0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
158f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15900 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
15910 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20  v, iAddr);.     
15920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
15930 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* End loop ove
15940 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20  r indexes */.   
15950 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20     } /* End if( 
15960 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f  affinity_ok ) */
15970 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66  .    } /* End if
15980 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69 6e   not an rowid in
15990 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e  dex */.  } /* En
159a0 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 74  d attempt to opt
159b0 69 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20 69  imize using an i
159c0 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  ndex */..  /* If
159d0 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20   no preexisting 
159e0 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62  index is availab
159f0 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c  le for the IN cl
15a00 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e  ause.  ** and IN
15a10 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61  _INDEX_NOOP is a
15a20 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a  n allowed reply.
15a30 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53    ** and the RHS
15a40 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
15a50 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e  tor is a list, n
15a60 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20  ot a subquery.  
15a70 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69  ** and the RHS i
15a80 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f  s not constant o
15a90 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77  r has two or few
15aa0 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74  er terms,.  ** t
15ab0 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f  hen it is not wo
15ac0 72 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20  rth creating an 
15ad0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
15ae0 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a  to evaluate.  **
15af0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
15b00 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e   so return IN_IN
15b10 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20  DEX_NOOP..  */. 
15b20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20   if( eType==0.  
15b30 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49   && (inFlags & I
15b40 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29  N_INDEX_NOOP_OK)
15b50 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50  .   && !ExprHasP
15b60 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
15b70 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20  IsSelect).   && 
15b80 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  (!sqlite3InRhsIs
15b90 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20  Constant(pX) || 
15ba0 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pX->x.pList->nEx
15bb0 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20  pr<=2).  ){.    
15bc0 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
15bd0 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
15be0 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ( eType==0 ){.  
15bf0 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66    /* Could not f
15c00 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ind an existing 
15c10 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
15c20 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53  o use as the RHS
15c30 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20   b-tree..    ** 
15c40 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  We will have to 
15c50 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65  generate an ephe
15c60 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64  meral table to d
15c70 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a  o the job..    *
15c80 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 4e  /.    u32 savedN
15c90 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
15ca0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
15cb0 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65      int rMayHave
15cc0 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54  Null = 0;.    eT
15cd0 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45  ype = IN_INDEX_E
15ce0 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c  PH;.    if( inFl
15cf0 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c  ags & IN_INDEX_L
15d00 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OOP ){.      pPa
15d10 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
15d20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
15d30 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
15d40 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48  ){.      *prRhsH
15d50 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76  asNull = rMayHav
15d60 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  eNull = ++pParse
15d70 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  ->nMem;.    }.  
15d80 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
15d90 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 73  ==TK_IN );.    s
15da0 71 6c 69 74 65 33 43 6f 64 65 52 68 73 4f 66 49  qlite3CodeRhsOfI
15db0 4e 28 70 50 61 72 73 65 2c 20 70 58 2c 20 69 54  N(pParse, pX, iT
15dc0 61 62 29 3b 0a 20 20 20 20 69 66 28 20 72 4d 61  ab);.    if( rMa
15dd0 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20  yHaveNull ){.   
15de0 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73     sqlite3SetHas
15df0 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62  NullFlag(v, iTab
15e00 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b  , rMayHaveNull);
15e10 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
15e20 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
15e30 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
15e40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61  .  }..  if( aiMa
15e50 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49  p && eType!=IN_I
15e60 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 26  NDEX_INDEX_ASC &
15e70 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45  & eType!=IN_INDE
15e80 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a  X_INDEX_DESC ){.
15e90 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20      int i, n;.  
15ea0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70    n = sqlite3Exp
15eb0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e  rVectorSize(pX->
15ec0 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72 28  pLeft);.    for(
15ed0 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61  i=0; i<n; i++) a
15ee0 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d  iMap[i] = i;.  }
15ef0 0a 20 20 2a 70 69 54 61 62 20 3d 20 69 54 61 62  .  *piTab = iTab
15f00 3b 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  ;.  return eType
15f10 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
15f20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15f30 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41  SUBQUERY./*.** A
15f40 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73  rgument pExpr is
15f50 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e   an (?, ?...) IN
15f60 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
15f70 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
15f80 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ion allocates an
15f90 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d  d returns a nul-
15fa0 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
15fb0 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a  g containing .**
15fc0 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 20   the affinities 
15fd0 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
15fe0 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ach column of th
15ff0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a  e comparison..**
16000 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
16010 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
16020 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e  the caller to en
16030 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
16040 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67  turned.** string
16050 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   is eventually f
16060 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  reed using sqlit
16070 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  e3DbFree()..*/.s
16080 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 72  tatic char *expr
16090 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73 65  INAffinity(Parse
160a0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
160b0 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a  pExpr){.  Expr *
160c0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
160d0 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  Left;.  int nVal
160e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
160f0 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
16100 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
16110 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61  ct = (pExpr->fla
16120 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
16130 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53  t) ? pExpr->x.pS
16140 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68 61  elect : 0;.  cha
16150 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65  r *zRet;..  asse
16160 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
16170 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d  K_IN );.  zRet =
16180 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
16190 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Raw(pParse->db, 
161a0 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a  nVal+1);.  if( z
161b0 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Ret ){.    int i
161c0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
161d0 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
161e0 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73 71     Expr *pA = sq
161f0 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
16200 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69  Subexpr(pLeft, i
16210 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 20  );.      char a 
16220 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
16230 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20 20  inity(pA);.     
16240 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
16250 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20          zRet[i] 
16260 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
16270 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63 74  Affinity(pSelect
16280 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
16290 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20 20  Expr, a);.      
162a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
162b0 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20  Ret[i] = a;.    
162c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52    }.    }.    zR
162d0 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b  et[nVal] = '\0';
162e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
162f0 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  et;.}.#endif..#i
16300 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16310 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
16320 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65 20   Load the Parse 
16330 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
16340 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
16350 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ent with an erro
16360 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66  r .** message of
16370 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
16380 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72     "sub-select r
16390 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73  eturns N columns
163a0 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a 2a   - expected M".*
163b0 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  /   .void sqlite
163c0 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
163d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
163e0 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20  nt nActual, int 
163f0 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73  nExpect){.  cons
16400 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22  t char *zFmt = "
16410 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
16420 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20  ns %d columns - 
16430 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20 20  expected %d";.  
16440 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16450 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41  pParse, zFmt, nA
16460 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b  ctual, nExpect);
16470 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
16480 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   Expression pExp
16490 72 20 69 73 20 61 20 76 65 63 74 6f 72 20 74 68  r is a vector th
164a0 61 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64  at has been used
164b0 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20 77 68   in a context wh
164c0 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  ere.** it is not
164d0 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66 20 70   permitted. If p
164e0 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73 65  Expr is a sub-se
164f0 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74 68 69  lect vector, thi
16500 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f  s routine .** lo
16510 61 64 73 20 74 68 65 20 50 61 72 73 65 20 6f 62  ads the Parse ob
16520 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65 73 73  ject with a mess
16530 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  age of the form:
16540 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65  .**.**   "sub-se
16550 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63  lect returns N c
16560 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
16570 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  d 1".**.** Or, i
16580 66 20 69 74 20 69 73 20 61 20 72 65 67 75 6c 61  f it is a regula
16590 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f 72 3a  r scalar vector:
165a0 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61  .**.**   "row va
165b0 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20  lue misused".*/ 
165c0 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56    .void sqlite3V
165d0 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 50 61  ectorErrorMsg(Pa
165e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
165f0 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e 64  r *pExpr){.#ifnd
16600 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16610 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 70 45  UBQUERY.  if( pE
16620 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
16630 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  xIsSelect ){.   
16640 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
16650 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
16660 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
16670 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
16680 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  1);.  }else.#end
16690 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  if.  {.    sqlit
166a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
166b0 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
166c0 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  sused");.  }.}..
166d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
166e0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
166f0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
16700 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 73 74   that will const
16710 72 75 63 74 20 61 6e 20 65 70 68 65 6d 65 72 61  ruct an ephemera
16720 6c 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  l table containi
16730 6e 67 20 61 6c 6c 20 74 65 72 6d 73 0a 2a 2a 20  ng all terms.** 
16740 69 6e 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e  in the RHS of an
16750 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 54   IN operator.  T
16760 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 63  he IN operator c
16770 61 6e 20 62 65 20 69 6e 20 65 69 74 68 65 72 20  an be in either 
16780 6f 66 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a  of two.** forms:
16790 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  .**.**     x IN 
167a0 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20  (4,5,11)        
167b0 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72        -- IN oper
167c0 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f  ator with list o
167d0 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
167e0 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53  e.**     x IN (S
167f0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
16800 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
16810 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79  or with subquery
16820 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a   on the right.**
16830 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
16840 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 49  rameter is the I
16850 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65  N operator.  The
16860 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
16870 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 74 72  or the.** constr
16880 75 63 74 65 64 20 65 70 68 65 72 6d 65 72 61 6c  ucted ephermeral
16890 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e   table is return
168a0 65 64 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  ed.  The first t
168b0 69 6d 65 20 74 68 65 20 65 70 68 65 6d 65 72 61  ime the ephemera
168c0 6c 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 63 6f  l.** table is co
168d0 6d 70 75 74 65 64 2c 20 74 68 65 20 63 75 72 73  mputed, the curs
168e0 6f 72 20 6e 75 6d 62 65 72 20 69 73 20 61 6c 73  or number is als
168f0 6f 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  o stored in pExp
16900 72 2d 3e 69 54 61 62 6c 65 2c 0a 2a 2a 20 68 6f  r->iTable,.** ho
16910 77 65 76 65 72 20 74 68 65 20 63 75 72 73 6f 72  wever the cursor
16920 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
16930 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74 68   might not be th
16940 65 20 73 61 6d 65 2c 20 61 73 20 69 74 20 6d 69  e same, as it mi
16950 67 68 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  ght.** have been
16960 20 64 75 70 6c 69 63 61 74 65 64 20 75 73 69 6e   duplicated usin
16970 67 20 4f 50 5f 4f 70 65 6e 44 75 70 2e 0a 2a 2a  g OP_OpenDup..**
16980 0a 2a 2a 20 49 66 20 74 68 65 20 4c 48 53 20 65  .** If the LHS e
16990 78 70 72 65 73 73 69 6f 6e 20 28 22 78 22 20 69  xpression ("x" i
169a0 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 73 29 20  n the examples) 
169b0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
169c0 65 2c 20 6f 72 0a 2a 2a 20 74 68 65 20 53 45 4c  e, or.** the SEL
169d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72 65  ECT statement re
169e0 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76  turns a column v
169f0 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61  alue, then the a
16a00 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a  ffinity of that.
16a10 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
16a20 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
16a30 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
16a40 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 2a  th 'x' and the.*
16a50 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
16a60 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
16a70 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
16a80 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
16a90 0a 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f  .** if either co
16aa0 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43  lumn has NUMERIC
16ab0 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69   or INTEGER affi
16ac0 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72  nity. If neither
16ad0 0a 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20  .** 'x' nor the 
16ae0 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
16af0 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
16b00 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
16b10 66 69 6e 69 74 79 0a 2a 2a 20 69 73 20 75 73 65  finity.** is use
16b20 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
16b30 65 33 43 6f 64 65 52 68 73 4f 66 49 4e 28 0a 20  e3CodeRhsOfIN(. 
16b40 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
16b50 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
16b60 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
16b70 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
16b80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16b90 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
16ba0 20 69 6e 74 20 69 54 61 62 20 20 20 20 20 20 20   int iTab       
16bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
16bc0 74 68 69 73 20 63 75 72 73 6f 72 20 6e 75 6d 62  this cursor numb
16bd0 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  er */.){.  int a
16be0 64 64 72 4f 6e 63 65 20 3d 20 30 3b 20 20 20 20  ddrOnce = 0;    
16bf0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
16c00 73 20 6f 66 20 74 68 65 20 4f 50 5f 4f 6e 63 65  s of the OP_Once
16c10 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20   instruction at 
16c20 74 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  top */.  int add
16c30 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
16c40 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
16c50 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  of OP_OpenEpheme
16c60 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
16c70 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
16c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16c90 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74   /* the LHS of t
16ca0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
16cb0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
16cc0 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20  yInfo = 0;      
16cd0 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69  /* Key informati
16ce0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c  on */.  int nVal
16cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16d00 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76      /* Size of v
16d10 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20  ector pLeft */. 
16d20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16d40 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
16d50 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
16d60 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  struction */..  
16d70 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
16d80 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
16d90 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65  0 );..  /* The e
16da0 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  valuation of the
16db0 20 49 4e 20 6d 75 73 74 20 62 65 20 72 65 70 65   IN must be repe
16dc0 61 74 65 64 20 65 76 65 72 79 20 74 69 6d 65 20  ated every time 
16dd0 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75  it.  ** is encou
16de0 6e 74 65 72 65 64 20 69 66 20 61 6e 79 20 6f 66  ntered if any of
16df0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
16e00 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a  s true:.  **.  *
16e10 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
16e20 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
16e30 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
16e40 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20  uery.  **    *  
16e50 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
16e60 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73  ide is an expres
16e70 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69  sion list contai
16e80 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20  ning variables. 
16e90 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65   **    *  We are
16ea0 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65   inside a trigge
16eb0 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61  r.  **.  ** If a
16ec0 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
16ed0 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20  are false, then 
16ee0 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  we can compute t
16ef0 68 65 20 52 48 53 20 6a 75 73 74 20 6f 6e 63 65  he RHS just once
16f00 0a 20 20 2a 2a 20 61 6e 64 20 72 65 75 73 65 20  .  ** and reuse 
16f10 69 74 20 6d 61 6e 79 20 6e 61 6d 65 73 2e 0a 20  it many names.. 
16f20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
16f30 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16f40 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20  , EP_VarSelect) 
16f50 26 26 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66  && pParse->iSelf
16f60 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Tab==0 ){.    /*
16f70 20 52 65 75 73 65 20 6f 66 20 74 68 65 20 52 48   Reuse of the RH
16f80 53 20 69 73 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  S is allowed */.
16f90 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 72      /* If this r
16fa0 6f 75 74 69 6e 65 20 68 61 73 20 61 6c 72 65 61  outine has alrea
16fb0 64 79 20 62 65 65 6e 20 63 6f 64 65 64 2c 20 62  dy been coded, b
16fc0 75 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ut the previous 
16fd0 63 6f 64 65 0a 20 20 20 20 2a 2a 20 6d 69 67 68  code.    ** migh
16fe0 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
16ff0 69 6e 76 6f 6b 65 64 20 79 65 74 2c 20 73 6f 20  invoked yet, so 
17000 69 6e 76 6f 6b 65 20 69 74 20 6e 6f 77 20 61 73  invoke it now as
17010 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 0a   a subroutine. .
17020 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 45      */.    if( E
17030 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
17040 45 78 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29  Expr, EP_Subrtn)
17050 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
17060 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
17070 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
17080 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
17090 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  (v);.      if( E
170a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
170b0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
170c0 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ct) ){.        E
170d0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
170e0 28 70 50 61 72 73 65 2c 20 30 2c 20 22 52 45 55  (pParse, 0, "REU
170f0 53 45 20 4c 49 53 54 20 53 55 42 51 55 45 52 59  SE LIST SUBQUERY
17100 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
17110 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65      pExpr->x.pSe
17120 6c 65 63 74 2d 3e 73 65 6c 49 64 29 29 3b 0a 20  lect->selId));. 
17130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      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 47 6f 73 75 62 2c 20 70 45 78 70  , OP_Gosub, pExp
17160 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75  r->y.sub.regRetu
17170 72 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rn,.            
17180 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
17190 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 29 3b  r->y.sub.iAddr);
171a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
171b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
171c0 70 65 6e 44 75 70 2c 20 69 54 61 62 2c 20 70 45  penDup, iTab, pE
171d0 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
171e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
171f0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f  umpHere(v, addrO
17200 6e 63 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  nce);.      retu
17210 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rn;.    }..    /
17220 2a 20 42 65 67 69 6e 20 63 6f 64 69 6e 67 20 74  * Begin coding t
17230 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  he subroutine */
17240 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
17250 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
17260 75 62 72 74 6e 29 3b 0a 20 20 20 20 70 45 78 70  ubrtn);.    pExp
17270 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75  r->y.sub.regRetu
17280 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
17290 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  Mem;.    pExpr->
172a0 79 2e 73 75 62 2e 69 41 64 64 72 20 3d 0a 20 20  y.sub.iAddr =.  
172b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
172c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
172d0 67 65 72 2c 20 30 2c 20 70 45 78 70 72 2d 3e 79  ger, 0, pExpr->y
172e0 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29 20  .sub.regReturn) 
172f0 2b 20 31 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  + 1;.    VdbeCom
17300 6d 65 6e 74 28 28 76 2c 20 22 72 65 74 75 72 6e  ment((v, "return
17310 20 61 64 64 72 65 73 73 22 29 29 3b 0a 0a 20 20   address"));..  
17320 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c    addrOnce = sql
17330 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
17340 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
17350 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
17360 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
17370 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20 61  see if this is a
17380 20 76 65 63 74 6f 72 20 49 4e 20 6f 70 65 72 61   vector IN opera
17390 74 6f 72 20 2a 2f 0a 20 20 70 4c 65 66 74 20 3d  tor */.  pLeft =
173a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
173b0 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45   nVal = sqlite3E
173c0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
173d0 65 66 74 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73  eft);..  /* Cons
173e0 74 72 75 63 74 20 74 68 65 20 65 70 68 65 6d 65  truct the epheme
173f0 72 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 77  ral table that w
17400 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ill contain the 
17410 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 2a 2a 20  content of.  ** 
17420 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
17430 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 70  erator..  */.  p
17440 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
17450 54 61 62 3b 0a 20 20 61 64 64 72 20 3d 20 73 71  Tab;.  addr = sq
17460 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17470 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
17480 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ral, pExpr->iTab
17490 6c 65 2c 20 6e 56 61 6c 29 3b 0a 23 69 66 64 65  le, nVal);.#ifde
174a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
174b0 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
174c0 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
174d0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
174e0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
174f0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
17500 76 2c 20 22 52 65 73 75 6c 74 20 6f 66 20 53 45  v, "Result of SE
17510 4c 45 43 54 20 25 75 22 2c 20 70 45 78 70 72 2d  LECT %u", pExpr-
17520 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49  >x.pSelect->selI
17530 64 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d));.  }else{.  
17540 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
17550 2c 20 22 52 48 53 20 6f 66 20 49 4e 20 6f 70 65  , "RHS of IN ope
17560 72 61 74 6f 72 22 29 29 3b 0a 20 20 7d 0a 23 65  rator"));.  }.#e
17570 6e 64 69 66 0a 20 20 70 4b 65 79 49 6e 66 6f 20  ndif.  pKeyInfo 
17580 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
17590 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
175a0 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 69  , nVal, 1);..  i
175b0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
175c0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
175d0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 2f  Select) ){.    /
175e0 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
175f0 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
17600 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  .).    **.    **
17610 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
17620 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
17630 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
17640 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
17650 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
17660 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
17670 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
17680 20 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20    */.    Select 
17690 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72  *pSelect = pExpr
176a0 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
176b0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
176c0 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
176d0 69 73 74 3b 0a 0a 20 20 20 20 45 78 70 6c 61 69  ist;..    Explai
176e0 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
176f0 73 65 2c 20 31 2c 20 22 25 73 4c 49 53 54 20 53  se, 1, "%sLIST S
17700 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20  UBQUERY %d",.   
17710 20 20 20 20 20 61 64 64 72 4f 6e 63 65 3f 22 22       addrOnce?""
17720 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 20  :"CORRELATED ", 
17730 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64 0a 20  pSelect->selId. 
17740 20 20 20 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66     ));.    /* If
17750 20 74 68 65 20 4c 48 53 20 61 6e 64 20 52 48 53   the LHS and RHS
17760 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
17770 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  tor do not match
17780 2c 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 65 72  , that.    ** er
17790 72 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65  ror will have be
177a0 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 62  en caught long b
177b0 65 66 6f 72 65 20 77 65 20 72 65 61 63 68 20 74  efore we reach t
177c0 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
177d0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c    if( ALWAYS(pEL
177e0 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c  ist->nExpr==nVal
177f0 29 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  ) ){.      Selec
17800 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
17810 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
17820 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
17830 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
17840 53 65 74 2c 20 69 54 61 62 29 3b 0a 20 20 20 20  Set, iTab);.    
17850 20 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 20    dest.zAffSdst 
17860 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79  = exprINAffinity
17870 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
17880 0a 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e  .      pSelect->
17890 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
178a0 20 20 74 65 73 74 63 61 73 65 28 20 70 53 65 6c    testcase( pSel
178b0 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
178c0 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
178d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
178e0 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a  KeyInfo==0 ); /*
178f0 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69   Caused by OOM i
17900 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  n sqlite3KeyInfo
17910 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20  Alloc() */.     
17920 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
17930 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
17940 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  ct, &dest) ){.  
17950 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
17960 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
17970 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a  dest.zAffSdst);.
17980 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b          sqlite3K
17990 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
179a0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 72  Info);.        r
179b0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
179c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
179d0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64  ee(pParse->db, d
179e0 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20  est.zAffSdst);. 
179f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65       assert( pKe
17a00 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f  yInfo!=0 ); /* O
17a10 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78  OM will cause ex
17a20 69 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33  it after sqlite3
17a30 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20  Select() */.    
17a40 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
17a50 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
17a60 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ert( pEList->nEx
17a70 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  pr>0 );.      as
17a80 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
17a90 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
17aa0 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20  pKeyInfo) );.   
17ab0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
17ac0 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
17ad0 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
17ae0 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
17af0 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b  bexpr(pLeft, i);
17b00 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66  .        pKeyInf
17b10 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  o->aColl[i] = sq
17b20 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
17b30 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20  reCollSeq(.     
17b40 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
17b50 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
17b60 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  Expr.        );.
17b70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17b80 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
17b90 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21  (pExpr->x.pList!
17ba0 3d 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  =0) ){.    /* Ca
17bb0 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49  se 2:     expr I
17bc0 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20  N (exprlist).   
17bd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 65   **.    ** For e
17be0 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
17bf0 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
17c00 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
17c10 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 2a  uation and.    *
17c20 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
17c30 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
17c40 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
17c50 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
17c60 73 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63  se.    ** that c
17c70 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
17c80 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
17c90 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
17ca0 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  pr> is not.    *
17cb0 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20  * a column, use 
17cc0 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
17cd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61  ..    */.    cha
17ce0 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20  r affinity;     
17cf0 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
17d00 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66  ty of the LHS of
17d10 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 69   the IN */.    i
17d20 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69  nt i;.    ExprLi
17d30 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
17d40 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
17d50 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
17d60 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
17d70 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
17d80 0a 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20  .    affinity = 
17d90 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
17da0 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ity(pLeft);.    
17db0 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b  if( !affinity ){
17dc0 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20  .      affinity 
17dd0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
17de0 42 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  B;.    }.    if(
17df0 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
17e00 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
17e10 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
17e20 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29  able(pKeyInfo) )
17e30 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
17e40 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c  ->aColl[0] = sql
17e50 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
17e60 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
17e70 4c 65 66 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Left);.    }..  
17e80 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
17e90 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
17ea0 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e  n in <exprlist>.
17eb0 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c   */.    r1 = sql
17ec0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
17ed0 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d  Parse);.    r2 =
17ee0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17ef0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
17f00 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
17f10 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
17f20 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
17f30 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  tem++){.      Ex
17f40 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d  pr *pE2 = pItem-
17f50 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 2f  >pExpr;..      /
17f60 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
17f70 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  ion is not const
17f80 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ant then we will
17f90 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a   need to.      *
17fa0 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
17fb0 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
17fc0 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
17fd0 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
17fe0 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f    ** this code o
17ff0 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63  nly executes onc
18000 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20  e.  Because for 
18010 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20  a non-constant. 
18020 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
18030 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  on we need to re
18040 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61  run this code ea
18050 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 2a  ch time..      *
18060 2f 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  /.      if( addr
18070 4f 6e 63 65 20 26 26 20 21 73 71 6c 69 74 65 33  Once && !sqlite3
18080 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
18090 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  E2) ){.        s
180a0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
180b0 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 4f 6e  ToNoop(v, addrOn
180c0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  ce);.        Exp
180d0 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70  rClearProperty(p
180e0 45 78 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29  Expr, EP_Subrtn)
180f0 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f 6e  ;.        addrOn
18100 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ce = 0;.      }.
18110 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61  .      /* Evalua
18120 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  te the expressio
18130 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  n and insert it 
18140 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
18150 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 72 33 20  ble */.      r3 
18160 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
18170 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
18180 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  pE2, r1);.      
18190 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
181a0 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
181b0 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26  rd, r3, 1, r2, &
181c0 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
181d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
181e0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
181f0 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20  dxInsert, iTab, 
18200 72 32 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20  r2, r3, 1);.    
18210 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  }.    sqlite3Rel
18220 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18230 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c  se, r1);.    sql
18240 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
18250 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
18260 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 49 6e    }.  if( pKeyIn
18270 66 6f 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  fo ){.    sqlite
18280 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
18290 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70   addr, (void *)p
182a0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
182b0 4e 46 4f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NFO);.  }.  if( 
182c0 61 64 64 72 4f 6e 63 65 20 29 7b 0a 20 20 20 20  addrOnce ){.    
182d0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
182e0 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29  ere(v, addrOnce)
182f0 3b 0a 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74  ;.    /* Subrout
18300 69 6e 65 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  ine return */.  
18310 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18320 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
18330 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72  , pExpr->y.sub.r
18340 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 73  egReturn);.    s
18350 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
18360 50 31 28 76 2c 20 70 45 78 70 72 2d 3e 79 2e 73  P1(v, pExpr->y.s
18370 75 62 2e 69 41 64 64 72 2d 31 2c 20 73 71 6c 69  ub.iAddr-1, sqli
18380 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
18390 64 72 28 76 29 2d 31 29 3b 0a 20 20 7d 0a 7d 0a  dr(v)-1);.  }.}.
183a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
183b0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
183c0 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  /../*.** Generat
183d0 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
183e0 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
183f0 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20  d as a subquery 
18400 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6f 72  expression.** or
18410 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
18420 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c  :.**.**     (SEL
18430 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
18440 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65         -- subque
18450 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53  ry.**     EXISTS
18460 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
18470 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73  b)   -- EXISTS s
18480 75 62 71 75 65 72 79 0a 2a 2a 0a 2a 2a 20 54 68  ubquery.**.** Th
18490 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65  e pExpr paramete
184a0 72 20 69 73 20 74 68 65 20 53 45 4c 45 43 54 20  r is the SELECT 
184b0 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
184c0 6f 72 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  or to be coded..
184d0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74  **.** The regist
184e0 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  er that holds th
184f0 65 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 61  e result.  For a
18500 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 53 45   multi-column SE
18510 4c 45 43 54 2c 20 0a 2a 2a 20 74 68 65 20 72 65  LECT, .** the re
18520 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69  sult is stored i
18530 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 61  n a contiguous a
18540 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
18550 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65 74  s and the.** ret
18560 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
18570 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65   register of the
18580 20 6c 65 66 74 2d 6d 6f 73 74 20 72 65 73 75 6c   left-most resul
18590 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 52 65 74  t column..** Ret
185a0 75 72 6e 20 30 20 69 66 20 61 6e 20 65 72 72 6f  urn 0 if an erro
185b0 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23 69 66  r occurs..*/.#if
185c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
185d0 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
185e0 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
185f0 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
18600 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
18610 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d    int addrOnce =
18620 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
18630 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
18640 6e 63 65 20 61 74 20 74 6f 70 20 6f 66 20 73 75  nce at top of su
18650 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
18660 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20  t rReg = 0;     
18670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
18680 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65  ister storing re
18690 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 53 65 6c  sulting */.  Sel
186a0 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20  ect *pSel;      
186b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
186c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
186d0 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 53 65 6c 65  encode */.  Sele
186e0 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
186f0 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
18700 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45  o deal with SELE
18710 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69  CT result */.  i
18720 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20  nt nReg;        
18730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18740 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
18750 61 74 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ate */.  Expr *p
18760 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20  Limit;          
18770 20 20 20 20 20 2f 2a 20 4e 65 77 20 6c 69 6d 69       /* New limi
18780 74 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  t expression */.
18790 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
187a0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
187b0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
187c0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
187d0 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
187e0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
187f0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
18800 43 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CT );.  assert( 
18810 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
18820 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  ISTS || pExpr->o
18830 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
18840 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
18850 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
18860 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
18870 3b 0a 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72  ;.  pSel = pExpr
18880 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 0a 20 20  ->x.pSelect;..  
18890 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f  /* The evaluatio
188a0 6e 20 6f 66 20 74 68 65 20 45 58 49 53 54 53 2f  n of the EXISTS/
188b0 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 72  SELECT must be r
188c0 65 70 65 61 74 65 64 20 65 76 65 72 79 20 74 69  epeated every ti
188d0 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e  me it.  ** is en
188e0 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61 6e 79  countered if any
188f0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
18900 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a  g is true:.  **.
18910 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
18920 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
18930 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
18940 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20  ubquery.  **    
18950 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
18960 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70  d side is an exp
18970 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  ression list con
18980 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65  taining variable
18990 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20  s.  **    *  We 
189a0 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69  are inside a tri
189b0 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gger.  **.  ** I
189c0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f  f all of the abo
189d0 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68  ve are false, th
189e0 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68  en we can run th
189f0 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63  is code just onc
18a00 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20  e.  ** save the 
18a10 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75  results, and reu
18a20 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  se the same resu
18a30 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74  lt on subsequent
18a40 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20   invocations..  
18a50 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  */.  if( !ExprHa
18a60 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
18a70 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29   EP_VarSelect) )
18a80 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
18a90 20 72 6f 75 74 69 6e 65 20 68 61 73 20 61 6c 72   routine has alr
18aa0 65 61 64 79 20 62 65 65 6e 20 63 6f 64 65 64 2c  eady been coded,
18ab0 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 69 74 20   then invoke it 
18ac0 61 73 20 61 0a 20 20 20 20 2a 2a 20 73 75 62 72  as a.    ** subr
18ad0 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 69  outine. */.    i
18ae0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
18af0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 75 62  ty(pExpr, EP_Sub
18b00 72 74 6e 29 20 29 7b 0a 20 20 20 20 20 20 45 78  rtn) ){.      Ex
18b10 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
18b20 70 50 61 72 73 65 2c 20 30 2c 20 22 52 45 55 53  pParse, 0, "REUS
18b30 45 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20  E SUBQUERY %d", 
18b40 70 53 65 6c 2d 3e 73 65 6c 49 64 29 29 3b 0a 20  pSel->selId));. 
18b50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18b60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
18b70 75 62 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62  ub, pExpr->y.sub
18b80 2e 72 65 67 52 65 74 75 72 6e 2c 0a 20 20 20 20  .regReturn,.    
18b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ba0 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62      pExpr->y.sub
18bb0 2e 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72  .iAddr);.      r
18bc0 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 54 61  eturn pExpr->iTa
18bd0 62 6c 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ble;.    }..    
18be0 2f 2a 20 42 65 67 69 6e 20 63 6f 64 69 6e 67 20  /* Begin coding 
18bf0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  the subroutine *
18c00 2f 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  /.    ExprSetPro
18c10 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
18c20 53 75 62 72 74 6e 29 3b 0a 20 20 20 20 70 45 78  Subrtn);.    pEx
18c30 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74  pr->y.sub.regRet
18c40 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
18c50 6e 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d  nMem;.    pExpr-
18c60 3e 79 2e 73 75 62 2e 69 41 64 64 72 20 3d 0a 20  >y.sub.iAddr =. 
18c70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18c80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
18c90 65 67 65 72 2c 20 30 2c 20 70 45 78 70 72 2d 3e  eger, 0, pExpr->
18ca0 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29  y.sub.regReturn)
18cb0 20 2b 20 31 3b 0a 20 20 20 20 56 64 62 65 43 6f   + 1;.    VdbeCo
18cc0 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 74 75 72  mment((v, "retur
18cd0 6e 20 61 64 64 72 65 73 73 22 29 29 3b 0a 0a 20  n address"));.. 
18ce0 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
18cf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
18d00 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
18d10 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18d20 7d 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 20 61 20  }.  .  /* For a 
18d30 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74 65  SELECT, generate
18d40 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65   code to put the
18d50 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20   values for all 
18d60 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20  columns of.  ** 
18d70 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e  the first row in
18d80 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  to an array of r
18d90 65 67 69 73 74 65 72 73 20 61 6e 64 20 72 65 74  egisters and ret
18da0 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
18db0 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
18dc0 72 65 67 69 73 74 65 72 2e 0a 20 20 2a 2a 0a 20  register..  **. 
18dd0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
18de0 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65 20  n EXISTS, write 
18df0 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f  an integer 0 (no
18e00 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20 28  t exists) or 1 (
18e10 65 78 69 73 74 73 29 0a 20 20 2a 2a 20 69 6e 74  exists).  ** int
18e20 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e 64  o a register and
18e30 20 72 65 74 75 72 6e 20 74 68 61 74 20 72 65 67   return that reg
18e40 69 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20  ister number..  
18e50 2a 2a 0a 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20  **.  ** In both 
18e60 63 61 73 65 73 2c 20 74 68 65 20 71 75 65 72 79  cases, the query
18e70 20 69 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69   is augmented wi
18e80 74 68 20 22 4c 49 4d 49 54 20 31 22 2e 20 20 41  th "LIMIT 1".  A
18e90 6e 79 20 0a 20 20 2a 2a 20 70 72 65 65 78 69 73  ny .  ** preexis
18ea0 74 69 6e 67 20 6c 69 6d 69 74 20 69 73 20 64 69  ting limit is di
18eb0 73 63 61 72 64 65 64 20 69 6e 20 70 6c 61 63 65  scarded in place
18ec0 20 6f 66 20 74 68 65 20 6e 65 77 20 4c 49 4d 49   of the new LIMI
18ed0 54 20 31 2e 0a 20 20 2a 2f 0a 20 20 45 78 70 6c  T 1..  */.  Expl
18ee0 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
18ef0 61 72 73 65 2c 20 31 2c 20 22 25 73 53 43 41 4c  arse, 1, "%sSCAL
18f00 41 52 20 53 55 42 51 55 45 52 59 20 25 64 22 2c  AR SUBQUERY %d",
18f10 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f 6e 63  .        addrOnc
18f20 65 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44  e?"":"CORRELATED
18f30 20 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64 29   ", pSel->selId)
18f40 29 3b 0a 20 20 6e 52 65 67 20 3d 20 70 45 78 70  );.  nReg = pExp
18f50 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
18f60 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d   ? pSel->pEList-
18f70 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20 20 73 71  >nExpr : 1;.  sq
18f80 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
18f90 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 70 50  nit(&dest, 0, pP
18fa0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20  arse->nMem+1);. 
18fb0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
18fc0 20 6e 52 65 67 3b 0a 20 20 69 66 28 20 70 45 78   nReg;.  if( pEx
18fd0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
18fe0 54 20 29 7b 0a 20 20 20 20 64 65 73 74 2e 65 44  T ){.    dest.eD
18ff0 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20  est = SRT_Mem;. 
19000 20 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20     dest.iSdst = 
19010 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
19020 20 20 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e    dest.nSdst = n
19030 52 65 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Reg;.    sqlite3
19040 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19050 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69  _Null, 0, dest.i
19060 53 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44  SDParm, dest.iSD
19070 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20  Parm+nReg-1);.  
19080 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
19090 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79  , "Init subquery
190a0 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 7d 65   result"));.  }e
190b0 6c 73 65 7b 0a 20 20 20 20 64 65 73 74 2e 65 44  lse{.    dest.eD
190c0 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73  est = SRT_Exists
190d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
190e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
190f0 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69  teger, 0, dest.i
19100 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 56 64 62  SDParm);.    Vdb
19110 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e  eComment((v, "In
19120 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74  it EXISTS result
19130 22 29 29 3b 0a 20 20 7d 0a 20 20 70 4c 69 6d 69  "));.  }.  pLimi
19140 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
19150 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
19160 20 54 4b 5f 49 4e 54 45 47 45 52 2c 26 73 71 6c   TK_INTEGER,&sql
19170 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d  ite3IntTokens[1]
19180 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  , 0);.  if( pSel
19190 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
191a0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
191b0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
191c0 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  el->pLimit->pLef
191d0 74 29 3b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 4c  t);.    pSel->pL
191e0 69 6d 69 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  imit->pLeft = pL
191f0 69 6d 69 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  imit;.  }else{. 
19200 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20     pSel->pLimit 
19210 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
19220 50 61 72 73 65 2c 20 54 4b 5f 4c 49 4d 49 54 2c  Parse, TK_LIMIT,
19230 20 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 7d   pLimit, 0);.  }
19240 0a 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20  .  pSel->iLimit 
19250 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
19260 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
19270 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b   pSel, &dest) ){
19280 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
19290 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62   }.  pExpr->iTab
192a0 6c 65 20 3d 20 72 52 65 67 20 3d 20 64 65 73 74  le = rReg = dest
192b0 2e 69 53 44 50 61 72 6d 3b 0a 20 20 45 78 70 72  .iSDParm;.  Expr
192c0 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
192d0 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
192e0 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 4f 6e  e);.  if( addrOn
192f0 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ce ){.    sqlite
19300 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
19310 20 61 64 64 72 4f 6e 63 65 29 3b 0a 0a 20 20 20   addrOnce);..   
19320 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72   /* Subroutine r
19330 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 73 71 6c  eturn */.    sql
19340 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
19350 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 45 78  , OP_Return, pEx
19360 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74  pr->y.sub.regRet
19370 75 72 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  urn);.    sqlite
19380 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
19390 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41   pExpr->y.sub.iA
193a0 64 64 72 2d 31 2c 20 73 71 6c 69 74 65 33 56 64  ddr-1, sqlite3Vd
193b0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
193c0 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  -1);.  }..  retu
193d0 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69  rn rReg;.}.#endi
193e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
193f0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
19400 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19410 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
19420 20 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20   Expr pIn is an 
19430 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  IN(...) expressi
19440 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
19450 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  n checks that th
19460 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74  e .** sub-select
19470 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
19480 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72  he IN() operator
19490 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75   has the same nu
194a0 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75  mber of .** colu
194b0 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63 74 6f  mns as the vecto
194c0 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72  r on the LHS. Or
194d0 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  , if the RHS of 
194e0 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20  the IN() is not 
194f0 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c  .** a sub-query,
19500 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 69 73   that the LHS is
19510 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a   a vector of siz
19520 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 1..*/.int sqli
19530 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50  te3ExprCheckIN(P
19540 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
19550 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20  pr *pIn){.  int 
19560 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
19570 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
19580 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  pIn->pLeft);.  i
19590 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26  f( (pIn->flags &
195a0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
195b0 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f  {.    if( nVecto
195c0 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63  r!=pIn->x.pSelec
195d0 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
195e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
195f0 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
19600 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70  pParse, pIn->x.p
19610 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
19620 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b  nExpr, nVector);
19630 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
19640 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
19650 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b  f( nVector!=1 ){
19660 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65 63 74  .    sqlite3Vect
19670 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  orErrorMsg(pPars
19680 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a  e, pIn->pLeft);.
19690 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
196a0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
196b0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
196c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
196d0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
196e0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
196f0 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  IN expression..*
19700 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
19710 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20  SELECT ...).**  
19720 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c      x IN (value,
19730 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a   value, ...).**.
19740 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  ** The left-hand
19750 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61   side (LHS) is a
19760 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f   scalar or vecto
19770 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  r expression.  T
19780 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e  he .** right-han
19790 64 20 73 69 64 65 20 28 52 48 53 29 20 69 73 20  d side (RHS) is 
197a0 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
197b0 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20   or more scalar 
197c0 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20  values, or a.** 
197d0 73 75 62 71 75 65 72 79 2e 20 20 49 66 20 74 68  subquery.  If th
197e0 65 20 52 48 53 20 69 73 20 61 20 73 75 62 71 75  e RHS is a subqu
197f0 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  ery, the number 
19800 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
19810 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20  s must.** match 
19820 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
19830 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63  lumns in the vec
19840 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
19850 20 49 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a   If the RHS is.*
19860 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  * a list of valu
19870 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74  es, the LHS must
19880 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a   be a scalar. .*
19890 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72  *.** The IN oper
198a0 61 74 6f 72 20 69 73 20 74 72 75 65 20 69 66 20  ator is true if 
198b0 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73  the LHS value is
198c0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
198d0 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68  n the RHS..** Th
198e0 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73  e result is fals
198f0 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
19900 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69  definitely not i
19910 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20  n the RHS.  The 
19920 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55  .** result is NU
19930 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73 65 6e  LL if the presen
19940 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e  ce of the LHS in
19950 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20   the RHS cannot 
19960 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  be .** determine
19970 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a  d due to NULLs..
19980 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
19990 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
199a0 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20  e that jumps to 
199b0 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74  destIfFalse if t
199c0 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a  he LHS is not .*
199d0 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
199e0 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
199f0 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20  due to NULLs we 
19a00 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
19a10 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69   if the LHS.** i
19a20 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
19a30 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70  he RHS then jump
19a40 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20   to destIfNull. 
19a50 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   If the LHS is c
19a60 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68  ontained.** with
19a70 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
19a80 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a  fall through..**
19a90 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70 61  .** See the sepa
19aa0 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72  rate in-operator
19ab0 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .md documentatio
19ac0 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61  n file in the ca
19ad0 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74  nonical.** SQLit
19ae0 65 20 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f  e source tree fo
19af0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
19b00 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
19b10 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
19b20 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61  ExprCodeIN(.  Pa
19b30 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
19b40 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
19b50 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
19b60 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
19b70 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
19b80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
19b90 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
19ba0 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c  int destIfFalse,
19bb0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
19bc0 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74  re if LHS is not
19bd0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
19be0 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64  e RHS */.  int d
19bf0 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20  estIfNull       
19c00 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
19c10 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
19c20 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20   unknown due to 
19c30 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  NULLs */.){.  in
19c40 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  t rRhsHasNull = 
19c50 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  0;  /* Register 
19c60 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20  that is true if 
19c70 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
19c80 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  L values */.  in
19c90 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
19ca0 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
19cb0 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
19cc0 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  rLhs;           
19cd0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29    /* Register(s)
19ce0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53   holding the LHS
19cf0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
19d00 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20   rLhsOrig;      
19d10 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73     /* LHS values
19d20 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65   prior to reorde
19d30 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20  ring by aiMap[] 
19d40 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
19d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
19d60 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
19d70 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
19d80 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20  int *aiMap = 0; 
19d90 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f        /* Map fro
19da0 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74  m vector field t
19db0 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a  o index column *
19dc0 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d  /.  char *zAff =
19dd0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66   0;       /* Aff
19de0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72  inity string for
19df0 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a   comparisons */.
19e00 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20    int nVector;  
19e10 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
19e20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74  of vectors for t
19e30 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  his IN operator 
19e40 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b  */.  int iDummy;
19e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75             /* Du
19e60 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f  mmy parameter to
19e70 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
19e80 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  ) */.  Expr *pLe
19e90 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ft;          /* 
19ea0 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
19eb0 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
19ec0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
19ed0 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f        /* loop co
19ee0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64  unter */.  int d
19ef0 65 73 74 53 74 65 70 32 3b 20 20 20 20 20 20 20  estStep2;       
19f00 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d   /* Where to jum
19f10 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65  p when NULLs see
19f20 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20  n in step 2 */. 
19f30 20 69 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d   int destStep6 =
19f40 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20   0;    /* Start 
19f50 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70  of code for Step
19f60 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72   6 */.  int addr
19f70 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a  TruthOp;      /*
19f80 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f   Address of opco
19f90 64 65 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  de that determin
19fa0 65 73 20 74 68 65 20 49 4e 20 69 73 20 74 72 75  es the IN is tru
19fb0 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e  e */.  int destN
19fc0 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20  otNull;      /* 
19fd0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 20 63  Jump here if a c
19fe0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74  omparison is not
19ff0 20 74 72 75 65 20 69 6e 20 73 74 65 70 20 36 20   true in step 6 
1a000 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
1a010 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
1a020 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20  p of the step-6 
1a030 6c 6f 6f 70 20 2a 2f 20 0a 20 20 69 6e 74 20 69  loop */ .  int i
1a040 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
1a050 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 75 73 65   /* Index to use
1a060 20 2a 2f 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70   */..  pLeft = p
1a070 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
1a080 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  f( sqlite3ExprCh
1a090 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70 45  eckIN(pParse, pE
1a0a0 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  xpr) ) return;. 
1a0b0 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41 66   zAff = exprINAf
1a0c0 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
1a0d0 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72  Expr);.  nVector
1a0e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
1a0f0 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
1a100 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20  pLeft);.  aiMap 
1a110 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44  = (int*)sqlite3D
1a120 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  bMallocZero(.   
1a130 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e     pParse->db, n
1a140 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69  Vector*(sizeof(i
1a150 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  nt) + sizeof(cha
1a160 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69  r)) + 1.  );.  i
1a170 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
1a180 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
1a190 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  to sqlite3ExprCo
1a1a0 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a  deIN_oom_error;.
1a1b0 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
1a1c0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   compute the RHS
1a1d0 2e 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65  . After this ste
1a1e0 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67 20 6f  p, if anything o
1a1f0 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49  ther than.  ** I
1a200 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
1a210 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 74 61  returned, the ta
1a220 62 6c 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20  ble opened with 
1a230 63 75 72 73 6f 72 20 69 54 61 62 0a 20 20 2a 2a  cursor iTab.  **
1a240 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
1a250 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
1a260 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e  p the RHS. If IN
1a270 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72  _INDEX_NOOP is r
1a280 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68  eturned,.  ** th
1a290 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65  e RHS has not ye
1a2a0 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a  t been coded.  *
1a2b0 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
1a2c0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
1a2d0 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
1a2e0 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
1a2f0 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
1a300 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
1a310 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
1a320 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
1a330 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
1a340 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
1a350 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20  arse, pExpr,.   
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a370 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44            IN_IND
1a380 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20  EX_MEMBERSHIP | 
1a390 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
1a3a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1a3c0 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
1a3d0 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52  IfNull ? 0 : &rR
1a3e0 68 73 48 61 73 4e 75 6c 6c 2c 0a 20 20 20 20 20  hsHasNull,.     
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a400 20 20 20 20 20 20 20 20 61 69 4d 61 70 2c 20 26          aiMap, &
1a410 69 54 61 62 29 3b 0a 0a 20 20 61 73 73 65 72 74  iTab);..  assert
1a420 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1a430 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20  | nVector==1 || 
1a440 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
1a450 45 50 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  EPH.       || eT
1a460 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
1a470 44 45 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65  DEX_ASC || eType
1a480 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
1a490 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23 69 66 64  _DESC .  );.#ifd
1a4a0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1a4b0 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61    /* Confirm tha
1a4c0 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69  t aiMap[] contai
1a4d0 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e 74 65 67  ns nVector integ
1a4e0 65 72 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  er values betwee
1a4f0 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65  n 0 and.  ** nVe
1a500 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72  ctor-1. */.  for
1a510 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
1a520 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
1a530 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63  , cnt;.    for(c
1a540 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f  nt=j=0; j<nVecto
1a550 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61  r; j++) if( aiMa
1a560 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b  p[j]==i ) cnt++;
1a570 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6e 74  .    assert( cnt
1a580 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ==1 );.  }.#endi
1a590 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  f..  /* Code the
1a5a0 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e   LHS, the <expr>
1a5b0 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
1a5c0 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20   (...)". If the 
1a5d0 4c 48 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76  LHS is a .  ** v
1a5e0 65 63 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69  ector, then it i
1a5f0 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  s stored in an a
1a600 72 72 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20  rray of nVector 
1a610 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
1a620 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a  ng .  ** at r1..
1a630 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65    **.  ** sqlite
1a640 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d  3FindInIndex() m
1a650 69 67 68 74 20 68 61 76 65 20 72 65 6f 72 64 65  ight have reorde
1a660 72 65 64 20 74 68 65 20 66 69 65 6c 64 73 20 6f  red the fields o
1a670 66 20 74 68 65 20 4c 48 53 20 76 65 63 74 6f 72  f the LHS vector
1a680 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  .  ** so that th
1a690 65 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 20  e fields are in 
1a6a0 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61  the same order a
1a6b0 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e  s an existing in
1a6c0 64 65 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20  dex.   The.  ** 
1a6d0 61 69 4d 61 70 5b 5d 20 61 72 72 61 79 20 63 6f  aiMap[] array co
1a6e0 6e 74 61 69 6e 73 20 61 20 6d 61 70 70 69 6e 67  ntains a mapping
1a6f0 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
1a700 61 6c 20 4c 48 53 20 66 69 65 6c 64 20 6f 72 64  al LHS field ord
1a710 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66  er to.  ** the f
1a720 69 65 6c 64 20 6f 72 64 65 72 20 74 68 61 74 20  ield order that 
1a730 6d 61 74 63 68 65 73 20 74 68 65 20 52 48 53 20  matches the RHS 
1a740 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 72 4c  index..  */.  rL
1a750 68 73 4f 72 69 67 20 3d 20 65 78 70 72 43 6f 64  hsOrig = exprCod
1a760 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20  eVector(pParse, 
1a770 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b  pLeft, &iDummy);
1a780 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
1a790 65 63 74 6f 72 20 26 26 20 61 69 4d 61 70 5b 69  ector && aiMap[i
1a7a0 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20  ]==i; i++){} /* 
1a7b0 41 72 65 20 4c 48 53 20 66 69 65 6c 64 73 20 72  Are LHS fields r
1a7c0 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69  eordered? */.  i
1a7d0 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b  f( i==nVector ){
1a7e0 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c  .    /* LHS fiel
1a7f0 64 73 20 61 72 65 20 6e 6f 74 20 72 65 6f 72 64  ds are not reord
1a800 65 72 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73  ered */.    rLhs
1a810 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d   = rLhsOrig;.  }
1a820 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  else{.    /* Nee
1a830 64 20 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65  d to reorder the
1a840 20 4c 48 53 20 66 69 65 6c 64 73 20 61 63 63 6f   LHS fields acco
1a850 72 64 69 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a  rding to aiMap *
1a860 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 73 71 6c  /.    rLhs = sql
1a870 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
1a880 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72  (pParse, nVector
1a890 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1a8a0 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
1a8b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a8c0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1a8d0 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c  opy, rLhsOrig+i,
1a8e0 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20   rLhs+aiMap[i], 
1a8f0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
1a900 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69   /* If sqlite3Fi
1a910 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20  ndInIndex() did 
1a920 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61  not find or crea
1a930 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  te an index that
1a940 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c   is.  ** suitabl
1a950 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67  e for evaluating
1a960 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
1a970 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20  , then evaluate 
1a980 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71  using a.  ** seq
1a990 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69  uence of compari
1a9a0 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  sons..  **.  ** 
1a9b0 54 68 69 73 20 69 73 20 73 74 65 70 20 28 31 29  This is step (1)
1a9c0 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72 61   in the in-opera
1a9d0 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64  tor.md optimized
1a9e0 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f   algorithm..  */
1a9f0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e  .  if( eType==IN
1aa00 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20  _INDEX_NOOP ){. 
1aa10 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
1aa20 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
1aa30 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  ist;.    CollSeq
1aa40 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
1aa50 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1aa60 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1aa70 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65  t);.    int labe
1aa80 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lOk = sqlite3Vdb
1aa90 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
1aaa0 65 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20  e);.    int r2, 
1aab0 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69  regToFree;.    i
1aac0 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30  nt regCkNull = 0
1aad0 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  ;.    int ii;.  
1aae0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1aaf0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1ab00 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1ab10 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49  );.    if( destI
1ab20 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c  fNull!=destIfFal
1ab30 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65 67 43  se ){.      regC
1ab40 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  kNull = sqlite3G
1ab50 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1ab60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ab70 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1ab80 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73 2c 20 72  _BitAnd, rLhs, r
1ab90 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b  Lhs, regCkNull);
1aba0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1abb0 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e  i=0; ii<pList->n
1abc0 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
1abd0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1abe0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1abf0 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  se, pList->a[ii]
1ac00 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72  .pExpr, &regToFr
1ac10 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ee);.      if( r
1ac20 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69  egCkNull && sqli
1ac30 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
1ac40 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45  (pList->a[ii].pE
1ac50 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
1ac60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ac70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
1ac80 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72  regCkNull, r2, r
1ac90 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  egCkNull);.     
1aca0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c   }.      if( ii<
1acb0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c  pList->nExpr-1 |
1acc0 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  | destIfNull!=de
1acd0 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
1ace0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1acf0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c  AddOp4(v, OP_Eq,
1ad00 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c 20   rLhs, labelOk, 
1ad10 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r2,.            
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1ad30 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
1ad40 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20  OLLSEQ);.       
1ad50 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1ad60 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  v, ii<pList->nEx
1ad70 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56  pr-1);.        V
1ad80 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1ad90 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70   ii==pList->nExp
1ada0 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  r-1);.        sq
1adb0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1adc0 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20  5(v, zAff[0]);. 
1add0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ade0 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74      assert( dest
1adf0 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
1ae00 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  lse );.        s
1ae10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1ae20 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2c  (v, OP_Ne, rLhs,
1ae30 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32   destIfFalse, r2
1ae40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1ae60 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
1ae70 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72  LSEQ); VdbeCover
1ae80 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
1ae90 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1aea0 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c  eP5(v, zAff[0] |
1aeb0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
1aec0 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
1aed0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1aee0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1aef0 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20   regToFree);.   
1af00 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b   }.    if( regCk
1af10 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Null ){.      sq
1af20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1af30 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
1af40 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e  gCkNull, destIfN
1af50 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ull); VdbeCovera
1af60 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
1af70 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1af80 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1af90 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1afa0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1afb0 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20  v, labelOk);.   
1afc0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1afd0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1afe0 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 67  egCkNull);.    g
1aff0 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  oto sqlite3ExprC
1b000 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a  odeIN_finished;.
1b010 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 32    }..  /* Step 2
1b020 3a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  : Check to see i
1b030 66 20 74 68 65 20 4c 48 53 20 63 6f 6e 74 61 69  f the LHS contai
1b040 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c 75  ns any NULL colu
1b050 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  mns.  If the.  *
1b060 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f 6e 74 61  * LHS does conta
1b070 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e 20 74 68  in NULLs then th
1b080 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65  e result must be
1b090 20 65 69 74 68 65 72 20 46 41 4c 53 45 20 6f 72   either FALSE or
1b0a0 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20 77   NULL..  ** We w
1b0b0 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70 20 74 68  ill then skip th
1b0c0 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  e binary search 
1b0d0 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f  of the RHS..  */
1b0e0 0a 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c  .  if( destIfNul
1b0f0 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l==destIfFalse )
1b100 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70 32 20  {.    destStep2 
1b110 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  = destIfFalse;. 
1b120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 73 74   }else{.    dest
1b130 53 74 65 70 32 20 3d 20 64 65 73 74 53 74 65 70  Step2 = destStep
1b140 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  6 = sqlite3VdbeM
1b150 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
1b160 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1b170 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29   i<nVector; i++)
1b180 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
1b190 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
1b1a0 6c 64 53 75 62 65 78 70 72 28 70 45 78 70 72 2d  ldSubexpr(pExpr-
1b1b0 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
1b1c0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1b1d0 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20  anBeNull(p) ){. 
1b1e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b1f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
1b200 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73  ull, rLhs+i, des
1b210 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20 20 56  tStep2);.      V
1b220 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b230 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1b240 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c 48 53  Step 3.  The LHS
1b250 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f   is now known to
1b260 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44   be non-NULL.  D
1b270 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  o the binary sea
1b280 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  rch.  ** of the 
1b290 52 48 53 20 75 73 69 6e 67 20 74 68 65 20 4c 48  RHS using the LH
1b2a0 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20 20 49  S as a probe.  I
1b2b0 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72 65 73  f found, the res
1b2c0 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72 75 65  ult is.  ** true
1b2d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1b2e0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
1b2f0 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  ID ){.    /* In 
1b300 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52  this case, the R
1b310 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  HS is the ROWID 
1b320 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  of table b-tree 
1b330 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20  and so we also. 
1b340 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20     ** know that 
1b350 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e  the RHS is non-N
1b360 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65 20  ULL.  Hence, we 
1b370 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 33 20  combine steps 3 
1b380 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74  and 4.    ** int
1b390 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  o a single opcod
1b3a0 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
1b3b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1b3c0 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 54 61  P_SeekRowid, iTa
1b3d0 62 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  b, destIfFalse, 
1b3e0 72 4c 68 73 29 3b 0a 20 20 20 20 56 64 62 65 43  rLhs);.    VdbeC
1b3f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1b400 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71  addrTruthOp = sq
1b410 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
1b420 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f 2a  v, OP_Goto);  /*
1b430 20 52 65 74 75 72 6e 20 54 72 75 65 20 2a 2f 0a   Return True */.
1b440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1b450 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1b460 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72  , OP_Affinity, r
1b470 4c 68 73 2c 20 6e 56 65 63 74 6f 72 2c 20 30 2c  Lhs, nVector, 0,
1b480 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f 72 29 3b   zAff, nVector);
1b490 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66 46  .    if( destIfF
1b4a0 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c  alse==destIfNull
1b4b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d   ){.      /* Com
1b4c0 62 69 6e 65 20 53 74 65 70 20 33 20 61 6e 64 20  bine Step 3 and 
1b4d0 53 74 65 70 20 35 20 69 6e 74 6f 20 61 20 73 69  Step 5 into a si
1b4e0 6e 67 6c 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  ngle opcode */. 
1b4f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b500 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
1b510 4e 6f 74 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  NotFound, iTab, 
1b520 64 65 73 74 49 66 46 61 6c 73 65 2c 0a 20 20 20  destIfFalse,.   
1b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b540 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56          rLhs, nV
1b550 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65  ector); VdbeCove
1b560 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 67  rage(v);.      g
1b570 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  oto sqlite3ExprC
1b580 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a  odeIN_finished;.
1b590 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72 64      }.    /* Ord
1b5a0 69 6e 61 72 79 20 53 74 65 70 20 33 2c 20 66 6f  inary Step 3, fo
1b5b0 72 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  r the case where
1b5c0 20 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c 20   FALSE and NULL 
1b5d0 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  are distinct */.
1b5e0 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70 20      addrTruthOp 
1b5f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1b600 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
1b610 6e 64 2c 20 69 54 61 62 2c 20 30 2c 0a 20 20 20  nd, iTab, 0,.   
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72     rLhs, nVector
1b650 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1b660 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  v);.  }..  /* St
1b670 65 70 20 34 2e 20 20 49 66 20 74 68 65 20 52 48  ep 4.  If the RH
1b680 53 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65  S is known to be
1b690 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65   non-NULL and we
1b6a0 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20   did not find.  
1b6b0 2a 2a 20 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74  ** an match on t
1b6c0 68 65 20 73 65 61 72 63 68 20 61 62 6f 76 65 2c  he search above,
1b6d0 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
1b6e0 20 6d 75 73 74 20 62 65 20 46 41 4c 53 45 2e 0a   must be FALSE..
1b6f0 20 20 2a 2f 0a 20 20 69 66 28 20 72 52 68 73 48    */.  if( rRhsH
1b700 61 73 4e 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f  asNull && nVecto
1b710 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==1 ){.    sqli
1b720 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b730 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68   OP_NotNull, rRh
1b740 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66  sHasNull, destIf
1b750 46 61 6c 73 65 29 3b 0a 20 20 20 20 56 64 62 65  False);.    Vdbe
1b760 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
1b770 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35 2e 20 20  ..  /* Step 5.  
1b780 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  If we do not car
1b790 65 20 61 62 6f 75 74 20 74 68 65 20 64 69 66 66  e about the diff
1b7a0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 4e  erence between N
1b7b0 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c  ULL and.  ** FAL
1b7c0 53 45 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  SE, then just re
1b7d0 74 75 72 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a  turn false. .  *
1b7e0 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 46 61  /.  if( destIfFa
1b7f0 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
1b800 29 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74  ) sqlite3VdbeGot
1b810 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  o(v, destIfFalse
1b820 29 3b 0a 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a  );..  /* Step 6:
1b830 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 72 6f   Loop through ro
1b840 77 73 20 6f 66 20 74 68 65 20 52 48 53 2e 20 20  ws of the RHS.  
1b850 43 6f 6d 70 61 72 65 20 65 61 63 68 20 72 6f 77  Compare each row
1b860 20 74 6f 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a   to the LHS..  *
1b870 2a 20 49 66 20 61 6e 79 20 63 6f 6d 70 61 72 69  * If any compari
1b880 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  son is NULL, the
1b890 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
1b8a0 4e 55 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20  NULL.  If all.  
1b8b0 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61  ** comparisons a
1b8c0 72 65 20 46 41 4c 53 45 20 74 68 65 6e 20 74 68  re FALSE then th
1b8d0 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 69  e final result i
1b8e0 73 20 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20  s FALSE..  **.  
1b8f0 2a 2a 20 46 6f 72 20 61 20 73 63 61 6c 61 72 20  ** For a scalar 
1b900 4c 48 53 2c 20 69 74 20 69 73 20 73 75 66 66 69  LHS, it is suffi
1b910 63 69 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a  cient to check j
1b920 75 73 74 20 74 68 65 20 66 69 72 73 74 20 72 6f  ust the first ro
1b930 77 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48  w.  ** of the RH
1b940 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  S..  */.  if( de
1b950 73 74 53 74 65 70 36 20 29 20 73 71 6c 69 74 65  stStep6 ) sqlite
1b960 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1b970 6c 28 76 2c 20 64 65 73 74 53 74 65 70 36 29 3b  l(v, destStep6);
1b980 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
1b990 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b9a0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
1b9b0 62 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  b, destIfFalse);
1b9c0 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
1b9d0 76 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f  v);.  if( nVecto
1b9e0 72 3e 31 20 29 7b 0a 20 20 20 20 64 65 73 74 4e  r>1 ){.    destN
1b9f0 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  otNull = sqlite3
1ba00 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
1ba10 61 72 73 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  arse);.  }else{.
1ba20 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74      /* For nVect
1ba30 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73  or==1, combine s
1ba40 74 65 70 73 20 36 20 61 6e 64 20 37 20 62 79 20  teps 6 and 7 by 
1ba50 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
1ba60 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c  rning.    ** FAL
1ba70 53 45 20 69 66 20 74 68 65 20 66 69 72 73 74 20  SE if the first 
1ba80 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f  comparison is no
1ba90 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65  t NULL */.    de
1baa0 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74  stNotNull = dest
1bab0 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66  IfFalse;.  }.  f
1bac0 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
1bad0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
1bae0 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65  r *p;.    CollSe
1baf0 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e  q *pColl;.    in
1bb00 74 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65  t r3 = sqlite3Ge
1bb10 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
1bb20 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
1bb30 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
1bb40 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20  xpr(pLeft, i);. 
1bb50 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1bb60 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1bb70 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73 71  arse, p);.    sq
1bb80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1bb90 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
1bba0 61 62 2c 20 69 2c 20 72 33 29 3b 0a 20 20 20 20  ab, i, r3);.    
1bbb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bbc0 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73  4(v, OP_Ne, rLhs
1bbd0 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c  +i, destNotNull,
1bbe0 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r3,.           
1bbf0 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
1bc00 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
1bc10 53 45 51 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  SEQ);.    VdbeCo
1bc20 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1bc30 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1bc40 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29  pReg(pParse, r3)
1bc50 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
1bc60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1bc70 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e  Goto, 0, destIfN
1bc80 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 56 65 63  ull);.  if( nVec
1bc90 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  tor>1 ){.    sql
1bca0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1bcb0 61 62 65 6c 28 76 2c 20 64 65 73 74 4e 6f 74 4e  abel(v, destNotN
1bcc0 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
1bcd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1bce0 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
1bcf0 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64  drTop+1);.    Vd
1bd00 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
1bd10 20 20 20 20 2f 2a 20 53 74 65 70 20 37 3a 20 20      /* Step 7:  
1bd20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
1bd30 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20   point, we know 
1bd40 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
1bd50 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 66  must.    ** be f
1bd60 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  alse. */.    sql
1bd70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1bd80 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
1bd90 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a  stIfFalse);.  }.
1bda0 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65  .  /* Jumps here
1bdb0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 74   in order to ret
1bdc0 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73  urn true. */.  s
1bdd0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1bde0 72 65 28 76 2c 20 61 64 64 72 54 72 75 74 68 4f  re(v, addrTruthO
1bdf0 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70 72  p);..sqlite3Expr
1be00 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a  CodeIN_finished:
1be10 0a 20 20 69 66 28 20 72 4c 68 73 21 3d 72 4c 68  .  if( rLhs!=rLh
1be20 73 4f 72 69 67 20 29 20 73 71 6c 69 74 65 33 52  sOrig ) sqlite3R
1be30 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1be40 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 56  arse, rLhs);.  V
1be50 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1be60 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  end IN expr"));.
1be70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1be80 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73  N_oom_error:.  s
1be90 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
1bea0 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b  rse->db, aiMap);
1beb0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1bec0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66  (pParse->db, zAf
1bed0 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  f);.}.#endif /* 
1bee0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1bef0 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
1bf00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1bf10 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a  ATING_POINT./*.*
1bf20 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
1bf30 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
1bf40 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61  ill put the floa
1bf50 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
1bf60 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79  lue described by
1bf70 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
1bf80 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
1bf90 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72  *.** The z[] str
1bfa0 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ing will probabl
1bfb0 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65  y not be zero-te
1bfc0 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
1bfd0 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72  he .** z[n] char
1bfe0 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74  acter is guarant
1bff0 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  eed to be someth
1c000 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ing that does no
1c010 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74  t look.** like t
1c020 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
1c030 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a  of the number..*
1c040 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
1c050 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20  deReal(Vdbe *v, 
1c060 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
1c070 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69  nt negateFlag, i
1c080 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20  nt iMem){.  if( 
1c090 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a  ALWAYS(z!=0) ){.
1c0a0 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65      double value
1c0b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  ;.    sqlite3Ato
1c0c0 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c  F(z, &value, sql
1c0d0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
1c0e0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
1c0f0 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69     assert( !sqli
1c100 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20  te3IsNaN(value) 
1c110 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74  ); /* The new At
1c120 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73  oF never returns
1c130 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20   NaN */.    if( 
1c140 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c  negateFlag ) val
1c150 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20  ue = -value;.   
1c160 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c170 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61  p4Dup8(v, OP_Rea
1c180 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28  l, 0, iMem, 0, (
1c190 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52  u8*)&value, P4_R
1c1a0 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  EAL);.  }.}.#end
1c1b0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  if.../*.** Gener
1c1c0 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
1c1d0 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
1c1e0 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
1c1f0 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
1c200 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
1c210 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
1c220 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  *.** Expr.u.zTok
1c230 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46  en is always UTF
1c240 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69  8 and zero-termi
1c250 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  nated..*/.static
1c260 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65   void codeIntege
1c270 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1c280 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1c290 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69  t negFlag, int i
1c2a0 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Mem){.  Vdbe *v 
1c2b0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1c2c0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
1c2d0 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
1c2e0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  e ){.    int i =
1c2f0 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
1c300 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ;.    assert( i>
1c310 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  =0 );.    if( ne
1c320 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a  gFlag ) i = -i;.
1c330 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c340 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1c350 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20  ger, i, iMem);. 
1c360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1c370 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65  c;.    i64 value
1c380 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1c390 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a   *z = pExpr->u.z
1c3a0 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  Token;.    asser
1c3b0 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63  t( z!=0 );.    c
1c3c0 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48   = sqlite3DecOrH
1c3d0 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75  exToI64(z, &valu
1c3e0 65 29 3b 0a 20 20 20 20 69 66 28 20 28 63 3d 3d  e);.    if( (c==
1c3f0 33 20 26 26 20 21 6e 65 67 46 6c 61 67 29 20 7c  3 && !negFlag) |
1c400 7c 20 28 63 3d 3d 32 29 20 7c 7c 20 28 6e 65 67  | (c==2) || (neg
1c410 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d 3d 53  Flag && value==S
1c420 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b  MALLEST_INT64)){
1c430 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
1c440 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1c450 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  NT.      sqlite3
1c460 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1c470 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65   "oversized inte
1c480 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46  ger: %s%s", negF
1c490 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20  lag ? "-" : "", 
1c4a0 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65  z);.#else.#ifnde
1c4b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45  f SQLITE_OMIT_HE
1c4c0 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20  X_INTEGER.      
1c4d0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
1c4e0 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d  icmp(z,"0x",2)==
1c4f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1c500 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c510 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61  rse, "hex litera
1c520 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25 73 22  l too big: %s%s"
1c530 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22  , negFlag?"-":""
1c540 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ,z);.      }else
1c550 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
1c560 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c          codeReal
1c570 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20  (v, z, negFlag, 
1c580 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  iMem);.      }.#
1c590 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
1c5a0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c  .      if( negFl
1c5b0 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d  ag ){ value = c=
1c5c0 3d 33 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e  =3 ? SMALLEST_IN
1c5d0 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a  T64 : -value; }.
1c5e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c5f0 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
1c600 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d  P_Int64, 0, iMem
1c610 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65  , 0, (u8*)&value
1c620 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20  , P4_INT64);.   
1c630 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65   }.  }.}.../* Ge
1c640 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1c650 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20   will load into 
1c660 72 65 67 69 73 74 65 72 20 72 65 67 4f 75 74 20  register regOut 
1c670 61 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a  a value that is.
1c680 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ** appropriate f
1c690 6f 72 20 74 68 65 20 69 49 64 78 43 6f 6c 2d 74  or the iIdxCol-t
1c6a0 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  h column of inde
1c6b0 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20  x pIdx..*/.void 
1c6c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c  sqlite3ExprCodeL
1c6d0 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a  oadIndexColumn(.
1c6e0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1c6f0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1c700 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
1c710 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a  dex *pIdx,    /*
1c720 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65   The index whose
1c730 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65   column is to be
1c740 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74   loaded */.  int
1c750 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20   iTabCur,    /* 
1c760 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1c770 74 6f 20 61 20 74 61 62 6c 65 20 72 6f 77 20 2a  to a table row *
1c780 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c  /.  int iIdxCol,
1c790 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d      /* The colum
1c7a0 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  n of the index t
1c7b0 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  o be loaded */. 
1c7c0 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20   int regOut     
1c7d0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e   /* Store the in
1c7e0 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  dex column value
1c7f0 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
1c800 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54  r */.){.  i16 iT
1c810 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69  abCol = pIdx->ai
1c820 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b  Column[iIdxCol];
1c830 0a 20 20 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d  .  if( iTabCol==
1c840 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 61  XN_EXPR ){.    a
1c850 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f  ssert( pIdx->aCo
1c860 6c 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73  lExpr );.    ass
1c870 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45  ert( pIdx->aColE
1c880 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43  xpr->nExpr>iIdxC
1c890 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ol );.    pParse
1c8a0 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 54 61  ->iSelfTab = iTa
1c8b0 62 43 75 72 20 2b 20 31 3b 0a 20 20 20 20 73 71  bCur + 1;.    sq
1c8c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
1c8d0 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  y(pParse, pIdx->
1c8e0 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78  aColExpr->a[iIdx
1c8f0 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f  Col].pExpr, regO
1c900 75 74 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ut);.    pParse-
1c910 3e 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20  >iSelfTab = 0;. 
1c920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1c930 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1c940 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72  lumnOfTable(pPar
1c950 73 65 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d  se->pVdbe, pIdx-
1c960 3e 70 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72  >pTable, iTabCur
1c970 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c990 20 20 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72        iTabCol, r
1c9a0 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  egOut);.  }.}../
1c9b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1c9c0 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
1c9d0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
1c9e0 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
1c9f0 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
1ca00 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1ca10 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1ca20 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  e(.  Vdbe *v,   
1ca30 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
1ca40 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1ca50 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ion */.  Table *
1ca60 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20  pTab,    /* The 
1ca70 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1ca80 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20   the value */.  
1ca90 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20  int iTabCur,    
1caa0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75 72  /* The table cur
1cab0 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20  sor.  Or the PK 
1cac0 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f  cursor for WITHO
1cad0 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e  UT ROWID */.  in
1cae0 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a  t iCol,       /*
1caf0 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   Index of the co
1cb00 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20  lumn to extract 
1cb10 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20  */.  int regOut 
1cb20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
1cb30 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  the value into t
1cb40 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
1cb50 29 7b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  ){.  if( pTab==0
1cb60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1cb70 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1cb80 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 43 75 72 2c  Column, iTabCur,
1cb90 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   iCol, regOut);.
1cba0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1cbb0 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20    if( iCol<0 || 
1cbc0 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  iCol==pTab->iPKe
1cbd0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
1cbe0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cbf0 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c  _Rowid, iTabCur,
1cc00 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73   regOut);.  }els
1cc10 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  e{.    int op = 
1cc20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
1cc30 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f  ? OP_VColumn : O
1cc40 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e  P_Column;.    in
1cc50 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  t x = iCol;.    
1cc60 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
1cc70 61 62 29 20 26 26 20 21 49 73 56 69 72 74 75 61  ab) && !IsVirtua
1cc80 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
1cc90 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
1cca0 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65  mnOfIndex(sqlite
1ccb0 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
1ccc0 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20  (pTab), iCol);. 
1ccd0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1cce0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
1ccf0 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65  , iTabCur, x, re
1cd00 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  gOut);.  }.  if(
1cd10 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
1cd20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66  sqlite3ColumnDef
1cd30 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43  ault(v, pTab, iC
1cd40 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
1cd50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1cd60 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1cd70 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43  l extract the iC
1cd80 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
1cd90 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54  from.** table pT
1cda0 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ab and store the
1cdb0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
1cdc0 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 20   register iReg. 
1cdd0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
1cde0 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
1cdf0 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69  sor to pTab in i
1ce00 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20  Table when this 
1ce10 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
1ce20 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d  lled.  If iColum
1ce30 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  n<0 then code is
1ce40 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20   generated that 
1ce50 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77  extracts the row
1ce60 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  id..*/.int sqlit
1ce70 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1ce80 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
1ce90 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
1cea0 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
1ceb0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
1cec0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
1ced0 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
1cee0 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
1cef0 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
1cf00 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
1cf10 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
1cf20 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
1cf30 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
1cf40 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
1cf50 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
1cf60 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
1cf70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c  e */.  int iReg,
1cf80 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
1cf90 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
1cfa0 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20  .  u8 p5        
1cfb0 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20      /* P5 value 
1cfc0 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20  for OP_Column + 
1cfd0 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64  FLAGS */.){.  Vd
1cfe0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1cff0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
1d000 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
1d010 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1d020 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
1d030 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  ab, iTable, iCol
1d040 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66  umn, iReg);.  if
1d050 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( p5 ){.    sqli
1d060 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1d070 76 2c 20 70 35 29 3b 0a 20 20 7d 0a 20 20 72 65  v, p5);.  }.  re
1d080 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a  turn iReg;.}../*
1d090 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1d0a0 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e  e to move conten
1d0b0 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73  t from registers
1d0c0 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e   iFrom...iFrom+n
1d0d0 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f  Reg-1.** over to
1d0e0 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31   iTo..iTo+nReg-1
1d0f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d100 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61  3ExprCodeMove(Pa
1d110 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1d120 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
1d130 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73   int nReg){.  as
1d140 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f  sert( iFrom>=iTo
1d150 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e  +nReg || iFrom+n
1d160 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71  Reg<=iTo );.  sq
1d170 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1d180 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1d190 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69  P_Move, iFrom, i
1d1a0 54 6f 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 2f 2a  To, nReg);.}../*
1d1b0 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63  .** Convert a sc
1d1c0 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  alar expression 
1d1d0 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47  node to a TK_REG
1d1e0 49 53 54 45 52 20 72 65 66 65 72 65 6e 63 69 6e  ISTER referencin
1d1f0 67 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 52  g.** register iR
1d200 65 67 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20  eg.  The caller 
1d210 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
1d220 20 69 52 65 67 20 61 6c 72 65 61 64 79 20 63 6f   iReg already co
1d230 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f  ntains.** the co
1d240 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
1d250 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
1d260 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1d270 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78  xprToRegister(Ex
1d280 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29  pr *p, int iReg)
1d290 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e  {.  p->op2 = p->
1d2a0 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  op;.  p->op = TK
1d2b0 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e  _REGISTER;.  p->
1d2c0 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20  iTable = iReg;. 
1d2d0 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
1d2e0 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a  ty(p, EP_Skip);.
1d2f0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74  }../*.** Evaluat
1d300 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
1d310 28 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72  (either a vector
1d320 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70   or a scalar exp
1d330 72 65 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f  ression) and sto
1d340 72 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  re.** the result
1d350 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20   in continguous 
1d360 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1d370 65 72 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ers.  Return the
1d380 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
1d390 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
1d3a0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
1d3b0 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
1d3c0 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  If the returned 
1d3d0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
1d3e0 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73  is a temporary s
1d3f0 63 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f  calar, then also
1d400 20 77 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72   write.** that r
1d410 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69  egister number i
1d420 6e 74 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e  nto *piFreeable.
1d430 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65    If the returne
1d440 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  d result registe
1d450 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65  r.** is not a te
1d460 6d 70 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68  mporary or if th
1d470 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1d480 61 20 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69  a vector set *pi
1d490 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30  Freeable.** to 0
1d4a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d4b0 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50  exprCodeVector(P
1d4c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1d4d0 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72  pr *p, int *piFr
1d4e0 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  eeable){.  int i
1d4f0 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52  Result;.  int nR
1d500 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45  esult = sqlite3E
1d510 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29  xprVectorSize(p)
1d520 3b 0a 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d  ;.  if( nResult=
1d530 3d 31 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c  =1 ){.    iResul
1d540 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
1d550 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1d560 70 2c 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a  p, piFreeable);.
1d570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69    }else{.    *pi
1d580 46 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20  Freeable = 0;.  
1d590 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
1d5a0 53 45 4c 45 43 54 20 29 7b 0a 23 69 66 20 53 51  SELECT ){.#if SQ
1d5b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1d5c0 52 59 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74  RY.      iResult
1d5d0 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20   = 0;.#else.    
1d5e0 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69    iResult = sqli
1d5f0 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
1d600 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 23 65 6e  (pParse, p);.#en
1d610 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
1d620 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1d630 20 20 69 52 65 73 75 6c 74 20 3d 20 70 50 61 72    iResult = pPar
1d640 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
1d650 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1d660 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20 20  = nResult;.     
1d670 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73   for(i=0; i<nRes
1d680 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ult; i++){.     
1d690 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1d6a0 64 65 46 61 63 74 6f 72 61 62 6c 65 28 70 50 61  deFactorable(pPa
1d6b0 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2d  rse, p->x.pList-
1d6c0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 2b 69  >a[i].pExpr, i+i
1d6d0 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
1d6e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1d6f0 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a  urn iResult;.}..
1d700 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1d710 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75  code into the cu
1d720 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76  rrent Vdbe to ev
1d730 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e  aluate the given
1d740 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .** expression. 
1d750 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72   Attempt to stor
1d760 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
1d770 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65   register "targe
1d780 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  t"..** Return th
1d790 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65  e register where
1d7a0 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
1d7b0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  red..**.** With 
1d7c0 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
1d7d0 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e  ere is no guaran
1d7e0 74 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73  tee that results
1d7f0 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72   will.** be stor
1d800 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54  ed in target.  T
1d810 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20  he result might 
1d820 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d  be stored in som
1d830 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73  e other.** regis
1d840 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e  ter if it is con
1d850 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f  venient to do so
1d860 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
1d870 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
1d880 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
1d890 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74   code and move t
1d8a0 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68  he results to th
1d8b0 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67  e desired.** reg
1d8c0 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
1d8d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1d8e0 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  get(Parse *pPars
1d8f0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1d900 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
1d910 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1d920 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20  >pVdbe;  /* The 
1d930 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  VM under constru
1d940 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ction */.  int o
1d950 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1d960 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
1d970 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  de being coded *
1d980 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20  /.  int inReg = 
1d990 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a  target;       /*
1d9a0 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20   Results stored 
1d9b0 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65  in register inRe
1d9c0 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  g */.  int regFr
1d9d0 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee1 = 0;        
1d9e0 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
1d9f0 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
1da00 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
1da10 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
1da20 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
1da30 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
1da40 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
1da50 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
1da60 20 72 31 2c 20 72 32 3b 20 20 20 20 20 20 20 20   r1, r2;        
1da70 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
1da80 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  s register numbe
1da90 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d  rs */.  Expr tem
1daa0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
1dab0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65    /* Temporary e
1dac0 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a  xpression node *
1dad0 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a  /.  int p5 = 0;.
1dae0 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
1daf0 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
1db00 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
1db10 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
1db20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1db30 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1db40 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d );.    return 
1db50 30 3b 0a 20 20 7d 0a 0a 65 78 70 72 5f 63 6f 64  0;.  }..expr_cod
1db60 65 5f 64 6f 6f 76 65 72 3a 0a 20 20 69 66 28 20  e_doover:.  if( 
1db70 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
1db80 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1db90 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
1dba0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20  pExpr->op;.  }. 
1dbb0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1dbc0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
1dbd0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41  OLUMN: {.      A
1dbe0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1dbf0 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
1dc00 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  fo;.      struct
1dc10 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
1dc20 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
1dc30 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67  aCol[pExpr->iAgg
1dc40 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41  ];.      if( !pA
1dc50 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
1dc60 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  de ){.        as
1dc70 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d  sert( pCol->iMem
1dc80 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  >0 );.        re
1dc90 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b  turn pCol->iMem;
1dca0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1dcb0 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f   pAggInfo->useSo
1dcc0 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20  rtingIdx ){.    
1dcd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1dce0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
1dcf0 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f  mn, pAggInfo->so
1dd00 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20  rtingIdxPTab,.  
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1dd30 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c  ->iSorterColumn,
1dd40 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1dd50 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1dd60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
1dd70 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c  * Otherwise, fal
1dd80 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
1dd90 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a  TK_COLUMN case *
1dda0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
1ddb0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
1ddc0 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70      int iTab = p
1ddd0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
1dde0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1ddf0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1de00 50 5f 46 69 78 65 64 43 6f 6c 29 20 29 7b 0a 20  P_FixedCol) ){. 
1de10 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 43         /* This C
1de20 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e  OLUMN expression
1de30 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6e   is really a con
1de40 73 74 61 6e 74 20 64 75 65 20 74 6f 20 57 48 45  stant due to WHE
1de50 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  RE clause.      
1de60 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73    ** constraints
1de70 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 6e 73 74  , and that const
1de80 61 6e 74 20 69 73 20 63 6f 64 65 64 20 62 79 20  ant is coded by 
1de90 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  the pExpr->pLeft
1dea0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72  .        ** expr
1deb0 65 73 73 73 69 6f 6e 2e 20 20 48 6f 77 65 76 65  esssion.  Howeve
1dec0 72 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  r, make sure the
1ded0 20 63 6f 6e 73 74 61 6e 74 20 68 61 73 20 74 68   constant has th
1dee0 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20  e correct.      
1def0 20 20 2a 2a 20 64 61 74 61 74 79 70 65 20 62 79    ** datatype by
1df00 20 61 70 70 6c 79 69 6e 67 20 74 68 65 20 41 66   applying the Af
1df10 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 74 61  finity of the ta
1df20 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  ble column to th
1df30 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  e.        ** con
1df40 73 74 61 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a  stant..        *
1df50 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
1df60 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
1df70 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
1df80 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1df90 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1dfa0 20 69 6e 74 20 61 66 66 20 3d 20 73 71 6c 69 74   int aff = sqlit
1dfb0 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66  e3TableColumnAff
1dfc0 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 79 2e 70  inity(pExpr->y.p
1dfd0 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  Tab, pExpr->iCol
1dfe0 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  umn);.        if
1dff0 28 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  ( aff!=SQLITE_AF
1e000 46 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20  F_BLOB ){.      
1e010 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1e020 20 63 68 61 72 20 7a 41 66 66 5b 5d 20 3d 20 22   char zAff[] = "
1e030 42 5c 30 30 30 43 5c 30 30 30 44 5c 30 30 30 45  B\000C\000D\000E
1e040 22 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ";.          ass
1e050 65 72 74 28 20 53 51 4c 49 54 45 5f 41 46 46 5f  ert( SQLITE_AFF_
1e060 42 4c 4f 42 3d 3d 27 41 27 20 29 3b 0a 20 20 20  BLOB=='A' );.   
1e070 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53         assert( S
1e080 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3d 3d  QLITE_AFF_TEXT==
1e090 27 42 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20  'B' );.         
1e0a0 20 69 66 28 20 69 52 65 67 21 3d 74 61 72 67 65   if( iReg!=targe
1e0b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
1e0c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e0d0 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
1e0e0 69 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20  iReg, target);. 
1e0f0 20 20 20 20 20 20 20 20 20 20 20 69 52 65 67 20             iReg 
1e100 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
1e110 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e120 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e130 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79  4(v, OP_Affinity
1e140 2c 20 69 52 65 67 2c 20 31 2c 20 30 2c 0a 20 20  , iReg, 1, 0,.  
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e160 20 20 20 20 20 20 20 20 20 20 26 7a 41 66 66 5b            &zAff[
1e170 28 61 66 66 2d 27 42 27 29 2a 32 5d 2c 20 50 34  (aff-'B')*2], P4
1e180 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
1e190 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
1e1a0 72 6e 20 69 52 65 67 3b 0a 20 20 20 20 20 20 7d  rn iReg;.      }
1e1b0 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c  .      if( iTab<
1e1c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1e1d0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
1e1e0 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  b<0 ){.         
1e1f0 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43   /* Generating C
1e200 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
1e210 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e   or inserting in
1e220 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78  to partial index
1e230 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65   */.          re
1e240 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c  turn pExpr->iCol
1e250 75 6d 6e 20 2d 20 70 50 61 72 73 65 2d 3e 69 53  umn - pParse->iS
1e260 65 6c 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20  elfTab;.        
1e270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e280 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78   /* Coding an ex
1e290 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
1e2a0 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65   part of an inde
1e2b0 78 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e  x where column n
1e2c0 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ames.          *
1e2d0 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72  * in the index r
1e2e0 65 66 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c  efer to the tabl
1e2f0 65 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69  e to which the i
1e300 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a  ndex belongs */.
1e310 20 20 20 20 20 20 20 20 20 20 69 54 61 62 20 3d            iTab =
1e320 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
1e330 62 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  b - 1;.        }
1e340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1e350 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
1e360 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
1e370 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 79 2e  Parse, pExpr->y.
1e380 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  pTab,.          
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
1e3b0 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65  umn, iTab, targe
1e3c0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3e0 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20    pExpr->op2);. 
1e3f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e400 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
1e410 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50    codeInteger(pP
1e420 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20  arse, pExpr, 0, 
1e430 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
1e440 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1e450 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e460 54 52 55 45 46 41 4c 53 45 3a 20 7b 0a 20 20 20  TRUEFALSE: {.   
1e470 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e480 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1e490 65 72 2c 20 73 71 6c 69 74 65 33 45 78 70 72 54  er, sqlite3ExprT
1e4a0 72 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 29  ruthValue(pExpr)
1e4b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e4c0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1e4d0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1e4e0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1e4f0 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73  NG_POINT.    cas
1e500 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
1e510 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1e520 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1e530 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1e540 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65   );.      codeRe
1e550 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  al(v, pExpr->u.z
1e560 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74  Token, 0, target
1e570 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e580 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65  target;.    }.#e
1e590 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
1e5a0 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
1e5b0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1e5c0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1e5d0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1e5e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e5f0 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
1e600 74 61 72 67 65 74 2c 20 70 45 78 70 72 2d 3e 75  target, pExpr->u
1e610 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1e620 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1e630 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e640 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _NULL: {.      s
1e650 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e660 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
1e670 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
1e680 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1e690 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1e6a0 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
1e6b0 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b  ERAL.    case TK
1e6c0 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69  _BLOB: {.      i
1e6d0 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  nt n;.      cons
1e6e0 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
1e6f0 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20   char *zBlob;.  
1e700 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1e710 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1e720 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1e730 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e740 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1e750 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78  n[0]=='x' || pEx
1e760 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
1e770 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73  ='X' );.      as
1e780 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1e790 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29  Token[1]=='\'' )
1e7a0 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78  ;.      z = &pEx
1e7b0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b  pr->u.zToken[2];
1e7c0 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
1e7d0 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20  e3Strlen30(z) - 
1e7e0 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
1e7f0 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20   z[n]=='\'' );. 
1e800 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c       zBlob = sql
1e810 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71  ite3HexToBlob(sq
1e820 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
1e830 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  z, n);.      sql
1e840 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1e850 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20  , OP_Blob, n/2, 
1e860 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62  target, 0, zBlob
1e870 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
1e880 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1e890 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  et;.    }.#endif
1e8a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
1e8b0 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61  IABLE: {.      a
1e8c0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1e8d0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e8e0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1e8f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1e900 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20  pr->u.zToken!=0 
1e910 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e920 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e930 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]!=0 );.      
1e940 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e950 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65  2(v, OP_Variable
1e960 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1e970 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e980 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54   if( pExpr->u.zT
1e990 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20  oken[1]!=0 ){.  
1e9a0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1e9b0 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 56 4c 69   *z = sqlite3VLi
1e9c0 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72  stNumToName(pPar
1e9d0 73 65 2d 3e 70 56 4c 69 73 74 2c 20 70 45 78 70  se->pVList, pExp
1e9e0 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  r->iColumn);.   
1e9f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1ea00 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
1ea10 3d 27 3f 27 20 7c 7c 20 73 74 72 63 6d 70 28 70  ='?' || strcmp(p
1ea20 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
1ea30 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  z)==0 );.       
1ea40 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 5b   pParse->pVList[
1ea50 30 5d 20 3d 20 30 3b 20 2f 2a 20 49 6e 64 69 63  0] = 0; /* Indic
1ea60 61 74 65 20 56 4c 69 73 74 20 6d 61 79 20 6e 6f  ate VList may no
1ea70 20 6c 6f 6e 67 65 72 20 62 65 20 65 6e 6c 61 72   longer be enlar
1ea80 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  ged */.        s
1ea90 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
1eaa0 50 34 28 76 2c 20 28 63 68 61 72 2a 29 7a 2c 20  P4(v, (char*)z, 
1eab0 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
1eac0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1ead0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20   target;.    }. 
1eae0 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
1eaf0 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  TER: {.      ret
1eb00 75 72 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  urn pExpr->iTabl
1eb10 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  e;.    }.#ifndef
1eb20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
1eb30 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  T.    case TK_CA
1eb40 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ST: {.      /* E
1eb50 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
1eb60 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70  e form:   CAST(p
1eb70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a  Left AS token) *
1eb80 2f 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  /.      inReg = 
1eb90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1eba0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
1ebb0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
1ebc0 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  et);.      if( i
1ebd0 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a  nReg!=target ){.
1ebe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ebf0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ec00 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
1ec10 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  rget);.        i
1ec20 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
1ec30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1ec40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ec50 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65  , OP_Cast, targe
1ec60 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1ec70 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1ec80 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
1ec90 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
1eca0 30 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0));.      retur
1ecb0 6e 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23  n inReg;.    }.#
1ecc0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1ecd0 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
1ece0 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
1ecf0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a   case TK_ISNOT:.
1ed00 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
1ed10 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
1ed20 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35   TK_NE;.      p5
1ed30 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
1ed40 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d  ;.      /* fall-
1ed50 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63  through */.    c
1ed60 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
1ed70 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
1ed80 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
1ed90 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
1eda0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
1edb0 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
1edc0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
1edd0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
1ede0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1edf0 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 4c 65  ExprIsVector(pLe
1ee00 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ft) ){.        c
1ee10 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65  odeVectorCompare
1ee20 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1ee30 74 61 72 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b  target, op, p5);
1ee40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ee50 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1ee60 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1ee70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72  Parse, pLeft, &r
1ee80 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1ee90 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1eea0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1eeb0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1eec0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1eed0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1eee0 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
1eef0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1ef00 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
1ef10 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
1ef20 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20  QLITE_STOREP2 | 
1ef30 70 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  p5);.        ass
1ef40 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
1ef50 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1ef60 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
1ef70 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1ef80 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Lt);.        ass
1ef90 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
1efa0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1efb0 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
1efc0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1efd0 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Le);.        ass
1efe0 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
1eff0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f000 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
1f010 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f020 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Gt);.        ass
1f030 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
1f040 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f050 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
1f060 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f070 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Ge);.        ass
1f080 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
1f090 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f0a0 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65  OP_Eq); VdbeCove
1f0b0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f0c0 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Eq);.        ass
1f0d0 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  ert(TK_NE==OP_Ne
1f0e0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f0f0 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ne); VdbeCove
1f100 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f110 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  Ne);.        tes
1f120 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1f130 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
1f140 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1f150 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
1f160 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f170 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  }.    case TK_AN
1f180 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  D:.    case TK_O
1f190 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  R:.    case TK_P
1f1a0 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  LUS:.    case TK
1f1b0 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20  _STAR:.    case 
1f1c0 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61  TK_MINUS:.    ca
1f1d0 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63  se TK_REM:.    c
1f1e0 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20  ase TK_BITAND:. 
1f1f0 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52     case TK_BITOR
1f200 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  :.    case TK_SL
1f210 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ASH:.    case TK
1f220 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73  _LSHIFT:.    cas
1f230 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20  e TK_RSHIFT: .  
1f240 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54    case TK_CONCAT
1f250 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1f260 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64  ( TK_AND==OP_And
1f270 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74   );            t
1f280 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f290 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AND );.      ass
1f2a0 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f  ert( TK_OR==OP_O
1f2b0 72 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  r );            
1f2c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f2d0 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61  TK_OR );.      a
1f2e0 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d  ssert( TK_PLUS==
1f2f0 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20  OP_Add );       
1f300 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f310 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20  ==TK_PLUS );.   
1f320 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49     assert( TK_MI
1f330 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74  NUS==OP_Subtract
1f340 20 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65   );     testcase
1f350 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29  ( op==TK_MINUS )
1f360 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f370 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69  TK_REM==OP_Remai
1f380 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73  nder );      tes
1f390 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45  tcase( op==TK_RE
1f3a0 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  M );.      asser
1f3b0 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50  t( TK_BITAND==OP
1f3c0 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20  _BitAnd );      
1f3d0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f3e0 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20  _BITAND );.     
1f3f0 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f   assert( TK_BITO
1f400 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20  R==OP_BitOr );  
1f410 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f420 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a  op==TK_BITOR );.
1f430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f440 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64  _SLASH==OP_Divid
1f450 65 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63  e );       testc
1f460 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53  ase( op==TK_SLAS
1f470 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  H );.      asser
1f480 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50  t( TK_LSHIFT==OP
1f490 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20  _ShiftLeft );   
1f4a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f4b0 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _LSHIFT );.     
1f4c0 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49   assert( TK_RSHI
1f4d0 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68  FT==OP_ShiftRigh
1f4e0 74 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  t );  testcase( 
1f4f0 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b  op==TK_RSHIFT );
1f500 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f510 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e  K_CONCAT==OP_Con
1f520 63 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74  cat );      test
1f530 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e  case( op==TK_CON
1f540 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  CAT );.      r1 
1f550 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f560 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f570 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1f580 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1f590 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f5a0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f5b0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1f5c0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1f5d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f5e0 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c  3(v, op, r2, r1,
1f5f0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1f600 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f610 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1f620 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f630 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1f640 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f650 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
1f660 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
1f670 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
1f680 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1f690 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20   pLeft );.      
1f6a0 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
1f6b0 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
1f6c0 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
1f6d0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1f6e0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1f6f0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1f700 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  t;.#ifndef SQLIT
1f710 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1f720 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73  POINT.      }els
1f730 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d  e if( pLeft->op=
1f740 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
1f750 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1f760 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1f770 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1f780 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  ) );.        cod
1f790 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e  eReal(v, pLeft->
1f7a0 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72  u.zToken, 1, tar
1f7b0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  get);.        re
1f7c0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e  turn target;.#en
1f7d0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dif.      }else{
1f7e0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f  .        tempX.o
1f7f0 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a  p = TK_INTEGER;.
1f800 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c          tempX.fl
1f810 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75  ags = EP_IntValu
1f820 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  e|EP_TokenOnly;.
1f830 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e          tempX.u.
1f840 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  iValue = 0;.    
1f850 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f860 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f870 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65  rse, &tempX, &re
1f880 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
1f890 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1f8a0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f8b0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f8c0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1f8d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f8e0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74  ddOp3(v, OP_Subt
1f8f0 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61  ract, r2, r1, ta
1f900 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74  rget);.        t
1f910 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f920 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  2==0 );.      }.
1f930 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f940 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
1f950 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
1f960 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
1f970 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f  assert( TK_BITNO
1f980 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20  T==OP_BitNot ); 
1f990 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f9a0 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20  TK_BITNOT );.   
1f9b0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1f9c0 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20  T==OP_Not );    
1f9d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f9e0 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
1f9f0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1fa00 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1fa10 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1fa20 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1fa30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1fa40 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1fa50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1fa60 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
1fa70 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
1fa80 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1fa90 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a  ase TK_TRUTH: {.
1faa0 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65        int isTrue
1fab0 3b 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20  ;    /* IS TRUE 
1fac0 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a  or IS NOT TRUE *
1fad0 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 6f 72  /.      int bNor
1fae0 6d 61 6c 3b 20 20 20 2f 2a 20 49 53 20 54 52 55  mal;   /* IS TRU
1faf0 45 20 6f 72 20 49 53 20 46 41 4c 53 45 20 2a 2f  E or IS FALSE */
1fb00 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1fb10 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1fb20 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1fb30 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1fb40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fb50 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1fb60 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20  .      isTrue = 
1fb70 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
1fb80 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69  Value(pExpr->pRi
1fb90 67 68 74 29 3b 0a 20 20 20 20 20 20 62 4e 6f 72  ght);.      bNor
1fba0 6d 61 6c 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32  mal = pExpr->op2
1fbb0 3d 3d 54 4b 5f 49 53 3b 0a 20 20 20 20 20 20 74  ==TK_IS;.      t
1fbc0 65 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20  estcase( isTrue 
1fbd0 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20  && bNormal);.   
1fbe0 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
1fbf0 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29  True && bNormal)
1fc00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1fc10 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1fc20 4f 50 5f 49 73 54 72 75 65 2c 20 72 31 2c 20 69  OP_IsTrue, r1, i
1fc30 6e 52 65 67 2c 20 21 69 73 54 72 75 65 2c 20 69  nReg, !isTrue, i
1fc40 73 54 72 75 65 20 5e 20 62 4e 6f 72 6d 61 6c 29  sTrue ^ bNormal)
1fc50 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1fc60 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1fc70 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
1fc80 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
1fc90 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
1fca0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1fcb0 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
1fcc0 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ll );   testcase
1fcd0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
1fce0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1fcf0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
1fd00 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63  NotNull ); testc
1fd10 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
1fd20 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ULL );.      sql
1fd30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1fd40 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
1fd50 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1fd60 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1fd70 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1fd80 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1fd90 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1fda0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1fdb0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1fdc0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
1fdd0 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
1fde0 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
1fdf0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1fe00 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
1fe10 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1fe20 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
1fe30 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
1fe40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1fe50 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
1fe60 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
1fe70 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1fe80 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
1fe90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fea0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1feb0 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
1fec0 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f    AggInfo *pInfo
1fed0 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
1fee0 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
1fef0 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
1ff00 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1ff10 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1ff20 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1ff30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1ff40 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1ff50 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
1ff60 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70  regate: %s()", p
1ff70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1ff80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ff90 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e        return pIn
1ffa0 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d  fo->aFunc[pExpr-
1ffb0 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20  >iAgg].iMem;.   
1ffc0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1ffd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ffe0 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
1fff0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
20000 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20  pFarg;       /* 
20010 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e  List of function
20020 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
20030 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20      int nFarg;  
20040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20050 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e  mber of function
20060 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
20070 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
20080 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  f;         /* Th
20090 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  e function defin
200a0 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ition object */.
200b0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
200c0 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20   *zId;       /* 
200d0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
200e0 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63  e */.      u32 c
200f0 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20  onstMask = 0;   
20100 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e    /* Mask of fun
20110 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
20120 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e  that are constan
20130 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  t */.      int i
20140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20150 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20160 72 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  r */.      sqlit
20170 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
20180 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  >db;  /* The dat
20190 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
201a0 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63   */.      u8 enc
201b0 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20   = ENC(db);     
201c0 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63   /* The text enc
201d0 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  oding used by th
201e0 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
201f0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
20200 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41  oll = 0;    /* A
20210 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
20220 6e 63 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  nce */..#ifndef 
20230 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
20240 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28  OWFUNC.      if(
20250 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
20260 28 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75  (pExpr, EP_WinFu
20270 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nc) ){.        r
20280 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 79 2e 70  eturn pExpr->y.p
20290 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 3b 0a  Win->regResult;.
202a0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
202b0 20 20 20 20 20 20 69 66 28 20 43 6f 6e 73 74 46        if( ConstF
202c0 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20  actorOk(pParse) 
202d0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
202e0 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
202f0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
20300 20 20 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f    /* SQL functio
20310 6e 73 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73  ns can be expens
20320 69 76 65 2e 20 53 6f 20 74 72 79 20 74 6f 20 6d  ive. So try to m
20330 6f 76 65 20 63 6f 6e 73 74 61 6e 74 20 66 75 6e  ove constant fun
20340 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 2a  ctions.        *
20350 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  * out of the inn
20360 65 72 20 6c 6f 6f 70 2c 20 65 76 65 6e 20 69 66  er loop, even if
20370 20 74 68 61 74 20 6d 65 61 6e 73 20 61 6e 20 65   that means an e
20380 78 74 72 61 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f  xtra OP_Copy. */
20390 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
203a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
203b0 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
203c0 78 70 72 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  xpr, -1);.      
203d0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
203e0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
203f0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
20400 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
20410 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
20420 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
20430 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
20440 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20     pFarg = 0;.  
20450 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20460 20 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72     pFarg = pExpr
20470 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
20480 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d   }.      nFarg =
20490 20 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e   pFarg ? pFarg->
204a0 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20  nExpr : 0;.     
204b0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
204c0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
204d0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
204e0 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78  .      zId = pEx
204f0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
20500 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
20510 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
20520 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65  b, zId, nFarg, e
20530 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53  nc, 0);.#ifdef S
20540 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b  QLITE_ENABLE_UNK
20550 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f  NOWN_SQL_FUNCTIO
20560 4e 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  N.      if( pDef
20570 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 65  ==0 && pParse->e
20580 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
20590 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
205a0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
205b0 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72   "unknown", nFar
205c0 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  g, enc, 0);.    
205d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
205e0 20 69 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20   if( pDef==0 || 
205f0 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21  pDef->xFinalize!
20600 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
20610 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
20620 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66  arse, "unknown f
20630 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20  unction: %s()", 
20640 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72  zId);.        br
20650 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
20660 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61      /* Attempt a
20670 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e   direct implemen
20680 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75  tation of the bu
20690 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28  ilt-in COALESCE(
206a0 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49  ) and.      ** I
206b0 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e  FNULL() function
206c0 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20  s.  This avoids 
206d0 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c  unnecessary eval
206e0 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20  uation of.      
206f0 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  ** arguments pas
20700 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d  t the first non-
20710 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20  NULL argument.. 
20720 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
20730 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
20740 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
20750 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20  COALESCE ){.    
20760 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65      int endCoale
20770 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  sce = sqlite3Vdb
20780 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
20790 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
207a0 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a  rt( nFarg>=2 );.
207b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
207c0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
207d0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
207e0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
207f0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
20800 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
20810 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20820 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f  eAddOp2(v, OP_No
20830 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65  tNull, target, e
20840 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20  ndCoalesce);.   
20850 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
20860 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
20870 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
20880 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  e(pParse, pFarg-
20890 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[i].pExpr, tar
208a0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  get);.        }.
208b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
208c0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
208d0 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b  v, endCoalesce);
208e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
208f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
20900 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29  * The UNLIKELY()
20910 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
20920 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c  o-op.  The resul
20930 74 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20  t is the value. 
20940 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
20950 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20  irst argument.. 
20960 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
20970 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
20980 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
20990 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20  UNLIKELY ){.    
209a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
209b0 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g>=1 );.        
209c0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
209d0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
209e0 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
209f0 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
20a00 0a 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  .      }..#ifdef
20a10 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
20a20 20 20 20 20 2f 2a 20 54 68 65 20 41 46 46 49 4e      /* The AFFIN
20a30 49 54 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 65  ITY() function e
20a40 76 61 6c 75 61 74 65 73 20 74 6f 20 61 20 73 74  valuates to a st
20a50 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
20a60 62 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  bes.      ** the
20a70 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f   type affinity o
20a80 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20  f the argument. 
20a90 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
20aa0 72 20 74 65 73 74 69 6e 67 20 6f 66 0a 20 20 20  r testing of.   
20ab0 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65     ** the SQLite
20ac0 20 74 79 70 65 20 6c 6f 67 69 63 2e 0a 20 20 20   type logic..   
20ad0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
20ae0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
20af0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 41 46  & SQLITE_FUNC_AF
20b00 46 49 4e 49 54 59 20 29 7b 0a 20 20 20 20 20 20  FINITY ){.      
20b10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
20b20 41 66 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f 62 22  Aff[] = { "blob"
20b30 2c 20 22 74 65 78 74 22 2c 20 22 6e 75 6d 65 72  , "text", "numer
20b40 69 63 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20  ic", "integer", 
20b50 22 72 65 61 6c 22 20 7d 3b 0a 20 20 20 20 20 20  "real" };.      
20b60 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 20 20    char aff;.    
20b70 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
20b80 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g==1 );.        
20b90 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70  aff = sqlite3Exp
20ba0 72 41 66 66 69 6e 69 74 79 28 70 46 61 72 67 2d  rAffinity(pFarg-
20bb0 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
20bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20bd0 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74  eLoadString(v, t
20be0 61 72 67 65 74 2c 20 0a 20 20 20 20 20 20 20 20  arget, .        
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c00 20 20 20 20 20 20 61 66 66 20 3f 20 61 7a 41 66        aff ? azAf
20c10 66 5b 61 66 66 2d 53 51 4c 49 54 45 5f 41 46 46  f[aff-SQLITE_AFF
20c20 5f 42 4c 4f 42 5d 20 3a 20 22 6e 6f 6e 65 22 29  _BLOB] : "none")
20c30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
20c40 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
20c50 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 66  .#endif..      f
20c60 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b  or(i=0; i<nFarg;
20c70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
20c80 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74  f( i<32 && sqlit
20c90 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
20ca0 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78  (pFarg->a[i].pEx
20cb0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
20cc0 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31   testcase( i==31
20cd0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
20ce0 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42  nstMask |= MASKB
20cf0 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20  IT32(i);.       
20d00 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
20d10 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
20d20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
20d30 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70  EDCOLL)!=0 && !p
20d40 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
20d50 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
20d60 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
20d70 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
20d80 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
20d90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
20da0 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20   if( pFarg ){.  
20db0 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d        if( constM
20dc0 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ask ){.         
20dd0 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d   r1 = pParse->nM
20de0 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  em+1;.          
20df0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
20e00 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d  nFarg;.        }
20e10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
20e20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
20e30 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
20e40 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20   nFarg);.       
20e50 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
20e60 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20  or length() and 
20e70 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f  typeof() functio
20e80 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e  ns with a column
20e90 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20   argument,.     
20ea0 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35     ** set the P5
20eb0 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
20ec0 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  e OP_Column opco
20ed0 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e  de to OPFLAG_LEN
20ee0 47 54 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a  GTHARG.        *
20ef0 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45  * or OPFLAG_TYPE
20f00 4f 46 41 52 47 20 72 65 73 70 65 63 74 69 76 65  OFARG respective
20f10 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ly, to avoid unn
20f20 65 63 65 73 73 61 72 79 20 64 61 74 61 0a 20 20  ecessary data.  
20f30 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67        ** loading
20f40 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
20f50 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
20f60 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c  funcFlags & (SQL
20f70 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c  ITE_FUNC_LENGTH|
20f80 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
20f90 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  OF))!=0 ){.     
20fa0 20 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a       u8 exprOp;.
20fb0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
20fc0 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20  ( nFarg==1 );.  
20fd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20fe0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
20ff0 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
21000 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67    exprOp = pFarg
21010 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
21020 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
21030 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  exprOp==TK_COLUM
21040 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f  N || exprOp==TK_
21050 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
21060 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
21070 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45  ( SQLITE_FUNC_LE
21080 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e  NGTH==OPFLAG_LEN
21090 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20  GTHARG );.      
210a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
210b0 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46  LITE_FUNC_TYPEOF
210c0 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  ==OPFLAG_TYPEOFA
210d0 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
210e0 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 66    testcase( pDef
210f0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50  ->funcFlags & OP
21100 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29  FLAG_LENGTHARG )
21110 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  ;.            pF
21120 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
21130 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20  >op2 = .        
21140 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e            pDef->
21150 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46  funcFlags & (OPF
21160 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50  LAG_LENGTHARG|OP
21170 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b  FLAG_TYPEOFARG);
21180 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21190 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
211a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
211b0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
211c0 70 46 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20  pFarg, r1, 0,.  
211d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
211f0 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51  LITE_ECEL_DUP|SQ
21200 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
21210 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
21220 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a          r1 = 0;.
21230 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
21240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
21250 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
21260 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
21270 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
21280 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
21290 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
212a0 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
212b0 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
212c0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
212d0 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
212e0 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
212f0 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
21300 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
21310 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
21320 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
21330 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
21340 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
21350 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
21360 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
21370 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
21380 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
21390 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
213a0 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
213b0 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
213c0 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
213d0 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
213e0 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
213f0 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
21400 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
21410 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
21420 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
21430 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
21440 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
21450 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
21460 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
21470 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
21480 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
21490 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
214a0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
214b0 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
214c0 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
214d0 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
214e0 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
214f0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  */.      if( nFa
21500 72 67 3e 3d 32 20 26 26 20 45 78 70 72 48 61 73  rg>=2 && ExprHas
21510 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
21520 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b  EP_InfixFunc) ){
21530 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
21540 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
21550 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
21560 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
21570 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  rg->a[1].pExpr);
21580 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
21590 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20   nFarg>0 ){.    
215a0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
215b0 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
215c0 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
215d0 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
215e0 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
215f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
21600 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
21610 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
21620 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
21630 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
21640 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
21650 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
21660 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21670 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
21680 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  Seq, 0, 0, 0, (c
21690 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
216a0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
216b0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
216c0 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51  ENABLE_OFFSET_SQ
216d0 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28  L_FUNC.      if(
216e0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
216f0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4f   & SQLITE_FUNC_O
21700 46 46 53 45 54 20 29 7b 0a 20 20 20 20 20 20 20  FFSET ){.       
21710 20 45 78 70 72 20 2a 70 41 72 67 20 3d 20 70 46   Expr *pArg = pF
21720 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  arg->a[0].pExpr;
21730 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72  .        if( pAr
21740 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  g->op==TK_COLUMN
21750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
21760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
21770 76 2c 20 4f 50 5f 4f 66 66 73 65 74 2c 20 70 41  v, OP_Offset, pA
21780 72 67 2d 3e 69 54 61 62 6c 65 2c 20 70 41 72 67  rg->iTable, pArg
21790 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  ->iColumn, targe
217a0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  t);.        }els
217b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
217c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
217d0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
217e0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
217f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
21800 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
21810 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21820 64 64 4f 70 34 28 76 2c 20 70 50 61 72 73 65 2d  ddOp4(v, pParse-
21830 3e 69 53 65 6c 66 54 61 62 20 3f 20 4f 50 5f 50  >iSelfTab ? OP_P
21840 75 72 65 46 75 6e 63 30 20 3a 20 4f 50 5f 46 75  ureFunc0 : OP_Fu
21850 6e 63 74 69 6f 6e 30 2c 0a 20 20 20 20 20 20 20  nction0,.       
21860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21870 20 20 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31     constMask, r1
21880 2c 20 74 61 72 67 65 74 2c 20 28 63 68 61 72 2a  , target, (char*
21890 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45  )pDef, P4_FUNCDE
218a0 46 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  F);.        sqli
218b0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
218c0 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20  v, (u8)nFarg);. 
218d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
218e0 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d   nFarg && constM
218f0 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ask==0 ){.      
21900 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
21910 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
21920 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20  , r1, nFarg);.  
21930 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
21940 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
21950 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21960 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
21970 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
21980 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
21990 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  LECT: {.      in
219a0 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65  t nCol;.      te
219b0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
219c0 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
219d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
219e0 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
219f0 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  if( op==TK_SELEC
21a00 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78  T && (nCol = pEx
21a10 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
21a20 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31  EList->nExpr)!=1
21a30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
21a40 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
21a50 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20  r(pParse, nCol, 
21a60 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
21a70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
21a80 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
21a90 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
21aa0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
21ab0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21ac0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
21ad0 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  CT_COLUMN: {.   
21ae0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
21af0 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
21b00 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ->iTable==0 ){. 
21b10 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c         pExpr->pL
21b20 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71  eft->iTable = sq
21b30 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
21b40 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
21b50 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
21b60 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
21b70 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30  pExpr->iTable==0
21b80 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   || pExpr->pLeft
21b90 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
21ba0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
21bb0 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20  pr->iTable.     
21bc0 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62    && pExpr->iTab
21bd0 6c 65 21 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33  le!=(n = sqlite3
21be0 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
21bf0 45 78 70 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20  Expr->pLeft)) . 
21c00 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
21c10 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
21c20 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75  pParse, "%d colu
21c30 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20  mns assigned %d 
21c40 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20  values",.       
21c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c60 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
21c70 69 54 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20  iTable, n);.    
21c80 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
21c90 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
21ca0 54 61 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69  Table + pExpr->i
21cb0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20  Column;.    }.  
21cc0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
21cd0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
21ce0 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
21cf0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
21d00 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
21d10 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
21d20 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
21d30 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
21d40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21d50 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
21d60 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
21d70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21d80 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
21d90 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
21da0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
21db0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21dc0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
21dd0 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
21de0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21df0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
21e00 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
21e10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21e20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
21e30 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a  mm, target, 0);.
21e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21e50 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
21e60 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
21e70 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
21e80 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  t;.    }.#endif 
21e90 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
21ea0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20  UBQUERY */...   
21eb0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20   /*.    **    x 
21ec0 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
21ed0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
21ee0 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
21ef0 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   to.    **.    *
21f00 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
21f10 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  =z.    **.    **
21f20 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   X is stored in 
21f30 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
21f40 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64    ** Y is stored
21f50 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
21f60 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[0].pExpr..  
21f70 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64    ** Z is stored
21f80 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
21f90 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[1].pExpr..  
21fa0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
21fb0 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
21fc0 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
21fd0 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
21fe0 20 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a   target, 0, 0);.
21ff0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
22000 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
22010 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20  ase TK_SPAN:.   
22020 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45   case TK_COLLATE
22030 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  : .    case TK_U
22040 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 70 45  PLUS: {.      pE
22050 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  xpr = pExpr->pLe
22060 66 74 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  ft;.      goto e
22070 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3b  xpr_code_doover;
22080 20 2f 2a 20 32 30 31 38 2d 30 34 2d 32 38 3a 20   /* 2018-04-28: 
22090 50 72 65 76 65 6e 74 20 64 65 65 70 20 72 65 63  Prevent deep rec
220a0 75 72 73 69 6f 6e 2e 20 4f 53 53 46 75 7a 7a 2e  ursion. OSSFuzz.
220b0 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63   */.    }..    c
220c0 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20  ase TK_TRIGGER: 
220d0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
220e0 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54  e opcode is TK_T
220f0 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65  RIGGER, then the
22100 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
22110 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20   reference.     
22120 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20   ** to a column 
22130 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20  in the new.* or 
22140 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
22150 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  les available to
22160 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65  .      ** trigge
22170 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74  r programs. In t
22180 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54  his case Expr.iT
22190 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31  able is set to 1
221a0 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a   for the.      *
221b0 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  * new.* pseudo-t
221c0 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74  able, or 0 for t
221d0 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
221e0 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c  table. Expr.iCol
221f0 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  umn.      ** is 
22200 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  set to the colum
22210 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d  n of the pseudo-
22220 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f  table to read, o
22230 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20  r to -1 to.     
22240 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77   ** read the row
22250 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20  id field..      
22260 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
22270 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d  expression is im
22280 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
22290 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f  an OP_Param opco
222a0 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20  de. The p1.     
222b0 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73   ** parameter is
222c0 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e   set to 0 for an
222d0 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72   old.rowid refer
222e0 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31  ence, or to (i+1
222f0 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  ).      ** to re
22300 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20  ference another 
22310 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c  column of the ol
22320 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
22330 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a  , where .      *
22340 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78  * i is the index
22350 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
22360 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20  For a new.rowid 
22370 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73  reference, p1 is
22380 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f  .      ** set to
22390 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20   (n+1), where n 
223a0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
223b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68   columns in each
223c0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20   pseudo-table.. 
223d0 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65       ** For a re
223e0 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f  ference to any o
223f0 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ther column in t
22400 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  he new.* pseudo-
22410 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20  table, p1.      
22420 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b  ** is set to (n+
22430 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e  2+i), where n an
22440 64 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e  d i are as defin
22450 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46  ed previously. F
22460 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d  or.      ** exam
22470 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c  ple, if the tabl
22480 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67  e on which trigg
22490 65 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69  ers are being fi
224a0 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  red is.      ** 
224b0 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20  declared as:.   
224c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
224d0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
224e0 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a  (a, b);.      **
224f0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70  .      ** Then p
22500 31 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  1 is interpreted
22510 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
22520 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
22530 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f   p1==0   ->    o
22540 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d  ld.rowid     p1=
22550 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72  =3   ->    new.r
22560 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20  owid.      **   
22570 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==1   ->    ol
22580 64 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.a         p1==
22590 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a  4   ->    new.a.
225a0 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32        **   p1==2
225b0 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20     ->    old.b  
225c0 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d         p1==5   -
225d0 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20  >    new.b      
225e0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
225f0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
22600 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20  Expr->y.pTab;.  
22610 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
22620 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
22630 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
22640 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
22650 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
22660 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
22670 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
22680 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
22690 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
226a0 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
226b0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
226c0 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
226d0 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
226e0 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
226f0 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
22700 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
22710 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
22720 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
22730 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
22740 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22750 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
22760 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
22770 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
22780 72 5b 25 64 5d 3d 25 73 2e 25 73 22 2c 20 74 61  r[%d]=%s.%s", ta
22790 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 28 70  rget,.        (p
227a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
227b0 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20  new" : "old"),. 
227c0 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
227d0 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69  Column<0 ? "rowi
227e0 64 22 20 3a 20 70 45 78 70 72 2d 3e 79 2e 70 54  d" : pExpr->y.pT
227f0 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
22800 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 0a  iColumn].zName).
22810 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64        ));..#ifnd
22820 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
22830 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
22840 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
22850 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66  lumn has REAL af
22860 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63  finity, it may c
22870 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
22880 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a  ed as an.      *
22890 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f  * integer. Use O
228a0 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74  P_RealAffinity t
228b0 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  o make sure it i
228c0 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20  s really real.. 
228d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
228e0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
228f0 36 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69  60985-57662 SQLi
22900 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20  te will convert 
22910 74 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74  the value back t
22920 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74  o.      ** float
22930 69 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65  ing point when e
22940 78 74 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f  xtracting it fro
22950 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a  m the record.  *
22960 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  /.      if( pExp
22970 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20  r->iColumn>=0 . 
22980 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61        && pTab->a
22990 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
229a0 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51  mn].affinity==SQ
229b0 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
229c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
229d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
229e0 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  (v, OP_RealAffin
229f0 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ity, target);.  
22a00 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22a10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22a20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43  .    case TK_VEC
22a30 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TOR: {.      sql
22a40 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
22a50 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
22a60 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20  misused");.     
22a70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
22a80 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55     case TK_IF_NU
22a90 4c 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20  LL_ROW: {.      
22aa0 69 6e 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20  int addrINR;.   
22ab0 20 20 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c     addrINR = sql
22ac0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
22ad0 2c 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20  , OP_IfNullRow, 
22ae0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
22af0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
22b00 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
22b10 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
22b20 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
22b30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22b40 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
22b50 61 64 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20  addrINR);.      
22b60 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
22b70 65 50 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20  eP3(v, addrINR, 
22b80 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
22b90 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
22ba0 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  /*.    ** Form A
22bb0 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
22bc0 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  x WHEN e1 THEN r
22bd0 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
22be0 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
22bf0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
22c00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
22c10 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20  orm B:.    **   
22c20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45  CASE WHEN e1 THE
22c30 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
22c40 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
22c50 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
22c60 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
22c70 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20  * Form A is can 
22c80 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  be transformed i
22c90 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65  nto the equivale
22ca0 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c  nt form B as fol
22cb0 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43  lows:.    **   C
22cc0 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48  ASE WHEN x=e1 TH
22cd0 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20  EN r1 WHEN x=e2 
22ce0 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20  THEN r2 ....    
22cf0 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78  **        WHEN x
22d00 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45  =eN THEN rN ELSE
22d10 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
22d20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78    ** X (if it ex
22d30 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70  ists) is in pExp
22d40 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
22d50 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73   Y is in the las
22d60 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78  t element of pEx
22d70 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70  pr->x.pList if p
22d80 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
22d90 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f  Expr is.    ** o
22da0 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c  dd.  The Y is al
22db0 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66  so optional.  If
22dc0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
22dd0 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69  lements in x.pLi
22de0 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65  st.    ** is eve
22df0 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69  n, then Y is omi
22e00 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74  tted and the "ot
22e10 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20  herwise" result 
22e20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20  is NULL..    ** 
22e30 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  Ei is in pExpr->
22e40 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e  pList->a[i*2] an
22e50 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70  d Ri is pExpr->p
22e60 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a  List->a[i*2+1]..
22e70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
22e80 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
22e90 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
22ea0 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72  e Ri for the fir
22eb0 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a  st matching Ei,.
22ec0 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65      ** or if the
22ed0 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e  re is no matchin
22ee0 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74  g Ei, the ELSE t
22ef0 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65  erm Y, or if the
22f00 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20  re is.    ** no 
22f10 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e  ELSE term, NULL.
22f20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
22f30 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d  ult: assert( op=
22f40 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20  =TK_CASE ); {.  
22f50 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c      int endLabel
22f60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22f70 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
22f80 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43  bel for end of C
22f90 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20  ASE stmt */.    
22fa0 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20    int nextCase; 
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fc0 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
22fd0 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20  l for next WHEN 
22fe0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
22ff0 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20  int nExpr;      
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23010 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f    /* 2x number o
23020 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
23030 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
23060 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
23070 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
23080 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
23090 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48     /* List of WH
230a0 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
230b0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
230c0 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
230d0 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  m;  /* Array of 
230e0 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
230f0 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61      Expr opCompa
23100 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
23110 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d        /* The X==
23120 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  Ei expression */
23130 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
23140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23150 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23160 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  X expression */.
23170 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73        Expr *pTes
23180 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
23190 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69          /* X==Ei
231a0 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73   (form A) or jus
231b0 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f  t Ei (form B) */
231c0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
231d0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
231e0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
231f0 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e  lect) && pExpr->
23200 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  x.pList );.     
23210 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78   assert(pExpr->x
23220 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20  .pList->nExpr > 
23230 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74  0);.      pEList
23240 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
23250 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
23260 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
23270 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
23280 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
23290 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71     endLabel = sq
232a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
232b0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
232c0 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70    if( (pX = pExp
232d0 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a  r->pLeft)!=0 ){.
232e0 20 20 20 20 20 20 20 20 65 78 70 72 4e 6f 64 65          exprNode
232f0 43 6f 70 79 28 26 74 65 6d 70 58 2c 20 70 58 29  Copy(&tempX, pX)
23300 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
23310 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43  se( pX->op==TK_C
23320 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
23330 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
23340 26 74 65 6d 70 58 2c 20 65 78 70 72 43 6f 64 65  &tempX, exprCode
23350 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26  Vector(pParse, &
23360 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31  tempX, &regFree1
23370 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ));.        test
23380 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
23390 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  0 );.        mem
233a0 73 65 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20  set(&opCompare, 
233b0 30 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70  0, sizeof(opComp
233c0 61 72 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f  are));.        o
233d0 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b  pCompare.op = TK
233e0 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  _EQ;.        opC
233f0 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26  ompare.pLeft = &
23400 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70  tempX;.        p
23410 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72  Test = &opCompar
23420 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69  e;.        /* Ti
23430 63 6b 65 74 20 62 33 35 31 64 39 35 66 39 63 64  cket b351d95f9cd
23440 35 65 66 31 37 65 39 64 39 64 62 61 65 31 38 66  5ef17e9d9dbae18f
23450 35 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20  5ca8611190001:. 
23460 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61         ** The va
23470 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65 31 20  lue in regFree1 
23480 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d  might get SCopy-
23490 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  ed into the file
234a0 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20   result..       
234b0 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65   ** So make sure
234c0 20 74 68 61 74 20 74 68 65 20 72 65 67 46 72 65   that the regFre
234d0 65 31 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  e1 register is n
234e0 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74  ot reused for ot
234f0 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  her.        ** p
23500 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73  urposes and poss
23510 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e  ibly overwritten
23520 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  .  */.        re
23530 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20  gFree1 = 0;.    
23540 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
23550 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d  0; i<nExpr-1; i=
23560 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i+2){.        if
23570 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pX ){.        
23580 20 20 61 73 73 65 72 74 28 20 70 54 65 73 74 21    assert( pTest!
23590 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
235a0 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74  opCompare.pRight
235b0 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e   = aListelem[i].
235c0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  pExpr;.        }
235d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
235e0 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65  pTest = aListele
235f0 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  m[i].pExpr;.    
23600 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65      }.        ne
23610 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33  xtCase = sqlite3
23620 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
23630 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 74  arse);.        t
23640 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e  estcase( pTest->
23650 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
23660 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23670 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
23680 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43  se, pTest, nextC
23690 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ase, SQLITE_JUMP
236a0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  IFNULL);.       
236b0 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74   testcase( aList
236c0 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d  elem[i+1].pExpr-
236d0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
236e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
236f0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
23700 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  , aListelem[i+1]
23710 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
23720 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23730 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c  VdbeGoto(v, endL
23740 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  abel);.        s
23750 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
23760 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61  eLabel(v, nextCa
23770 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
23780 20 20 20 69 66 28 20 28 6e 45 78 70 72 26 31 29     if( (nExpr&1)
23790 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
237a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
237b0 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
237c0 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c  [nExpr-1].pExpr,
237d0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
237e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
237f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23800 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
23810 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
23820 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
23830 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
23840 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
23850 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
23860 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23870 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
23880 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b  case TK_RAISE: {
23890 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
238a0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
238b0 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20  OE_Rollback .   
238c0 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
238d0 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41  ->affinity==OE_A
238e0 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20  bort.           
238f0 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
23900 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20  ty==OE_Fail.    
23910 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
23920 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
23930 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  nore.      );.  
23940 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
23950 3e 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a  >pTriggerTab ){.
23960 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
23970 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23990 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20         "RAISE() 
239a0 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  may only be used
239b0 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65   within a trigge
239c0 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20  r-program");.   
239d0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
239e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
239f0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
23a00 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
23a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79        sqlite3May
23a20 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
23a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
23a40 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
23a50 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
23a60 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
23a70 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
23a80 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72  finity==OE_Ignor
23a90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
23aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f              v, O
23ac0 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f  P_Halt, SQLITE_O
23ad0 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c  K, OE_Ignore, 0,
23ae0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
23af0 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ,0);.        Vdb
23b00 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
23b10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23b20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f     sqlite3HaltCo
23b30 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
23b40 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
23b50 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20  NT_TRIGGER,.    
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b70 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
23b80 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72  >affinity, pExpr
23b90 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30  ->u.zToken, 0, 0
23ba0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
23bb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
23bc0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
23bd0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
23be0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
23bf0 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
23c00 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
23c10 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
23c20 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a    return inReg;.
23c30 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20  }../*.** Factor 
23c40 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20  out the code of 
23c50 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
23c60 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69  sion to initiali
23c70 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2a 0a  zation time..**.
23c80 2a 2a 20 49 66 20 72 65 67 44 65 73 74 3e 3d 30  ** If regDest>=0
23c90 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
23ca0 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65   is always store
23cb0 64 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74  d in that regist
23cc0 65 72 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65  er and the.** re
23cd0 73 75 6c 74 20 69 73 20 6e 6f 74 20 72 65 75 73  sult is not reus
23ce0 61 62 6c 65 2e 20 20 49 66 20 72 65 67 44 65 73  able.  If regDes
23cf0 74 3c 30 20 74 68 65 6e 20 74 68 69 73 20 72 6f  t<0 then this ro
23d00 75 74 69 6e 65 20 69 73 20 66 72 65 65 20 74 6f  utine is free to
23d10 20 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 76   .** store the v
23d20 61 6c 75 65 20 77 68 65 72 65 65 76 65 72 20 69  alue whereever i
23d30 74 20 77 61 6e 74 73 2e 20 20 54 68 65 20 72 65  t wants.  The re
23d40 67 69 73 74 65 72 20 77 68 65 72 65 20 74 68 65  gister where the
23d50 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a 2a 20   expression .** 
23d60 69 73 20 73 74 6f 72 65 64 20 69 73 20 72 65 74  is stored is ret
23d70 75 72 6e 65 64 2e 20 20 57 68 65 6e 20 72 65 67  urned.  When reg
23d80 44 65 73 74 3c 30 2c 20 74 77 6f 20 69 64 65 6e  Dest<0, two iden
23d90 74 69 63 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  tical expression
23da0 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65 20 74  s will.** code t
23db0 6f 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73  o the same regis
23dc0 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
23dd0 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
23de0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
23df0 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
23e00 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
23e10 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
23e20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
23e30 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20  on to code when 
23e40 74 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c  the VDBE initial
23e50 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  izes */.  int re
23e60 67 44 65 73 74 20 20 20 20 20 20 20 2f 2a 20 53  gDest       /* S
23e70 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69  tore the value i
23e80 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
23e90 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  */.){.  ExprList
23ea0 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43   *p;.  assert( C
23eb0 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
23ec0 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50  rse) );.  p = pP
23ed0 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
23ee0 3b 0a 20 20 69 66 28 20 72 65 67 44 65 73 74 3c  ;.  if( regDest<
23ef0 30 20 26 26 20 70 20 29 7b 0a 20 20 20 20 73 74  0 && p ){.    st
23f00 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
23f10 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 69  em *pItem;.    i
23f20 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 70 49  nt i;.    for(pI
23f30 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e  tem=p->a, i=p->n
23f40 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d  Expr; i>0; pItem
23f50 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  ++, i--){.      
23f60 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61  if( pItem->reusa
23f70 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33 45 78  ble && sqlite3Ex
23f80 70 72 43 6f 6d 70 61 72 65 28 30 2c 70 49 74 65  prCompare(0,pIte
23f90 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d  m->pExpr,pExpr,-
23fa0 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
23fb0 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75   return pItem->u
23fc0 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a  .iConstExprReg;.
23fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23fe0 7d 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  }.  pExpr = sqli
23ff0 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
24000 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29  e->db, pExpr, 0)
24010 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45  ;.  p = sqlite3E
24020 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
24030 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b  arse, p, pExpr);
24040 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
24050 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
24060 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
24070 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
24080 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  ;.     pItem->re
24090 75 73 61 62 6c 65 20 3d 20 72 65 67 44 65 73 74  usable = regDest
240a0 3c 30 3b 0a 20 20 20 20 20 69 66 28 20 72 65 67  <0;.     if( reg
240b0 44 65 73 74 3c 30 20 29 20 72 65 67 44 65 73 74  Dest<0 ) regDest
240c0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
240d0 6d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75  m;.     pItem->u
240e0 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d  .iConstExprReg =
240f0 20 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a 20 20   regDest;.  }.  
24100 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
24110 70 72 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e  pr = p;.  return
24120 20 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a   regDest;.}../*.
24130 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
24140 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
24150 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73  expression and s
24160 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
24170 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73  .** into a regis
24180 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ter.  Return the
24190 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
241a0 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c   where the resul
241b0 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  ts.** are stored
241c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
241d0 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d  egister is a tem
241e0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
241f0 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c  that can be deal
24200 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e  located,.** then
24210 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65   write its numbe
24220 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49  r into *pReg.  I
24230 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67  f the result reg
24240 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20  ister is not.** 
24250 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65  a temporary, the
24260 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a  n set *pReg to z
24270 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ero..**.** If pE
24280 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  xpr is a constan
24290 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  t, then this rou
242a0 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72  tine might gener
242b0 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65  ate this.** code
242c0 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67   to fill the reg
242d0 69 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69  ister in the ini
242e0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74  tialization sect
242f0 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44  ion of the.** VD
24300 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f  BE program, in o
24310 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69  rder to factor i
24320 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61  t out of the eva
24330 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f  luation loop..*/
24340 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
24350 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a  CodeTemp(Parse *
24360 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
24370 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b  xpr, int *pReg){
24380 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78  .  int r2;.  pEx
24390 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
243a0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70  SkipCollate(pExp
243b0 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46  r);.  if( ConstF
243c0 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a  actorOk(pParse).
243d0 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21     && pExpr->op!
243e0 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20  =TK_REGISTER.   
243f0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
24400 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
24410 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20  pExpr).  ){.    
24420 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20  *pReg  = 0;.    
24430 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
24440 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
24450 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20  e, pExpr, -1);. 
24460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
24470 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
24480 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
24490 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
244a0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
244b0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
244c0 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72  );.    if( r2==r
244d0 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67  1 ){.      *pReg
244e0 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = r1;.    }else
244f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
24500 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
24510 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
24520 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20   *pReg = 0;.    
24530 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
24540 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  2;.}../*.** Gene
24550 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
24560 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
24570 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
24580 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
24590 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
245a0 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
245b0 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
245c0 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
245d0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
245e0 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  target..*/.void 
245f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
24600 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
24610 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
24620 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69  target){.  int i
24630 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nReg;..  assert(
24640 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
24650 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
24660 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  m );.  if( pExpr
24670 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   && pExpr->op==T
24680 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
24690 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
246a0 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
246b0 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70  e, OP_Copy, pExp
246c0 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
246d0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
246e0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
246f0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
24700 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
24710 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72  rget);.    asser
24720 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
24730 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
24740 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
24750 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67  );.    if( inReg
24760 21 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72  !=target && pPar
24770 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
24780 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24790 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
247a0 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  be, OP_SCopy, in
247b0 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
247c0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
247d0 20 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e   Make a transien
247e0 74 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73  t copy of expres
247f0 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74  sion pExpr and t
24800 68 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e  hen code it usin
24810 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72  g.** sqlite3Expr
24820 43 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f  Code().  This ro
24830 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74  utine works just
24840 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   like sqlite3Exp
24850 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70  rCode().** excep
24860 74 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74  t that the input
24870 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67   expression is g
24880 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
24890 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f  unchanged..*/.vo
248a0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
248b0 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50  deCopy(Parse *pP
248c0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
248d0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
248e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
248f0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45  pParse->db;.  pE
24900 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
24910 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
24920 30 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  0);.  if( !db->m
24930 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71  allocFailed ) sq
24940 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
24950 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
24960 67 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  get);.  sqlite3E
24970 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
24980 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  xpr);.}../*.** G
24990 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
249a0 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
249b0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
249c0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
249d0 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
249e0 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
249f0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
24a00 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
24a10 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
24a20 65 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74  er target.  If t
24a30 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
24a40 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
24a50 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
24a60 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20  might choose to 
24a70 63 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73  code the express
24a80 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a  ion at initializ
24a90 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76  ation time..*/.v
24aa0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
24ab0 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61  odeFactorable(Pa
24ac0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
24ad0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
24ae0 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61  rget){.  if( pPa
24af0 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
24b00 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  or && sqlite3Exp
24b10 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
24b20 69 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  in(pExpr) ){.   
24b30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24b40 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
24b50 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
24b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
24b70 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
24b80 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
24b90 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
24ba0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
24bb0 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 68  hat evaluates th
24bc0 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
24bd0 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20  on and puts the 
24be0 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67  result.** in reg
24bf0 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a  ister target..**
24c00 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20  .** Also make a 
24c10 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72  copy of the expr
24c20 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  ession results i
24c30 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63  nto another "cac
24c40 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  he" register.** 
24c50 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65  and modify the e
24c60 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61  xpression so tha
24c70 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  t the next time 
24c80 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c  it is evaluated,
24c90 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69  .** the result i
24ca0 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
24cb0 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a  cache register..
24cc0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
24cd0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  ne is used for e
24ce0 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
24cf0 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c  are used multipl
24d00 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68  e .** times.  Th
24d10 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ey are evaluated
24d20 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65   once and the re
24d30 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70  sults of the exp
24d40 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72  ression.** are r
24d50 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  eused..*/.void s
24d60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e  qlite3ExprCodeAn
24d70 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  dCache(Parse *pP
24d80 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
24d90 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
24da0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
24db0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
24dc0 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74   iMem;..  assert
24dd0 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
24de0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
24df0 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p!=TK_REGISTER )
24e00 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
24e10 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
24e20 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69 4d  r, target);.  iM
24e30 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
24e40 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Mem;.  sqlite3Vd
24e50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
24e60 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d 65  opy, target, iMe
24e70 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69  m);.  exprToRegi
24e80 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65 6d  ster(pExpr, iMem
24e90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
24ea0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70  rate code that p
24eb0 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20  ushes the value 
24ec0 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
24ed0 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   of the given.**
24ee0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
24ef0 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65   into a sequence
24f00 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65   of registers be
24f10 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65  ginning at targe
24f20 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
24f30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
24f40 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64  ements evaluated
24f50 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
24f60 74 75 72 6e 65 64 20 77 69 6c 6c 0a 2a 2a 20 75  turned will.** u
24f70 73 75 61 6c 6c 79 20 62 65 20 70 4c 69 73 74 2d  sually be pList-
24f80 3e 6e 45 78 70 72 20 62 75 74 20 6d 69 67 68 74  >nExpr but might
24f90 20 62 65 20 72 65 64 75 63 65 64 20 69 66 20 53   be reduced if S
24fa0 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52  QLITE_ECEL_OMITR
24fb0 45 46 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  EF.** is defined
24fc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
24fd0 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67  TE_ECEL_DUP flag
24fe0 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61 72   prevents the ar
24ff0 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69  guments from bei
25000 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69  ng.** filled usi
25010 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50  ng OP_SCopy.  OP
25020 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73  _Copy must be us
25030 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
25040 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
25050 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e  L_FACTOR argumen
25060 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e  t allows constan
25070 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62  t arguments to b
25080 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75  e.** factored ou
25090 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a  t into initializ
250a0 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  ation code..**.*
250b0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
250c0 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61 6e 73  L_REF flag means
250d0 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
250e0 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 77 69  s in the list wi
250f0 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61  th.** ExprList.a
25100 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  [].u.x.iOrderByC
25110 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65 61 64  ol>0 have alread
25120 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64  y been evaluated
25130 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69   and stored.** i
25140 6e 20 72 65 67 69 73 74 65 72 73 20 61 74 20 73  n registers at s
25150 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20 74 68  rcReg, and so th
25160 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 63  e value can be c
25170 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 72 65  opied from there
25180 2e 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45  ..** If SQLITE_E
25190 43 45 4c 5f 4f 4d 49 54 52 45 46 20 69 73 20 61  CEL_OMITREF is a
251a0 6c 73 6f 20 73 65 74 2c 20 74 68 65 6e 20 74 68  lso set, then th
251b0 65 20 76 61 6c 75 65 73 20 77 69 74 68 20 75 2e  e values with u.
251c0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a  x.iOrderByCol>0.
251d0 2a 2a 20 61 72 65 20 73 69 6d 70 6c 79 20 6f 6d  ** are simply om
251e0 69 74 74 65 64 20 72 61 74 68 65 72 20 74 68 61  itted rather tha
251f0 6e 20 62 65 69 6e 67 20 63 6f 70 69 65 64 20 66  n being copied f
25200 72 6f 6d 20 73 72 63 52 65 67 2e 0a 2a 2f 0a 69  rom srcReg..*/.i
25210 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
25220 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  deExprList(.  Pa
25230 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
25240 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
25250 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
25260 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54  t *pList,   /* T
25270 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
25280 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  st to be coded *
25290 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20  /.  int target, 
252a0 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
252b0 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73  to write results
252c0 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67   */.  int srcReg
252d0 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72  ,        /* Sour
252e0 63 65 20 72 65 67 69 73 74 65 72 73 20 69 66 20  ce registers if 
252f0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20  SQLITE_ECEL_REF 
25300 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20  */.  u8 flags   
25310 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
25320 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a  E_ECEL_* flags *
25330 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  /.){.  struct Ex
25340 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
25350 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  em;.  int i, j, 
25360 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d  n;.  u8 copyOp =
25370 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
25380 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f  _ECEL_DUP) ? OP_
25390 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b  Copy : OP_SCopy;
253a0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
253b0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
253c0 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
253d0 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ;.  assert( targ
253e0 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  et>0 );.  assert
253f0 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
25400 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20  =0 );  /* Never 
25410 67 65 74 73 20 74 68 69 73 20 66 61 72 20 6f 74  gets this far ot
25420 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d  herwise */.  n =
25430 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
25440 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f   if( !ConstFacto
25450 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c  rOk(pParse) ) fl
25460 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45  ags &= ~SQLITE_E
25470 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f  CEL_FACTOR;.  fo
25480 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
25490 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c  , i=0; i<n; i++,
254a0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45   pItem++){.    E
254b0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74  xpr *pExpr = pIt
254c0 65 6d 2d 3e 70 45 78 70 72 3b 0a 23 69 66 64 65  em->pExpr;.#ifde
254d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
254e0 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
254f0 53 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  S.    if( pItem-
25500 3e 62 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20  >bSorterRef ){. 
25510 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20       i--;.      
25520 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  n--;.    }else.#
25530 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 66  endif.    if( (f
25540 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
25550 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a  EL_REF)!=0 && (j
25560 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
25570 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a  rderByCol)>0 ){.
25580 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20        if( flags 
25590 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d  & SQLITE_ECEL_OM
255a0 49 54 52 45 46 20 29 7b 0a 20 20 20 20 20 20 20  ITREF ){.       
255b0 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d   i--;.        n-
255c0 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
255d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
255e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70  dbeAddOp2(v, cop
255f0 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c  yOp, j+srcReg-1,
25600 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
25610 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
25620 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( (flags & SQLIT
25630 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d  E_ECEL_FACTOR)!=
25640 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
25650 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
25660 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78  stantNotJoin(pEx
25670 70 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  pr).    ){.     
25680 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25690 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
256a0 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b  Expr, target+i);
256b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
256c0 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71    int inReg = sq
256d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
256e0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
256f0 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
25700 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
25710 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20  arget+i ){.     
25720 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
25730 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 70 79          if( copy
25740 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20  Op==OP_Copy.    
25750 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c       && (pOp=sql
25760 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
25770 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f   -1))->opcode==O
25780 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20  P_Copy.         
25790 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e  && pOp->p1+pOp->
257a0 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20  p3+1==inReg.    
257b0 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b       && pOp->p2+
257c0 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65  pOp->p3+1==targe
257d0 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  t+i.        ){. 
257e0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33           pOp->p3
257f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
25800 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
25810 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25820 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c  , copyOp, inReg,
25830 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
25840 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
25850 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
25860 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
25870 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
25880 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
25890 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45  r..**.**    x BE
258a0 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a  TWEEN y AND z.**
258b0 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
258c0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
258d0 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e  **.**    x>=y AN
258e0 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64  D x<=z.**.** Cod
258f0 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61  e it as such, ta
25900 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20  king care to do 
25910 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78  the common subex
25920 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d  pression.** elim
25930 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a  ination of x..**
25940 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20  .** The xJumpIf 
25950 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
25960 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a  ines details:.**
25970 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20  .**    NULL:    
25980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
25990 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e  tore the boolean
259a0 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64   result in reg[d
259b0 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74  est].**    sqlit
259c0 65 33 45 78 70 72 49 66 54 72 75 65 3a 20 20 20  e3ExprIfTrue:   
259d0 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20     Jump to dest 
259e0 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71  if true.**    sq
259f0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
25a00 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65  :     Jump to de
25a10 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a  st if false.**.*
25a20 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  * The jumpIfNull
25a30 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67   parameter is ig
25a40 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66  nored if xJumpIf
25a50 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61   is NULL..*/.sta
25a60 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64  tic void exprCod
25a70 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73  eBetween(.  Pars
25a80 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
25a90 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
25aa0 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
25ab0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
25ac0 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
25ad0 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65  he BETWEEN expre
25ae0 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
25af0 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
25b00 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  Jump destination
25b10 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61   or storage loca
25b20 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28  tion */.  void (
25b30 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45  *xJump)(Parse*,E
25b40 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f  xpr*,int,int), /
25b50 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65  * Action to take
25b60 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66   */.  int jumpIf
25b70 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20  Null    /* Take 
25b80 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
25b90 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20  BETWEEN is NULL 
25ba0 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78 70 72  */.){. Expr expr
25bb0 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  And;     /* The 
25bc0 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20  AND operator in 
25bd0 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20   x>=y AND x<=z  
25be0 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65  */.  Expr compLe
25bf0 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78  ft;    /* The  x
25c00 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  >=y  term */.  E
25c10 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20  xpr compRight;  
25c20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74   /* The  x<=z  t
25c30 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78  erm */.  Expr ex
25c40 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  prX;       /* Th
25c50 65 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73  e  x  subexpress
25c60 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ion */.  int reg
25c70 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65  Free1 = 0; /* Te
25c80 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69  mporary use regi
25c90 73 74 65 72 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65  ster */..  memse
25ca0 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20  t(&compLeft, 0, 
25cb0 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
25cc0 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67   memset(&compRig
25cd0 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ht, 0, sizeof(Ex
25ce0 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr));.  memset(&
25cf0 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65  exprAnd, 0, size
25d00 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73  of(Expr));..  as
25d10 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
25d20 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
25d30 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
25d40 20 65 78 70 72 4e 6f 64 65 43 6f 70 79 28 26 65   exprNodeCopy(&e
25d50 78 70 72 58 2c 20 70 45 78 70 72 2d 3e 70 4c 65  xprX, pExpr->pLe
25d60 66 74 29 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f  ft);.  exprAnd.o
25d70 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78  p = TK_AND;.  ex
25d80 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63  prAnd.pLeft = &c
25d90 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41  ompLeft;.  exprA
25da0 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d  nd.pRight = &com
25db0 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65  pRight;.  compLe
25dc0 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20  ft.op = TK_GE;. 
25dd0 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20   compLeft.pLeft 
25de0 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70  = &exprX;.  comp
25df0 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45  Left.pRight = pE
25e00 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
25e10 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70  0].pExpr;.  comp
25e20 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45  Right.op = TK_LE
25e30 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c  ;.  compRight.pL
25e40 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
25e50 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74  compRight.pRight
25e60 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
25e70 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
25e80 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
25e90 26 65 78 70 72 58 2c 20 65 78 70 72 43 6f 64 65  &exprX, exprCode
25ea0 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26  Vector(pParse, &
25eb0 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31  exprX, &regFree1
25ec0 29 29 3b 0a 20 20 69 66 28 20 78 4a 75 6d 70 20  ));.  if( xJump 
25ed0 29 7b 0a 20 20 20 20 78 4a 75 6d 70 28 70 50 61  ){.    xJump(pPa
25ee0 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
25ef0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
25f00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
25f10 2a 20 4d 61 72 6b 20 74 68 65 20 65 78 70 72 65  * Mark the expre
25f20 73 73 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 66  ssion is being f
25f30 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  rom the ON or US
25f40 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
25f50 6a 6f 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 20 74  join.    ** so t
25f60 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 45  hat the sqlite3E
25f70 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 29 20  xprCodeTarget() 
25f80 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74  routine will not
25f90 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 6f 76 65   attempt to move
25fa0 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20  .    ** it into 
25fb0 74 68 65 20 50 61 72 73 65 2e 70 43 6f 6e 73 74  the Parse.pConst
25fc0 45 78 70 72 20 6c 69 73 74 2e 20 20 57 65 20 73  Expr list.  We s
25fd0 68 6f 75 6c 64 20 75 73 65 20 61 20 6e 65 77 20  hould use a new 
25fe0 62 69 74 20 66 6f 72 20 74 68 69 73 2c 0a 20 20  bit for this,.  
25ff0 20 20 2a 2a 20 66 6f 72 20 63 6c 61 72 69 74 79    ** for clarity
26000 2c 20 62 75 74 20 77 65 20 61 72 65 20 6f 75 74  , but we are out
26010 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20   of bits in the 
26020 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64  Expr.flags field
26030 20 73 6f 20 77 65 0a 20 20 20 20 2a 2a 20 68 61   so we.    ** ha
26040 76 65 20 74 6f 20 72 65 75 73 65 20 74 68 65 20  ve to reuse the 
26050 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e  EP_FromJoin bit.
26060 20 20 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20    Bummer. */.   
26070 20 65 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d 20   exprX.flags |= 
26080 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20  EP_FromJoin;.   
26090 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
260a0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 26  Target(pParse, &
260b0 65 78 70 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a  exprAnd, dest);.
260c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
260d0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
260e0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a  se, regFree1);..
260f0 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71    /* Ensure adeq
26100 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72 61  uate test covera
26110 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  ge */.  testcase
26120 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
26130 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
26140 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
26150 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
26160 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
26170 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  ==sqlite3ExprIfT
26180 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75  rue  && jumpIfNu
26190 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
261a0 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
261b0 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
261c0 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26  e3ExprIfTrue  &&
261d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
261e0 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
261f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
26200 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
26210 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66  fTrue  && jumpIf
26220 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
26230 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
26240 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
26250 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
26260 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
26270 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
26280 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
26290 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
262a0 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70  rIfFalse && jump
262b0 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
262c0 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
262d0 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
262e0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
262f0 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  e && jumpIfNull!
26300 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
26310 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26320 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26330 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75  xprIfFalse && ju
26340 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
26350 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
26360 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
26370 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  =0 );.}../*.** G
26380 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
26390 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
263a0 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
263b0 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
263c0 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
263d0 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
263e0 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
263f0 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
26400 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
26410 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
26420 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
26430 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
26440 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
26450 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
26460 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
26470 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
26480 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
26490 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
264a0 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f   flag is SQLITE_
264b0 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  JUMPIFNULL..**.*
264c0 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
264d0 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
264e0 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
264f0 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
26500 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
26510 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
26520 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
26530 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
26540 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
26550 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
26560 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
26570 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
26580 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
26590 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
265a0 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
265b0 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
265c0 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
265d0 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
265e0 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
265f0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
26600 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
26610 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
26620 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
26630 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
26640 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
26650 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
26660 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
26670 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
26680 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
26690 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
266a0 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
266b0 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
266c0 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
266d0 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
266e0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
266f0 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
26700 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
26710 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20   NEVER(v==0) )  
26720 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45     return;  /* E
26730 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
26740 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
26750 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  er */.  if( NEVE
26760 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65  R(pExpr==0) ) re
26770 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79  turn;  /* No way
26780 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
26790 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72   */.  op = pExpr
267a0 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
267b0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
267c0 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  K_AND:.    case 
267d0 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 45  TK_OR: {.      E
267e0 78 70 72 20 2a 70 41 6c 74 20 3d 20 73 71 6c 69  xpr *pAlt = sqli
267f0 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66 69 65  te3ExprSimplifie
26800 64 41 6e 64 4f 72 28 70 45 78 70 72 29 3b 0a 20  dAndOr(pExpr);. 
26810 20 20 20 20 20 69 66 28 20 70 41 6c 74 21 3d 70       if( pAlt!=p
26820 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
26830 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
26840 65 28 70 50 61 72 73 65 2c 20 70 41 6c 74 2c 20  e(pParse, pAlt, 
26850 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
26860 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
26870 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  f( op==TK_AND ){
26880 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20  .        int d2 
26890 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
268a0 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
268b0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
268c0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
268d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
268e0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
268f0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26900 66 74 2c 20 64 32 2c 0a 20 20 20 20 20 20 20 20  ft, d2,.        
26910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26920 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51     jumpIfNull^SQ
26930 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
26940 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
26950 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
26960 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
26970 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
26980 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ull);.        sq
26990 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
269a0 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
269b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
269c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
269d0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
269e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
269f0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
26a00 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
26a10 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
26a20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26a30 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
26a40 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
26a50 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
26a60 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
26a70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
26a80 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
26a90 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
26aa0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
26ab0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
26ac0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
26ad0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
26ae0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
26af0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
26b00 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
26b10 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20  e TK_TRUTH: {.  
26b20 20 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20      int isNot;  
26b30 20 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52      /* IS NOT TR
26b40 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c  UE or IS NOT FAL
26b50 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  SE */.      int 
26b60 69 73 54 72 75 65 3b 20 20 20 20 20 2f 2a 20 49  isTrue;     /* I
26b70 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54  S TRUE or IS NOT
26b80 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 74   TRUE */.      t
26b90 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
26ba0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
26bb0 69 73 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f  isNot = pExpr->o
26bc0 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20  p2==TK_ISNOT;.  
26bd0 20 20 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c      isTrue = sql
26be0 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c  ite3ExprTruthVal
26bf0 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ue(pExpr->pRight
26c00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
26c10 65 28 20 69 73 54 72 75 65 20 26 26 20 69 73 4e  e( isTrue && isN
26c20 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ot );.      test
26c30 63 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26  case( !isTrue &&
26c40 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20   isNot );.      
26c50 69 66 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e  if( isTrue ^ isN
26c60 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ot ){.        sq
26c70 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
26c80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
26c90 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20  Left, dest,.    
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cb0 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51        isNot ? SQ
26cc0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
26cd0 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  : 0);.      }els
26ce0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
26cf0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
26d00 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26d10 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20  ft, dest,.      
26d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d30 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c       isNot ? SQL
26d40 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a  ITE_JUMPIFNULL :
26d50 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
26d60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
26d70 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
26d80 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
26d90 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  T:.      testcas
26da0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  e( op==TK_IS );.
26db0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26dc0 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
26dd0 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
26de0 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
26df0 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75   TK_NE;.      ju
26e00 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54  mpIfNull = SQLIT
26e10 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
26e20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
26e30 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
26e40 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
26e50 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
26e60 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
26e70 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
26e80 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
26e90 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
26ea0 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
26eb0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20  pExpr->pLeft) ) 
26ec0 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70  goto default_exp
26ed0 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  r;.      testcas
26ee0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
26ef0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
26f00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
26f10 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
26f20 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
26f30 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
26f40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
26f50 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
26f60 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
26f70 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
26f80 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
26f90 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
26fa0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
26fb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26fc0 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
26fd0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
26fe0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
26ff0 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
27000 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
27010 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27020 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
27030 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
27040 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
27050 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
27060 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
27070 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
27080 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
27090 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
270a0 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
270b0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
270c0 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Gt);.      a
270d0 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
270e0 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
270f0 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
27100 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
27110 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Ge);.      ass
27120 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
27130 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
27140 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64  OP_Eq);.      Vd
27150 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27160 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
27170 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
27180 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
27190 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
271a0 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
271b0 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
271c0 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
271d0 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50  assert(TK_NE==OP
271e0 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ne); testcase(o
271f0 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
27200 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27210 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
27220 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
27230 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
27240 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
27250 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
27260 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
27270 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
27280 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
27290 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
272a0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
272b0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
272c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
272d0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
272e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
272f0 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61  TNULL: {.      a
27300 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
27310 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20  ==OP_IsNull );  
27320 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
27330 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
27340 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
27350 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
27360 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70   ); testcase( op
27370 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
27380 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
27390 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
273a0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
273b0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
273c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
273d0 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
273e0 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
273f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27400 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
27410 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27420 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
27430 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
27440 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27450 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
27460 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27470 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
27480 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
27490 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
274a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
274b0 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
274c0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
274d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
274e0 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  ue, jumpIfNull);
274f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27500 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
27510 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
27520 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
27530 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
27540 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
27550 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
27560 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
27570 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
27580 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73  jumpIfNull ? des
27590 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b  t : destIfFalse;
275a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
275b0 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
275c0 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
275d0 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
275e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
275f0 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
27600 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27610 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
27620 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
27630 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27640 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
27650 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65  efault: {.    de
27660 66 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20  fault_expr:.    
27670 20 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73    if( ExprAlways
27680 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
27690 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
276a0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
276b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
276c0 20 45 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   ExprAlwaysFalse
276d0 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
276e0 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20     /* No-op */. 
276f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27700 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
27710 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
27720 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
27730 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
27740 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27750 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20  3(v, OP_If, r1, 
27760 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
27770 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  !=0);.        Vd
27780 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
27790 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
277a0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
277b0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
277c0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
277d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
277e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
277f0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
27800 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
27810 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
27820 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
27830 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
27840 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a  Free2);  .}../*.
27850 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
27860 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
27870 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
27880 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
27890 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
278a0 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
278b0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
278c0 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
278d0 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
278e0 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
278f0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
27900 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
27910 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
27920 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
27930 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
27940 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e   nor false) then
27950 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70  .** jump if jump
27960 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45  IfNull is SQLITE
27970 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66  _JUMPIFNULL or f
27980 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a  all through if j
27990 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20  umpIfNull.** is 
279a0 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
279b0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61  e3ExprIfFalse(Pa
279c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
279d0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
279e0 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
279f0 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
27a00 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
27a10 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
27a20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
27a30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
27a40 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
27a50 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
27a60 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
27a70 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
27a80 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
27a90 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
27aa0 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  0) ) return; /* 
27ab0 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
27ac0 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
27ad0 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ler */.  if( pEx
27ae0 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72  pr==0 )    retur
27af0 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  n;..  /* The val
27b00 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20  ue of pExpr->op 
27b10 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74  and op are relat
27b20 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
27b30 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70   **.  **       p
27b40 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
27b50 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20      op.  **     
27b60 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20    ---------     
27b70 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a       ----------.
27b80 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53    **       TK_IS
27b90 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50  NULL          OP
27ba0 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  _NotNull.  **   
27bb0 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20      TK_NOTNULL  
27bc0 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c         OP_IsNull
27bd0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
27be0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
27bf0 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Eq.  **       
27c00 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20  TK_EQ           
27c10 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20     OP_Ne.  **   
27c20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20      TK_GT       
27c30 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a         OP_Le.  *
27c40 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20  *       TK_LE   
27c50 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74             OP_Gt
27c60 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
27c70 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
27c80 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Lt.  **       
27c90 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20  TK_LT           
27ca0 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20     OP_Ge.  **.  
27cb0 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c  ** For other val
27cc0 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  ues of pExpr->op
27cd0 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65  , op is undefine
27ce0 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20  d and unused..  
27cf0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
27d00 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
27d10 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67  tants are arrang
27d20 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a  ed such that we.
27d30 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65    ** can compute
27d40 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f   the mapping abo
27d50 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  ve using the fol
27d60 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
27d70 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29  n..  ** Assert()
27d80 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  s verify that th
27d90 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
27da0 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20   correct..  */. 
27db0 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f   op = ((pExpr->o
27dc0 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29  p+(TK_ISNULL&1))
27dd0 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  ^1)-(TK_ISNULL&1
27de0 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
27df0 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e  correct alignmen
27e00 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  t of TK_ and OP_
27e10 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a   constants.  */.
27e20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
27e30 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c  >op!=TK_ISNULL |
27e40 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  | op==OP_NotNull
27e50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
27e60 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e  xpr->op!=TK_NOTN
27e70 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73  ULL || op==OP_Is
27e80 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
27e90 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27ea0 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20  NE || op==OP_Eq 
27eb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27ec0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  pr->op!=TK_EQ ||
27ed0 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20   op==OP_Ne );.  
27ee0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27ef0 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_LT || op==
27f00 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ge );.  asser
27f10 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
27f20 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _LE || op==OP_Gt
27f30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
27f40 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c  xpr->op!=TK_GT |
27f50 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  | op==OP_Le );. 
27f60 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
27f70 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d  op!=TK_GE || op=
27f80 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69  =OP_Lt );..  swi
27f90 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
27fa0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
27fb0 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  D:.    case TK_O
27fc0 52 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  R: {.      Expr 
27fd0 2a 70 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 45  *pAlt = sqlite3E
27fe0 78 70 72 53 69 6d 70 6c 69 66 69 65 64 41 6e 64  xprSimplifiedAnd
27ff0 4f 72 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20  Or(pExpr);.     
28000 20 69 66 28 20 70 41 6c 74 21 3d 70 45 78 70 72   if( pAlt!=pExpr
28010 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
28020 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
28030 50 61 72 73 65 2c 20 70 41 6c 74 2c 20 64 65 73  Parse, pAlt, des
28040 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
28050 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
28060 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  pExpr->op==TK_AN
28070 44 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  D ){.        tes
28080 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
28090 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l==0 );.        
280a0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
280b0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
280c0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
280d0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
280e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
280f0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
28100 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
28110 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
28120 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
28130 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
28140 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
28150 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
28160 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
28170 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
28180 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28190 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
281a0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
281b0 64 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2,.            
281c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 75                ju
281d0 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
281e0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
281f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28200 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
28210 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
28220 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
28230 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28240 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
28250 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
28260 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
28270 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
28280 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
28290 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
282a0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
282b0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
282c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
282d0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
282e0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
282f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
28300 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20   case TK_TRUTH: 
28310 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f  {.      int isNo
28320 74 3b 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54  t;   /* IS NOT T
28330 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41  RUE or IS NOT FA
28340 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  LSE */.      int
28350 20 69 73 54 72 75 65 3b 20 20 2f 2a 20 49 53 20   isTrue;  /* IS 
28360 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54  TRUE or IS NOT T
28370 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  RUE */.      tes
28380 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
28390 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73  l==0 );.      is
283a0 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32  Not = pExpr->op2
283b0 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20  ==TK_ISNOT;.    
283c0 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74    isTrue = sqlit
283d0 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65  e3ExprTruthValue
283e0 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
283f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28400 20 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74   isTrue && isNot
28410 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28420 73 65 28 20 21 69 73 54 72 75 65 20 26 26 20 69  se( !isTrue && i
28430 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69 66  sNot );.      if
28440 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e 6f 74  ( isTrue ^ isNot
28450 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
28460 53 20 54 52 55 45 20 61 6e 64 20 49 53 20 4e 4f  S TRUE and IS NO
28470 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20  T FALSE */.     
28480 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
28490 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
284a0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
284b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e               isN
284d0 6f 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f  ot ? 0 : SQLITE_
284e0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 0a 20 20  JUMPIFNULL);..  
284f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28500 20 20 20 2f 2a 20 49 53 20 46 41 4c 53 45 20 61     /* IS FALSE a
28510 6e 64 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a  nd IS NOT TRUE *
28520 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
28530 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
28540 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
28550 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20  , dest,.        
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28570 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51    isNot ? 0 : SQ
28580 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
28590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
285a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
285b0 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
285c0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a   case TK_ISNOT:.
285d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
285e0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
285f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28600 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
28610 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
28620 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70   op = (pExpr->op
28630 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45  ==TK_IS) ? TK_NE
28640 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   : TK_EQ;.      
28650 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c  jumpIfNull = SQL
28660 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20  ITE_NULLEQ;.    
28670 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a    /* Fall thru *
28680 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
28690 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
286a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
286b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
286c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
286d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
286e0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
286f0 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
28700 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  r(pExpr->pLeft) 
28710 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65  ) goto default_e
28720 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63  xpr;.      testc
28730 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
28740 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  =0 );.      r1 =
28750 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
28760 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
28770 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
28780 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
28790 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
287a0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
287b0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
287c0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
287d0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
287e0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
287f0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
28800 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
28810 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
28820 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
28830 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
28840 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
28850 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
28860 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
28870 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
28880 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
28890 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
288a0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
288b0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
288c0 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
288d0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
288e0 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
288f0 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
28900 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
28910 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
28920 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f   assert(TK_GE==O
28930 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ge); testcase(
28940 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
28950 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
28960 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Ge);.      a
28970 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
28980 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
28990 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20  ==OP_Eq);.      
289a0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
289b0 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
289c0 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
289d0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
289e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
289f0 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
28a00 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
28a10 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
28a20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
28a30 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
28a40 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  (op==OP_Ne);.   
28a50 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
28a60 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
28a70 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
28a80 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
28a90 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
28aa0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
28ab0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
28ac0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
28ad0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
28ae0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
28af0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
28b00 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
28b10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28b20 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
28b30 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
28b40 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
28b50 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
28b60 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
28b70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
28b80 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
28b90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28ba0 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
28bb0 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
28bc0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
28bd0 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76  ULL );   VdbeCov
28be0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
28bf0 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
28c00 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
28c10 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64  K_NOTNULL );  Vd
28c20 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
28c30 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
28c40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28c50 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
28c60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28c70 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
28c80 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
28c90 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
28ca0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
28cb0 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
28cc0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
28cd0 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70  dest, sqlite3Exp
28ce0 72 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66  rIfFalse, jumpIf
28cf0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
28d00 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
28d10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
28d20 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
28d30 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
28d40 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b  f( jumpIfNull ){
28d50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28d60 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
28d70 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
28d80 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
28d90 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
28da0 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
28db0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
28dc0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
28dd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
28de0 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
28df0 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66  pr, dest, destIf
28e00 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
28e10 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
28e20 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
28e30 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Null);.      }. 
28e40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28e50 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
28e60 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61  ault: {.    defa
28e70 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20 20 20  ult_expr: .     
28e80 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73 46   if( ExprAlwaysF
28e90 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20  alse(pExpr) ){. 
28ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28eb0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
28ec0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
28ed0 20 45 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   ExprAlwaysTrue(
28ee0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
28ef0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
28f00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28f10 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
28f20 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
28f30 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
28f40 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
28f50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
28f60 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31  (v, OP_IfNot, r1
28f70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
28f80 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ll!=0);.        
28f90 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
28fa0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
28fb0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
28fc0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
28fd0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
28fe0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
28ff0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
29000 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
29010 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
29020 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
29030 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
29040 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
29050 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a  egFree2);.}../*.
29060 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45  ** Like sqlite3E
29070 78 70 72 49 66 46 61 6c 73 65 28 29 20 65 78 63  xprIfFalse() exc
29080 65 70 74 20 74 68 61 74 20 61 20 63 6f 70 79 20  ept that a copy 
29090 69 73 20 6d 61 64 65 20 6f 66 20 70 45 78 70 72  is made of pExpr
290a0 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65 20   before.** code 
290b0 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20  generation, and 
290c0 74 68 61 74 20 63 6f 70 79 20 69 73 20 64 65 6c  that copy is del
290d0 65 74 65 64 20 61 66 74 65 72 20 63 6f 64 65 20  eted after code 
290e0 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69 73  generation. This
290f0 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 61 74  .** ensures that
29100 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 45   the original pE
29110 78 70 72 20 69 73 20 75 6e 63 68 61 6e 67 65 64  xpr is unchanged
29120 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
29130 33 45 78 70 72 49 66 46 61 6c 73 65 44 75 70 28  3ExprIfFalseDup(
29140 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
29150 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
29160 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66 4e  dest,int jumpIfN
29170 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ull){.  sqlite3 
29180 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
29190 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20  ;.  Expr *pCopy 
291a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
291b0 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
291c0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
291d0 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
291e0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
291f0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f 70  lse(pParse, pCop
29200 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  y, dest, jumpIfN
29210 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ull);.  }.  sqli
29220 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
29230 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a 0a  , pCopy);.}../*.
29240 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 56  ** Expression pV
29250 61 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ar is guaranteed
29260 20 74 6f 20 62 65 20 61 6e 20 53 51 4c 20 76 61   to be an SQL va
29270 72 69 61 62 6c 65 2e 20 70 45 78 70 72 20 6d 61  riable. pExpr ma
29280 79 20 62 65 20 61 6e 79 0a 2a 2a 20 74 79 70 65  y be any.** type
29290 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   of expression..
292a0 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  **.** If pExpr i
292b0 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76  s a simple SQL v
292c0 61 6c 75 65 20 2d 20 61 6e 20 69 6e 74 65 67 65  alue - an intege
292d0 72 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c  r, real, string,
292e0 20 62 6c 6f 62 0a 2a 2a 20 6f 72 20 4e 55 4c 4c   blob.** or NULL
292f0 20 76 61 6c 75 65 20 2d 20 74 68 65 6e 20 74 68   value - then th
29300 65 20 56 44 42 45 20 63 75 72 72 65 6e 74 6c 79  e VDBE currently
29310 20 62 65 69 6e 67 20 70 72 65 70 61 72 65 64 20   being prepared 
29320 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a  is configured.**
29330 20 74 6f 20 72 65 2d 70 72 65 70 61 72 65 20 65   to re-prepare e
29340 61 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 76  ach time a new v
29350 61 6c 75 65 20 69 73 20 62 6f 75 6e 64 20 74 6f  alue is bound to
29360 20 76 61 72 69 61 62 6c 65 20 70 56 61 72 2e 0a   variable pVar..
29370 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c  **.** Additional
29380 6c 79 2c 20 69 66 20 70 45 78 70 72 20 69 73 20  ly, if pExpr is 
29390 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c  a simple SQL val
293a0 75 65 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ue and the value
293b0 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   is the.** same 
293c0 61 73 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  as that currentl
293d0 79 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61  y bound to varia
293e0 62 6c 65 20 70 56 61 72 2c 20 6e 6f 6e 2d 7a 65  ble pVar, non-ze
293f0 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
29400 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
29410 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20   the values are 
29420 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 6f 72 20  not the same or 
29430 69 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20  if pExpr is not 
29440 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 53 51 4c 20  a simple.** SQL 
29450 76 61 6c 75 65 2c 20 7a 65 72 6f 20 69 73 20 72  value, zero is r
29460 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
29470 69 63 20 69 6e 74 20 65 78 70 72 43 6f 6d 70 61  ic int exprCompa
29480 72 65 56 61 72 69 61 62 6c 65 28 50 61 72 73 65  reVariable(Parse
29490 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
294a0 70 56 61 72 2c 20 45 78 70 72 20 2a 70 45 78 70  pVar, Expr *pExp
294b0 72 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  r){.  int res = 
294c0 30 3b 0a 20 20 69 6e 74 20 69 56 61 72 3b 0a 20  0;.  int iVar;. 
294d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
294e0 70 4c 2c 20 2a 70 52 20 3d 20 30 3b 0a 20 20 0a  pL, *pR = 0;.  .
294f0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
29500 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64  omExpr(pParse->d
29510 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54 45  b, pExpr, SQLITE
29520 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 41 46  _UTF8, SQLITE_AF
29530 46 5f 42 4c 4f 42 2c 20 26 70 52 29 3b 0a 20 20  F_BLOB, &pR);.  
29540 69 66 28 20 70 52 20 29 7b 0a 20 20 20 20 69 56  if( pR ){.    iV
29550 61 72 20 3d 20 70 56 61 72 2d 3e 69 43 6f 6c 75  ar = pVar->iColu
29560 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  mn;.    sqlite3V
29570 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50  dbeSetVarmask(pP
29580 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61  arse->pVdbe, iVa
29590 72 29 3b 0a 20 20 20 20 70 4c 20 3d 20 73 71 6c  r);.    pL = sql
295a0 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
295b0 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52  Value(pParse->pR
295c0 65 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20  eprepare, iVar, 
295d0 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 29  SQLITE_AFF_BLOB)
295e0 3b 0a 20 20 20 20 69 66 28 20 70 4c 20 29 7b 0a  ;.    if( pL ){.
295f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
29600 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4c 29  3_value_type(pL)
29610 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b  ==SQLITE_TEXT ){
29620 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29630 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4c 29 3b  _value_text(pL);
29640 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
29650 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 55 54  e encoding is UT
29660 46 2d 38 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  F-8 */.      }. 
29670 20 20 20 20 20 72 65 73 20 3d 20 20 30 3d 3d 73       res =  0==s
29680 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
29690 28 70 4c 2c 20 70 52 2c 20 30 29 3b 0a 20 20 20  (pL, pR, 0);.   
296a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61   }.    sqlite3Va
296b0 6c 75 65 46 72 65 65 28 70 52 29 3b 0a 20 20 20  lueFree(pR);.   
296c0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
296d0 65 28 70 4c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  e(pL);.  }..  re
296e0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
296f0 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d  ** Do a deep com
29700 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65  parison of two e
29710 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e  xpression trees.
29720 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
29730 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
29740 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74  ions are complet
29750 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  ely identical.  
29760 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 79  Return 1 if they
29770 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20   differ only.** 
29780 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65  by a COLLATE ope
29790 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70  rator at the top
297a0 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20   level.  Return 
297b0 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64  2 if there are d
297c0 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74  ifferences.** ot
297d0 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70  her than the top
297e0 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f  -level COLLATE o
297f0 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  perator..**.** I
29800 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74  f any subelement
29810 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e   of pB has Expr.
29820 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65  iTable==(-1) the
29830 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a  n it is allowed.
29840 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71  ** to compare eq
29850 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61  ual to an equiva
29860 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  lent element in 
29870 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61  pA with Expr.iTa
29880 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  ble==iTab..**.**
29890 20 54 68 65 20 70 41 20 73 69 64 65 20 6d 69 67   The pA side mig
298a0 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52  ht be using TK_R
298b0 45 47 49 53 54 45 52 2e 20 20 49 66 20 74 68 61  EGISTER.  If tha
298c0 74 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  t is the case an
298d0 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75  d pB is.** not u
298e0 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
298f0 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
29900 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68  e equivalent, th
29910 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20  en still return 
29920 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  0..**.** Sometim
29930 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  es this routine 
29940 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76  will return 2 ev
29950 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78  en if the two ex
29960 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61  pressions.** rea
29970 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65  lly are equivale
29980 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f  nt.  If we canno
29990 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  t prove that the
299a0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
299b0 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77  .** identical, w
299c0 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20  e return 2 just 
299d0 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20  to be safe.  So 
299e0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
299f0 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68  ** returns 2, th
29a00 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65  en you do not re
29a10 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65  ally know for ce
29a20 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f  rtain if the two
29a30 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
29a40 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42  are the same.  B
29a50 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20  ut if you get a 
29a60 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74  0 or 1 return, t
29a70 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62  hen you.** can b
29a80 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65  e sure the expre
29a90 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
29aa0 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61  ame.  In the pla
29ab0 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69  ces where.** thi
29ac0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
29ad0 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68  d, it does not h
29ae0 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78  urt to get an ex
29af0 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20  tra 2 - that.** 
29b00 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c  just might resul
29b10 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74  t in some slight
29b20 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20  ly slower code. 
29b30 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a   But returning.*
29b40 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30  * an incorrect 0
29b50 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64   or 1 could lead
29b60 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f   to a malfunctio
29b70 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72  n..**.** If pPar
29b80 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  se is not NULL t
29b90 68 65 6e 20 54 4b 5f 56 41 52 49 41 42 4c 45 20  hen TK_VARIABLE 
29ba0 74 65 72 6d 73 20 69 6e 20 70 41 20 77 69 74 68  terms in pA with
29bb0 20 62 69 6e 64 69 6e 67 73 20 69 6e 0a 2a 2a 20   bindings in.** 
29bc0 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
29bd0 72 65 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65  re can be matche
29be0 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65 72 61  d against litera
29bf0 6c 73 20 69 6e 20 70 42 2e 20 20 54 68 65 20 0a  ls in pB.  The .
29c00 2a 2a 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ** pParse->pVdbe
29c10 2d 3e 65 78 70 6d 61 73 6b 20 62 69 74 6d 61 73  ->expmask bitmas
29c20 6b 20 69 73 20 75 70 64 61 74 65 64 20 66 6f 72  k is updated for
29c30 20 65 61 63 68 20 76 61 72 69 61 62 6c 65 20 72   each variable r
29c40 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 49 66  eferenced..** If
29c50 20 70 50 61 72 73 65 20 69 73 20 4e 55 4c 4c 20   pParse is NULL 
29c60 28 74 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73 65  (the normal case
29c70 29 20 74 68 65 6e 20 61 6e 79 20 54 4b 5f 56 41  ) then any TK_VA
29c80 52 49 41 42 4c 45 20 74 65 72 6d 20 69 6e 20 0a  RIABLE term in .
29c90 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 50 61 72  ** Argument pPar
29ca0 73 65 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  se should normal
29cb0 6c 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69  ly be NULL. If i
29cc0 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e  t is not NULL an
29cd0 64 20 70 41 20 6f 72 0a 2a 2a 20 70 42 20 63 61  d pA or.** pB ca
29ce0 75 73 65 73 20 61 20 72 65 74 75 72 6e 20 76 61  uses a return va
29cf0 6c 75 65 20 6f 66 20 32 2e 0a 2a 2f 0a 69 6e 74  lue of 2..*/.int
29d00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
29d10 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  are(Parse *pPars
29d20 65 2c 20 45 78 70 72 20 2a 70 41 2c 20 45 78 70  e, Expr *pA, Exp
29d30 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29  r *pB, int iTab)
29d40 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64  {.  u32 combined
29d50 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d  Flags;.  if( pA=
29d60 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20  =0 || pB==0 ){. 
29d70 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41     return pB==pA
29d80 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20   ? 0 : 2;.  }.  
29d90 69 66 28 20 70 50 61 72 73 65 20 26 26 20 70 41  if( pParse && pA
29da0 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
29db0 45 20 26 26 20 65 78 70 72 43 6f 6d 70 61 72 65  E && exprCompare
29dc0 56 61 72 69 61 62 6c 65 28 70 50 61 72 73 65 2c  Variable(pParse,
29dd0 20 70 41 2c 20 70 42 29 20 29 7b 0a 20 20 20 20   pA, pB) ){.    
29de0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
29df0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20  combinedFlags = 
29e00 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e  pA->flags | pB->
29e10 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d  flags;.  if( com
29e20 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
29e30 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
29e40 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70  if( (pA->flags&p
29e50 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56  B->flags&EP_IntV
29e60 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e  alue)!=0 && pA->
29e70 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e  u.iValue==pB->u.
29e80 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  iValue ){.      
29e90 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
29ea0 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
29eb0 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
29ec0 70 42 2d 3e 6f 70 20 7c 7c 20 70 41 2d 3e 6f 70  pB->op || pA->op
29ed0 3d 3d 54 4b 5f 52 41 49 53 45 20 29 7b 0a 20 20  ==TK_RAISE ){.  
29ee0 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b    if( pA->op==TK
29ef0 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
29f00 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
29f10 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74  Parse, pA->pLeft
29f20 2c 70 42 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20  ,pB,iTab)<2 ){. 
29f30 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
29f40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d     }.    if( pB-
29f50 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
29f60 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
29f70 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41  mpare(pParse, pA
29f80 2c 70 42 2d 3e 70 4c 65 66 74 2c 69 54 61 62 29  ,pB->pLeft,iTab)
29f90 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <2 ){.      retu
29fa0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
29fb0 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
29fc0 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43  if( pA->op!=TK_C
29fd0 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21  OLUMN && pA->op!
29fe0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26  =TK_AGG_COLUMN &
29ff0 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  & pA->u.zToken )
2a000 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  {.    if( pA->op
2a010 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  ==TK_FUNCTION ){
2a020 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2a030 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e  e3StrICmp(pA->u.
2a040 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f  zToken,pB->u.zTo
2a050 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ken)!=0 ) return
2a060 20 32 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   2;.#ifndef SQLI
2a070 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
2a080 4e 43 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74  NC.      /* Just
2a090 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 74 68  ification for th
2a0a0 65 20 61 73 73 65 72 74 28 29 3a 0a 20 20 20 20  e assert():.    
2a0b0 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63    ** window func
2a0c0 74 69 6f 6e 73 20 68 61 76 65 20 70 2d 3e 6f 70  tions have p->op
2a0d0 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 62 75  ==TK_FUNCTION bu
2a0e0 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  t aggregate func
2a0f0 74 69 6f 6e 73 0a 20 20 20 20 20 20 2a 2a 20 68  tions.      ** h
2a100 61 76 65 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  ave p->op==TK_AG
2a110 47 5f 46 55 4e 43 54 49 4f 4e 2e 20 20 53 6f 20  G_FUNCTION.  So 
2a120 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  any comparison b
2a130 65 74 77 65 65 6e 20 61 6e 20 61 67 67 72 65 67  etween an aggreg
2a140 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  ate.      ** fun
2a150 63 74 69 6f 6e 20 61 6e 64 20 61 20 77 69 6e 64  ction and a wind
2a160 6f 77 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  ow function shou
2a170 6c 64 20 68 61 76 65 20 66 61 69 6c 65 64 20 62  ld have failed b
2a180 65 66 6f 72 65 20 72 65 61 63 68 69 6e 67 0a 20  efore reaching. 
2a190 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69       ** this poi
2a1a0 6e 74 2e 20 20 41 6e 64 2c 20 69 74 20 69 73 20  nt.  And, it is 
2a1b0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
2a1c0 68 61 76 65 20 61 20 77 69 6e 64 6f 77 20 66 75  have a window fu
2a1d0 6e 63 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  nction and.     
2a1e0 20 2a 2a 20 61 20 73 63 61 6c 61 72 20 66 75 6e   ** a scalar fun
2a1f0 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73  ction with the s
2a200 61 6d 65 20 6e 61 6d 65 20 61 6e 64 20 6e 75 6d  ame name and num
2a210 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2a220 2e 20 20 53 6f 0a 20 20 20 20 20 20 2a 2a 20 69  .  So.      ** i
2a230 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
2a240 70 6f 69 6e 74 2c 20 65 69 74 68 65 72 20 41 20  point, either A 
2a250 61 6e 64 20 42 20 62 6f 74 68 20 77 69 6e 64 6f  and B both windo
2a260 77 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 0a 20  w functions or. 
2a270 20 20 20 20 20 2a 2a 20 6e 65 69 74 68 65 72 20       ** neither 
2a280 61 72 65 20 61 20 77 69 6e 64 6f 77 20 66 75 6e  are a window fun
2a290 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 20  ctions. */.     
2a2a0 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
2a2b0 50 72 6f 70 65 72 74 79 28 70 41 2c 45 50 5f 57  Property(pA,EP_W
2a2c0 69 6e 46 75 6e 63 29 3d 3d 45 78 70 72 48 61 73  inFunc)==ExprHas
2a2d0 50 72 6f 70 65 72 74 79 28 70 42 2c 45 50 5f 57  Property(pB,EP_W
2a2e0 69 6e 46 75 6e 63 29 20 29 3b 0a 20 20 20 20 20  inFunc) );.     
2a2f0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
2a300 65 72 74 79 28 70 41 2c 45 50 5f 57 69 6e 46 75  erty(pA,EP_WinFu
2a310 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  nc) ){.        i
2a320 66 28 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  f( sqlite3Window
2a330 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 70  Compare(pParse,p
2a340 41 2d 3e 79 2e 70 57 69 6e 2c 70 42 2d 3e 79 2e  A->y.pWin,pB->y.
2a350 70 57 69 6e 29 21 3d 30 20 29 20 72 65 74 75 72  pWin)!=0 ) retur
2a360 6e 20 32 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  n 2;.      }.#en
2a370 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
2a380 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c  ( pA->op==TK_NUL
2a390 4c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  L ){.      retur
2a3a0 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
2a3b0 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pA->op==TK_CO
2a3c0 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  LLATE ){.      i
2a3d0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
2a3e0 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
2a3f0 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
2a400 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
2a410 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
2a420 53 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d  S(pB->u.zToken!=
2a430 30 29 20 26 26 20 73 74 72 63 6d 70 28 70 41 2d  0) && strcmp(pA-
2a440 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
2a450 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20  zToken)!=0 ){.  
2a460 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
2a470 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
2a480 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  A->flags & EP_Di
2a490 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c  stinct)!=(pB->fl
2a4a0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
2a4b0 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  t) ) return 2;. 
2a4c0 20 69 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c   if( (combinedFl
2a4d0 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ags & EP_TokenOn
2a4e0 6c 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ly)==0 ){.    if
2a4f0 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
2a500 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
2a510 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
2a520 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67  f( (combinedFlag
2a530 73 20 26 20 45 50 5f 46 69 78 65 64 43 6f 6c 29  s & EP_FixedCol)
2a540 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ==0.     && sqli
2a550 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2a560 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74  Parse, pA->pLeft
2a570 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61  , pB->pLeft, iTa
2a580 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
2a590 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2a5a0 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
2a5b0 2c 20 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42  , pA->pRight, pB
2a5c0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
2a5d0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a5e0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
2a5f0 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78  istCompare(pA->x
2a600 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c  .pList, pB->x.pL
2a610 69 73 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  ist, iTab) ) ret
2a620 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 70  urn 2;.    if( p
2a630 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47  A->op!=TK_STRING
2a640 0a 20 20 20 20 20 26 26 20 70 41 2d 3e 6f 70 21  .     && pA->op!
2a650 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 0a 20 20  =TK_TRUEFALSE.  
2a660 20 20 20 26 26 20 28 63 6f 6d 62 69 6e 65 64 46     && (combinedF
2a670 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65  lags & EP_Reduce
2a680 64 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  d)==0.    ){.   
2a690 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75     if( pA->iColu
2a6a0 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
2a6b0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a6c0 20 20 69 66 28 20 70 41 2d 3e 6f 70 32 21 3d 70    if( pA->op2!=p
2a6d0 42 2d 3e 6f 70 32 20 29 20 72 65 74 75 72 6e 20  B->op2 ) return 
2a6e0 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  2;.      if( pA-
2a6f0 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
2a700 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28  ble .       && (
2a710 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62  pA->iTable!=iTab
2a720 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54   || NEVER(pB->iT
2a730 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75  able>=0)) ) retu
2a740 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 2;.    }.  }.
2a750 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a760 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
2a770 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
2a780 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
2a790 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
2a7a0 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a  al and .** non-z
2a7b0 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66  ero if they diff
2a7c0 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
2a7d0 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
2a7e0 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
2a7f0 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
2a800 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
2a810 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
2a820 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
2a830 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
2a840 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
2a850 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
2a860 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2a870 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ine might return
2a880 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71   non-zero for eq
2a890 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73  uivalent ExprLis
2a8a0 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79  ts.  The.** only
2a8b0 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c   consequence wil
2a8c0 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70  l be disabled op
2a8d0 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75  timizations.  Bu
2a8e0 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
2a8f0 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74  * must never ret
2a900 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
2a910 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
2a920 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  s are different,
2a930 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63   or.** a malfunc
2a940 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
2a950 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
2a960 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f   pointers are co
2a970 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74  nsidered to be t
2a980 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20  he same.  But a 
2a990 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  NULL pointer.** 
2a9a0 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66  always differs f
2a9b0 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70  rom a non-NULL p
2a9c0 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
2a9d0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
2a9e0 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a  mpare(ExprList *
2a9f0 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42  pA, ExprList *pB
2aa00 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
2aa10 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
2aa20 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74  0 && pB==0 ) ret
2aa30 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d  urn 0;.  if( pA=
2aa40 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65  =0 || pB==0 ) re
2aa50 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41  turn 1;.  if( pA
2aa60 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78  ->nExpr!=pB->nEx
2aa70 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  pr ) return 1;. 
2aa80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
2aa90 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
2aaa0 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20   Expr *pExprA = 
2aab0 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pA->a[i].pExpr;.
2aac0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42      Expr *pExprB
2aad0 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pB->a[i].pExp
2aae0 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61  r;.    if( pA->a
2aaf0 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70  [i].sortOrder!=p
2ab00 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  B->a[i].sortOrde
2ab10 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
2ab20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2ab30 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70  rCompare(0, pExp
2ab40 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62  rA, pExprB, iTab
2ab50 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
2ab60 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2ab70 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
2ab80 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 29  te3ExprCompare()
2ab90 20 65 78 63 65 70 74 20 43 4f 4c 4c 41 54 45 20   except COLLATE 
2aba0 6f 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65  operators at the
2abb0 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72   top-level.** ar
2abc0 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e  e ignored..*/.in
2abd0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
2abe0 70 61 72 65 53 6b 69 70 28 45 78 70 72 20 2a 70  pareSkip(Expr *p
2abf0 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74  A, Expr *pB, int
2ac00 20 69 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e   iTab){.  return
2ac10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2ac20 61 72 65 28 30 2c 0a 20 20 20 20 20 20 20 20 20  are(0,.         
2ac30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
2ac40 6b 69 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c 0a  kipCollate(pA),.
2ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2ac60 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2ac70 61 74 65 28 70 42 29 2c 0a 20 20 20 20 20 20 20  ate(pB),.       
2ac80 20 20 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a 0a        iTab);.}..
2ac90 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  /*.** Return non
2aca0 2d 7a 65 72 6f 20 69 66 20 45 78 70 72 20 70 20  -zero if Expr p 
2acb0 63 61 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75 65  can only be true
2acc0 20 69 66 20 70 4e 4e 20 69 73 20 6e 6f 74 20 4e   if pNN is not N
2acd0 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ULL..*/.static i
2ace0 6e 74 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f  nt exprImpliesNo
2acf0 74 4e 75 6c 6c 28 0a 20 20 50 61 72 73 65 20 2a  tNull(.  Parse *
2ad00 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
2ad10 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
2ad20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 2c 20 20 20  */.  Expr *p,   
2ad30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ad40 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
2ad50 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 45 78   checked */.  Ex
2ad60 70 72 20 2a 70 4e 4e 2c 20 20 20 20 20 20 20 20  pr *pNN,        
2ad70 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
2ad80 69 6f 6e 20 74 68 61 74 20 69 73 20 4e 4f 54 20  ion that is NOT 
2ad90 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 54  NULL */.  int iT
2ada0 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ab,           /*
2adb0 20 54 61 62 6c 65 20 62 65 69 6e 67 20 65 76 61   Table being eva
2adc0 6c 75 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  luated */.  int 
2add0 73 65 65 6e 4e 6f 74 20 20 20 20 20 20 20 20 20  seenNot         
2ade0 2f 2a 20 54 72 75 65 20 69 66 20 70 20 69 73 20  /* True if p is 
2adf0 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 4e 4f  an operand of NO
2ae00 54 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  T */.){.  assert
2ae10 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ( p );.  assert(
2ae20 20 70 4e 4e 20 29 3b 0a 20 20 69 66 28 20 73 71   pNN );.  if( sq
2ae30 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2ae40 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4e 4e 2c  (pParse, p, pNN,
2ae50 20 69 54 61 62 29 3d 3d 30 20 29 20 72 65 74 75   iTab)==0 ) retu
2ae60 72 6e 20 31 3b 0a 20 20 73 77 69 74 63 68 28 20  rn 1;.  switch( 
2ae70 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
2ae80 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
2ae90 20 69 66 28 20 73 65 65 6e 4e 6f 74 20 26 26 20   if( seenNot && 
2aea0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2aeb0 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
2aec0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
2aed0 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
2aee0 61 73 50 72 6f 70 65 72 74 79 28 70 2c 45 50 5f  asProperty(p,EP_
2aef0 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20 20 20  xIsSelect).     
2af00 20 20 20 20 20 20 7c 7c 20 28 70 2d 3e 78 2e 70        || (p->x.p
2af10 4c 69 73 74 21 3d 30 20 26 26 20 70 2d 3e 78 2e  List!=0 && p->x.
2af20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 20  pList->nExpr>0) 
2af30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2af40 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75  exprImpliesNotNu
2af50 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  ll(pParse, p->pL
2af60 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20  eft, pNN, iTab, 
2af70 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a  seenNot);.    }.
2af80 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
2af90 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  EEN: {.      Exp
2afa0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
2afb0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
2afc0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
2afd0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
2afe0 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
2aff0 3d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =2 );.      if( 
2b000 73 65 65 6e 4e 6f 74 20 29 20 72 65 74 75 72 6e  seenNot ) return
2b010 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 65 78   0;.      if( ex
2b020 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c  prImpliesNotNull
2b030 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
2b040 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 4e 4e 2c  a[0].pExpr, pNN,
2b050 20 69 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29 0a   iTab, seenNot).
2b060 20 20 20 20 20 20 20 7c 7c 20 65 78 70 72 49 6d         || exprIm
2b070 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70 50 61  pliesNotNull(pPa
2b080 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d  rse, pList->a[1]
2b090 2e 70 45 78 70 72 2c 20 70 4e 4e 2c 20 69 54 61  .pExpr, pNN, iTa
2b0a0 62 2c 20 73 65 65 6e 4e 6f 74 29 0a 20 20 20 20  b, seenNot).    
2b0b0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
2b0c0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
2b0d0 20 20 20 20 20 72 65 74 75 72 6e 20 65 78 70 72       return expr
2b0e0 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70  ImpliesNotNull(p
2b0f0 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65 66 74 2c  Parse, p->pLeft,
2b100 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65 6e   pNN, iTab, seen
2b110 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Not);.    }.    
2b120 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20  case TK_EQ:.    
2b130 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
2b140 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
2b150 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
2b160 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
2b170 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
2b180 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
2b190 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
2b1a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
2b1b0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  R:.    case TK_R
2b1c0 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
2b1d0 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
2b1e0 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
2b1f0 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
2b200 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
2b210 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
2b220 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
2b230 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
2b240 20 20 20 69 66 28 20 65 78 70 72 49 6d 70 6c 69     if( exprImpli
2b250 65 73 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65  esNotNull(pParse
2b260 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 70 4e 4e  , p->pRight, pNN
2b270 2c 20 69 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29  , iTab, seenNot)
2b280 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
2b290 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
2b2a0 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61  into the next ca
2b2b0 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
2b2c0 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20  case TK_SPAN:.  
2b2d0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54    case TK_COLLAT
2b2e0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  E:.    case TK_B
2b2f0 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
2b300 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61  TK_UPLUS:.    ca
2b310 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
2b320 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 78 70        return exp
2b330 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28  rImpliesNotNull(
2b340 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65 66 74  pParse, p->pLeft
2b350 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65  , pNN, iTab, see
2b360 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nNot);.    }.   
2b370 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20   case TK_TRUTH: 
2b380 7b 0a 20 20 20 20 20 20 69 66 28 20 73 65 65 6e  {.      if( seen
2b390 4e 6f 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Not ) return 0;.
2b3a0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 32        if( p->op2
2b3b0 21 3d 54 4b 5f 49 53 20 29 20 72 65 74 75 72 6e  !=TK_IS ) return
2b3c0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2b3d0 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e   exprImpliesNotN
2b3e0 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ull(pParse, p->p
2b3f0 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c  Left, pNN, iTab,
2b400 20 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d   seenNot);.    }
2b410 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
2b420 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
2b430 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e   exprImpliesNotN
2b440 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ull(pParse, p->p
2b450 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c  Left, pNN, iTab,
2b460 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   1);.    }.  }. 
2b470 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2b480 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
2b490 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20  if we can prove 
2b4a0 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77  the pE2 will alw
2b4b0 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20 70  ays be true if p
2b4c0 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20  E1 is.** true.  
2b4d0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
2b4e0 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65  we cannot comple
2b4f0 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20  te the proof or 
2b500 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20  if pE2 might.** 
2b510 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70  be false.  Examp
2b520 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  les:.**.**     p
2b530 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70  E1: x==5       p
2b540 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
2b550 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
2b560 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e  e.**     pE1: x>
2b570 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  0        pE2: x=
2b580 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52  =5             R
2b590 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
2b5a0 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20      pE1: x=21   
2b5b0 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52      pE2: x=21 OR
2b5c0 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74   y=43     Result
2b5d0 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
2b5e0 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70 45  1: x!=123     pE
2b5f0 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
2b600 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
2b610 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d  .**     pE1: x!=
2b620 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20 49  ?1      pE2: x I
2b630 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
2b640 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
2b650 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c    pE1: x IS NULL
2b660 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
2b670 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
2b680 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31  false.**     pE1
2b690 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45 32  : x IS ?2    pE2
2b6a0 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
2b6b0 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65     Reuslt: false
2b6c0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70  .**.** When comp
2b6d0 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20  aring TK_COLUMN 
2b6e0 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70 45  nodes between pE
2b6f0 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45  1 and pE2, if pE
2b700 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54  2 has.** Expr.iT
2b710 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75  able<0 then assu
2b720 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65  me a table numbe
2b730 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e  r given by iTab.
2b740 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73 65  .**.** If pParse
2b750 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
2b760 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  en the values of
2b770 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73   bound variables
2b780 20 69 6e 20 70 45 31 20 61 72 65 20 0a 2a 2a 20   in pE1 are .** 
2b790 63 6f 6d 70 61 72 65 64 20 61 67 61 69 6e 73 74  compared against
2b7a0 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73 20   literal values 
2b7b0 69 6e 20 70 45 32 20 61 6e 64 20 70 50 61 72 73  in pE2 and pPars
2b7c0 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61 73  e->pVdbe->expmas
2b7d0 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66 69 65 64  k is.** modified
2b7e0 20 74 6f 20 72 65 63 6f 72 64 20 77 68 69 63 68   to record which
2b7f0 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73   bound variables
2b800 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64 2e   are referenced.
2b810 20 20 49 66 20 70 50 61 72 73 65 20 0a 2a 2a 20    If pParse .** 
2b820 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66 61  is NULL, then fa
2b830 6c 73 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75  lse will be retu
2b840 72 6e 65 64 20 69 66 20 70 45 31 20 63 6f 6e 74  rned if pE1 cont
2b850 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e 64 20 76  ains any bound v
2b860 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ariables..**.** 
2b870 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72  When in doubt, r
2b880 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65  eturn false.  Re
2b890 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67  turning true mig
2b8a0 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
2b8b0 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65  mance.** improve
2b8c0 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67  ment.  Returning
2b8d0 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75   false might cau
2b8e0 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  se a performance
2b8f0 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a   reduction, but.
2b900 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79  ** it will alway
2b910 73 20 67 69 76 65 20 74 68 65 20 63 6f 72 72 65  s give the corre
2b920 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73  ct answer and is
2b930 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61   hence always sa
2b940 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  fe..*/.int sqlit
2b950 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
2b960 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
2b970 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72   Expr *pE1, Expr
2b980 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29   *pE2, int iTab)
2b990 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  {.  if( sqlite3E
2b9a0 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
2b9b0 65 2c 20 70 45 31 2c 20 70 45 32 2c 20 69 54 61  e, pE1, pE2, iTa
2b9c0 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  b)==0 ){.    ret
2b9d0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
2b9e0 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a   pE2->op==TK_OR.
2b9f0 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78     && (sqlite3Ex
2ba00 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 50  prImpliesExpr(pP
2ba10 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e  arse, pE1, pE2->
2ba20 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20  pLeft, iTab).   
2ba30 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
2ba40 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
2ba50 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c  xpr(pParse, pE1,
2ba60 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54   pE2->pRight, iT
2ba70 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72  ab) ).  ){.    r
2ba80 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
2ba90 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e  f( pE2->op==TK_N
2baa0 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 65 78 70  OTNULL.   && exp
2bab0 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28  rImpliesNotNull(
2bac0 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32  pParse, pE1, pE2
2bad0 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 2c 20 30  ->pLeft, iTab, 0
2bae0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2baf0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
2bb00 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
2bb10 69 73 20 69 73 20 74 68 65 20 45 78 70 72 20 6e  is is the Expr n
2bb20 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ode callback for
2bb30 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
2bb40 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 29 2e  iesNotNullRow().
2bb50 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
2bb60 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 71 75 69  ssion node requi
2bb70 72 65 73 20 74 68 61 74 20 74 68 65 20 74 61 62  res that the tab
2bb80 6c 65 20 61 74 20 70 57 61 6c 6b 65 72 2d 3e 69  le at pWalker->i
2bb90 43 75 72 0a 2a 2a 20 68 61 76 65 20 6f 6e 65 20  Cur.** have one 
2bba0 6f 72 20 6d 6f 72 65 20 6e 6f 6e 2d 4e 55 4c 4c  or more non-NULL
2bbb0 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 73 65   column, then se
2bbc0 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  t pWalker->eCode
2bbd0 20 74 6f 20 31 20 61 6e 64 20 61 62 6f 72 74 2e   to 1 and abort.
2bbe0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2bbf0 69 6e 65 20 63 6f 6e 74 72 6f 6c 73 20 61 6e 20  ine controls an 
2bc00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 46  optimization.  F
2bc10 61 6c 73 65 20 70 6f 73 69 74 69 76 65 73 20 28  alse positives (
2bc20 73 65 74 74 69 6e 67 0a 2a 2a 20 70 57 61 6c 6b  setting.** pWalk
2bc30 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 20 77  er->eCode to 1 w
2bc40 68 65 6e 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f  hen it should no
2bc50 74 20 62 65 29 20 61 72 65 20 64 65 61 64 6c 79  t be) are deadly
2bc60 2c 20 62 75 74 20 66 61 6c 73 65 2d 6e 65 67 61  , but false-nega
2bc70 74 69 76 65 73 0a 2a 2a 20 28 6e 65 76 65 72 20  tives.** (never 
2bc80 73 65 74 74 69 6e 67 20 70 57 61 6c 6b 65 72 2d  setting pWalker-
2bc90 3e 65 43 6f 64 65 29 20 69 73 20 61 20 68 61 72  >eCode) is a har
2bca0 6d 6c 65 73 73 20 6d 69 73 73 65 64 20 6f 70 74  mless missed opt
2bcb0 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  imization..*/.st
2bcc0 61 74 69 63 20 69 6e 74 20 69 6d 70 6c 69 65 73  atic int implies
2bcd0 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57 61 6c 6b 65  NotNullRow(Walke
2bce0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2bcf0 20 2a 70 45 78 70 72 29 7b 0a 20 20 74 65 73 74   *pExpr){.  test
2bd00 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2bd10 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
2bd20 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
2bd30 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2bd40 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66  FUNCTION );.  if
2bd50 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2bd60 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
2bd70 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 57  Join) ) return W
2bd80 52 43 5f 50 72 75 6e 65 3b 0a 20 20 73 77 69 74  RC_Prune;.  swit
2bd90 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
2bda0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
2bdb0 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
2bdc0 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
2bdd0 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
2bde0 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 0a 20 20  e TK_NOTNULL:.  
2bdf0 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
2be00 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
2be10 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 0a    case TK_CASE:.
2be20 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a      case TK_IN:.
2be30 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
2be40 54 49 4f 4e 3a 0a 20 20 20 20 20 20 74 65 73 74  TION:.      test
2be50 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2be60 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
2be70 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2be80 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29  pr->op==TK_NOT )
2be90 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2bea0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2beb0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
2bec0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2bed0 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20  >op==TK_NOTNULL 
2bee0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2bef0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2bf00 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
2bf10 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2bf20 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20  ==TK_OR );.     
2bf30 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2bf40 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b  ->op==TK_CASE );
2bf50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2bf60 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2bf70 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
2bf80 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2bf90 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  TK_FUNCTION );. 
2bfa0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2bfb0 50 72 75 6e 65 3b 0a 20 20 20 20 63 61 73 65 20  Prune;.    case 
2bfc0 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20  TK_COLUMN:.     
2bfd0 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   if( pWalker->u.
2bfe0 69 43 75 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61  iCur==pExpr->iTa
2bff0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ble ){.        p
2c000 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
2c010 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
2c020 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2c030 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
2c040 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 0a 20 20  n WRC_Prune;..  
2c050 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
2c060 6c 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  les are allowed 
2c070 74 6f 20 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  to use constrain
2c080 74 73 20 6c 69 6b 65 20 78 3d 4e 55 4c 4c 2e 20  ts like x=NULL. 
2c090 20 53 6f 0a 20 20 20 20 2a 2a 20 61 20 74 65 72   So.    ** a ter
2c0a0 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 78 3d  m of the form x=
2c0b0 79 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 65  y does not prove
2c0c0 20 74 68 61 74 20 79 20 69 73 20 6e 6f 74 20 6e   that y is not n
2c0d0 75 6c 6c 20 69 66 20 78 0a 20 20 20 20 2a 2a 20  ull if x.    ** 
2c0e0 69 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  is the column of
2c0f0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
2c100 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
2c110 45 51 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EQ:.    case TK_
2c120 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
2c130 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
2c140 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
2c150 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
2c160 47 45 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  GE:.      testca
2c170 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2c180 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65  K_EQ );.      te
2c190 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c1a0 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20  p==TK_NE );.    
2c1b0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2c1c0 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  r->op==TK_LT );.
2c1d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c1e0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  pExpr->op==TK_LE
2c1f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2c200 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2c210 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GT );.      te
2c220 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c230 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
2c240 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e 70 4c    if( (pExpr->pL
2c250 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
2c260 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c 28  MN && IsVirtual(
2c270 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 79 2e  pExpr->pLeft->y.
2c280 70 54 61 62 29 29 0a 20 20 20 20 20 20 20 7c 7c  pTab)).       ||
2c290 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d   (pExpr->pRight-
2c2a0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
2c2b0 26 20 49 73 56 69 72 74 75 61 6c 28 70 45 78 70  & IsVirtual(pExp
2c2c0 72 2d 3e 70 52 69 67 68 74 2d 3e 79 2e 70 54 61  r->pRight->y.pTa
2c2d0 62 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  b)).      ){.   
2c2e0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2c2f0 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rune;.      }.  
2c300 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
2c310 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2c320 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  inue;.  }.}../*.
2c330 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28  ** Return true (
2c340 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 65 78 70  non-zero) if exp
2c350 72 65 73 73 69 6f 6e 20 70 20 63 61 6e 20 6f 6e  ression p can on
2c360 6c 79 20 62 65 20 74 72 75 65 20 69 66 20 61 74  ly be true if at
2c370 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 63 6f   least.** one co
2c380 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 54  lumn of table iT
2c390 61 62 20 69 73 20 6e 6f 6e 2d 6e 75 6c 6c 2e 20  ab is non-null. 
2c3a0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2c3b0 20 72 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20   return true.** 
2c3c0 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  if expression p 
2c3d0 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 4e  will always be N
2c3e0 55 4c 4c 20 6f 72 20 66 61 6c 73 65 20 69 66 20  ULL or false if 
2c3f0 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  every column of 
2c400 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e  iTab.** is NULL.
2c410 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 6e 65 67  .**.** False neg
2c420 61 74 69 76 65 73 20 61 72 65 20 61 63 63 65 70  atives are accep
2c430 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72  table.  In other
2c440 20 77 6f 72 64 73 2c 20 69 74 20 69 73 20 6f 6b   words, it is ok
2c450 20 74 6f 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65   to return.** ze
2c460 72 6f 20 65 76 65 6e 20 69 66 20 65 78 70 72 65  ro even if expre
2c470 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20 6e 65 76  ssion p will nev
2c480 65 72 20 62 65 20 74 72 75 65 20 6f 66 20 65 76  er be true of ev
2c490 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54  ery column of iT
2c4a0 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 20 20  ab.** is NULL.  
2c4b0 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  A false negative
2c4c0 20 69 73 20 6d 65 72 65 6c 79 20 61 20 6d 69 73   is merely a mis
2c4d0 73 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  sed optimization
2c4e0 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2a   opportunity..**
2c4f0 0a 2a 2a 20 46 61 6c 73 65 20 70 6f 73 69 74 69  .** False positi
2c500 76 65 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ves are not allo
2c510 77 65 64 2c 20 68 6f 77 65 76 65 72 2e 20 20 41  wed, however.  A
2c520 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 20   false positive 
2c530 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  may result.** in
2c540 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e   an incorrect an
2c550 73 77 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  swer..**.** Term
2c560 73 20 6f 66 20 70 20 74 68 61 74 20 61 72 65 20  s of p that are 
2c570 6d 61 72 6b 65 64 20 77 69 74 68 20 45 50 5f 46  marked with EP_F
2c580 72 6f 6d 4a 6f 69 6e 20 28 61 6e 64 20 68 65 6e  romJoin (and hen
2c590 63 65 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f  ce that come fro
2c5a0 6d 0a 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55  m.** the ON or U
2c5b0 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
2c5c0 4c 45 46 54 20 4a 4f 49 4e 53 29 20 61 72 65 20  LEFT JOINS) are 
2c5d0 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
2c5e0 65 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a  e analysis..**.*
2c5f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2c600 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
2c610 69 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  if a LEFT JOIN c
2c620 61 6e 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  an be converted 
2c630 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e  into.** an ordin
2c640 61 72 79 20 4a 4f 49 4e 2e 20 20 54 68 65 20 70  ary JOIN.  The p
2c650 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2c660 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2c670 49 66 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  If the WHERE.** 
2c680 63 6c 61 75 73 65 20 72 65 71 75 69 72 65 73 20  clause requires 
2c690 74 68 61 74 20 73 6f 6d 65 20 63 6f 6c 75 6d 6e  that some column
2c6a0 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
2c6b0 62 6c 65 20 6f 66 20 74 68 65 20 4c 45 46 54 20  ble of the LEFT 
2c6c0 4a 4f 49 4e 0a 2a 2a 20 62 65 20 6e 6f 6e 2d 4e  JOIN.** be non-N
2c6d0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 4c 45  ULL, then the LE
2c6e0 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 73  FT JOIN can be s
2c6f0 61 66 65 6c 79 20 63 6f 6e 76 65 72 74 65 64 20  afely converted 
2c700 69 6e 74 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e  into an.** ordin
2c710 61 72 79 20 6a 6f 69 6e 2e 0a 2a 2f 0a 69 6e 74  ary join..*/.int
2c720 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
2c730 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 45 78  iesNonNullRow(Ex
2c740 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 29  pr *p, int iTab)
2c750 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2c760 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
2c770 6b 69 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20  kipCollate(p);. 
2c780 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
2c790 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e   if( p->op==TK_N
2c7a0 4f 54 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  OTNULL ){.      
2c7b0 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
2c7c0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f    }else if( p->o
2c7d0 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
2c7e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2c7f0 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c  prImpliesNonNull
2c800 52 6f 77 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54  Row(p->pLeft, iT
2c810 61 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ab) ) return 1;.
2c820 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69        p = p->pRi
2c830 67 68 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ght;.    }else{.
2c840 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c850 20 7d 0a 20 20 7d 0a 20 20 77 2e 78 45 78 70 72   }.  }.  w.xExpr
2c860 43 61 6c 6c 62 61 63 6b 20 3d 20 69 6d 70 6c 69  Callback = impli
2c870 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20  esNotNullRow;.  
2c880 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2c890 6b 20 3d 20 30 3b 0a 20 20 77 2e 78 53 65 6c 65  k = 0;.  w.xSele
2c8a0 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b  ctCallback2 = 0;
2c8b0 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b 0a  .  w.eCode = 0;.
2c8c0 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 54 61    w.u.iCur = iTa
2c8d0 62 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  b;.  sqlite3Walk
2c8e0 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
2c8f0 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d  eturn w.eCode;.}
2c900 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
2c910 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2c920 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
2c930 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
2c940 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
2c950 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20  determine if an 
2c960 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
2c970 65 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72  e evaluated by r
2c980 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
2c990 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77  ** index only, w
2c9a0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
2c9b0 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
2c9c0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2c9d0 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72  ng.** table entr
2c9e0 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72  y.  The IdxCover
2c9f0 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74  .pIdx field is t
2ca00 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f  he index.  IdxCo
2ca10 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74  ver.iCur.** is t
2ca20 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  he cursor for th
2ca30 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  e table..*/.stru
2ca40 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20  ct IdxCover {.  
2ca50 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
2ca60 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
2ca70 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63   be tested for c
2ca80 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74  overage */.  int
2ca90 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a   iCur;        /*
2caa0 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
2cab0 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72  or the table cor
2cac0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
2cad0 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f  e index */.};../
2cae0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
2caf0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72  e if there are r
2cb00 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2cb10 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a  umns in table .*
2cb20 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  * pWalker->u.pId
2cb30 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e  xCover->iCur can
2cb40 20 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73   be satisfied us
2cb50 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ing the index.**
2cb60 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
2cb70 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a  Cover->pIdx..*/.
2cb80 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
2cb90 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a  dxCover(Walker *
2cba0 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2cbb0 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
2cbc0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
2cbd0 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  N.   && pExpr->i
2cbe0 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Table==pWalker->
2cbf0 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75  u.pIdxCover->iCu
2cc00 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43  r.   && sqlite3C
2cc10 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61  olumnOfIndex(pWa
2cc20 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2cc30 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e  r->pIdx, pExpr->
2cc40 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a  iColumn)<0.  ){.
2cc50 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
2cc60 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  de = 1;.    retu
2cc70 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2cc80 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2cc90 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2cca0 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
2ccb0 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20  n index pIdx on 
2ccc0 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
2ccd0 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  r iCur contains 
2cce0 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72  will.** the expr
2ccf0 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
2cd00 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
2cd10 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76  e index does cov
2cd20 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  er the.** expres
2cd30 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69  sion and false i
2cd40 66 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  f the pExpr expr
2cd50 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65  ession reference
2cd60 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a  s table columns.
2cd70 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
2cd80 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64  found in the ind
2cd90 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41  ex pIdx..**.** A
2cda0 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67  n index covering
2cdb0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
2cdc0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78  eans that the ex
2cdd0 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a  pression can be.
2cde0 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69  ** evaluated usi
2cdf0 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65  ng only the inde
2ce00 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61  x and without ha
2ce10 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74  ving to lookup t
2ce20 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
2ce30 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  ing table entry.
2ce40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2ce50 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65  xprCoveredByInde
2ce60 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  x(.  Expr *pExpr
2ce70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
2ce80 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74  index to be test
2ce90 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
2cea0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2ceb0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
2cec0 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
2ced0 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a  onding table */.
2cee0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
2cef0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
2cf00 65 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ex that might be
2cf10 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61   used for covera
2cf20 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65  ge */.){.  Walke
2cf30 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64  r w;.  struct Id
2cf40 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d  xCover xcov;.  m
2cf50 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
2cf60 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e  eof(w));.  xcov.
2cf70 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78  iCur = iCur;.  x
2cf80 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  cov.pIdx = pIdx;
2cf90 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
2cfa0 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65  ck = exprIdxCove
2cfb0 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76  r;.  w.u.pIdxCov
2cfc0 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71  er = &xcov;.  sq
2cfd0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
2cfe0 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75  , pExpr);.  retu
2cff0 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  rn !w.eCode;.}..
2d000 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2d010 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2d020 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2d030 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
2d040 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63  e walker.** to c
2d050 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  ount references 
2d060 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  to table columns
2d070 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
2d080 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72  s of an .** aggr
2d090 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  egate function, 
2d0a0 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
2d0b0 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c  ement the.** sql
2d0c0 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73  ite3FunctionThis
2d0d0 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  Src() routine..*
2d0e0 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e  /.struct SrcCoun
2d0f0 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  t {.  SrcList *p
2d100 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61  Src;   /* One pa
2d110 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c  rticular FROM cl
2d120 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64  ause in a nested
2d130 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
2d140 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20  nThis;       /* 
2d150 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
2d160 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
2d170 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  in pSrcList */. 
2d180 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20   int nOther;    
2d190 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2d1a0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2d1b0 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52  umns in other FR
2d1c0 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b  OM clauses */.};
2d1d0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  ../*.** Count th
2d1e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
2d1f0 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
2d200 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2d210 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61   exprSrcCount(Wa
2d220 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2d230 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f  xpr *pExpr){.  /
2d240 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e  * The NEVER() on
2d250 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d   the second term
2d260 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69   is because sqli
2d270 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
2d280 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73  hisSrc().  ** is
2d290 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62   always called b
2d2a0 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70  efore sqlite3Exp
2d2b0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2d2c0 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a  es() and so the.
2d2d0 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20    ** TK_COLUMNs 
2d2e0 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
2d2f0 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  n converted into
2d300 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20   TK_AGG_COLUMN. 
2d310 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   If.  ** sqlite3
2d320 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
2d330 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69  Src() is used di
2d340 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  fferently in the
2d350 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a   future, the.  *
2d360 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e  * NEVER() will n
2d370 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65  eed to be remove
2d380 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  d. */.  if( pExp
2d390 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2d3a0 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d   || NEVER(pExpr-
2d3b0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
2d3c0 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  MN) ){.    int i
2d3d0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
2d3e0 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b  Count *p = pWalk
2d3f0 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b  er->u.pSrcCount;
2d400 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
2d410 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
2d420 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72    int nSrc = pSr
2d430 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a  c ? pSrc->nSrc :
2d440 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
2d450 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20   i<nSrc; i++){. 
2d460 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
2d470 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
2d480 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65  i].iCursor ) bre
2d490 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
2d4a0 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20  ( i<nSrc ){.    
2d4b0 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20    p->nThis++;.  
2d4c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2d4d0 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20  ->nOther++;.    
2d4e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
2d4f0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2d500 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
2d510 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72  if any of the ar
2d520 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70  guments to the p
2d530 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65  Expr Function re
2d540 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c  ference.** pSrcL
2d550 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ist.  Return tru
2d560 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41  e if they do.  A
2d570 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20  lso return true 
2d580 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  if the function.
2d590 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65  ** has no argume
2d5a0 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20  nts or has only 
2d5b0 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
2d5c0 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ts.  Return fals
2d5d0 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65  e if pExpr.** re
2d5e0 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73  ferences columns
2d5f0 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73   but not columns
2d600 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64   of tables found
2d610 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f   in pSrcList..*/
2d620 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63  .int sqlite3Func
2d630 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
2d640 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63  Expr *pExpr, Src
2d650 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b  List *pSrcList){
2d660 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
2d670 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63  truct SrcCount c
2d680 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  nt;.  assert( pE
2d690 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2d6a0 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77 2e  FUNCTION );.  w.
2d6b0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2d6c0 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20  exprSrcCount;.  
2d6d0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2d6e0 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 72  k = 0;.  w.u.pSr
2d6f0 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20  cCount = &cnt;. 
2d700 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63   cnt.pSrc = pSrc
2d710 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69  List;.  cnt.nThi
2d720 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74  s = 0;.  cnt.nOt
2d730 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  her = 0;.  sqlit
2d740 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26  e3WalkExprList(&
2d750 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  w, pExpr->x.pLis
2d760 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74  t);.  return cnt
2d770 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e  .nThis>0 || cnt.
2d780 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  nOther==0;.}../*
2d790 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
2d7a0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
2d7b0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
2d7c0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
2d7d0 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
2d7e0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
2d7f0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
2d800 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
2d810 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
2d820 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
2d830 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
2d840 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
2d850 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
2d860 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
2d870 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
2d880 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
2d890 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
2d8a0 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
2d8b0 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
2d8c0 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
2d8d0 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->nColumn,.     
2d8e0 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
2d8f0 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
2d900 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
2d910 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
2d920 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72  Info->aFunc[] ar
2d930 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
2d940 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
2d950 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
2d960 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
2d970 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
2d980 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
2d990 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
2d9a0 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64  oFunc(sqlite3 *d
2d9b0 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
2d9c0 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
2d9d0 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71  Info->aFunc = sq
2d9e0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
2d9f0 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a  te(.       db, .
2da00 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46         pInfo->aF
2da10 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  unc,.       size
2da20 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
2da30 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
2da40 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
2da50 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
2da60 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
2da70 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
2da80 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ExprCallback for
2da90 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20   a tree walker. 
2daa0 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a   It is used to.*
2dab0 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  * implement sqli
2dac0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2dad0 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
2dae0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2daf0 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
2db00 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
2db10 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
2db20 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
2db30 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b  zeAggregate(Walk
2db40 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2db50 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
2db60 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
2db70 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
2db80 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65  ->u.pNC;.  Parse
2db90 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
2dba0 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
2dbb0 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
2dbc0 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
2dbd0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2dbe0 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 41 67 67   = pNC->uNC.pAgg
2dbf0 49 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  Info;..  assert(
2dc00 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20   pNC->ncFlags & 
2dc10 4e 43 5f 55 41 67 67 49 6e 66 6f 20 29 3b 0a 20  NC_UAggInfo );. 
2dc20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
2dc30 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
2dc40 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
2dc50 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
2dc60 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
2dc70 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2dc80 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
2dc90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2dca0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
2dcb0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  LUMN );.      /*
2dcc0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2dcd0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69   the column is i
2dce0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62  n one of the tab
2dcf0 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
2dd00 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20        ** clause 
2dd10 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
2dd20 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
2dd30 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c  if( ALWAYS(pSrcL
2dd40 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
2dd50 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2dd60 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
2dd70 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pSrcList->a;.   
2dd80 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2dd90 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
2dda0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
2ddb0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2ddc0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
2ddd0 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  l;.          ass
2dde0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2ddf0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2de00 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2de10 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
2de20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
2de30 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
2de40 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
2de50 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
2de60 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
2de70 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78  t means that pEx
2de80 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  pr refers to a t
2de90 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
2dea0 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74   ** that is in t
2deb0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2dec0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
2ded0 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20  query.  .       
2dee0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2def0 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65      ** Make an e
2df00 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  ntry for the col
2df10 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  umn in pAggInfo-
2df20 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65  >aCol[] if there
2df30 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2df40 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20  is not an entry 
2df50 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
2df60 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2df70 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
2df80 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
2df90 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  l = pAggInfo->aC
2dfa0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
2dfb0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49  for(k=0; k<pAggI
2dfc0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  nfo->nColumn; k+
2dfd0 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
2dfe0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2dff0 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  ol->iTable==pExp
2e000 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
2e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2e020 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  Col->iColumn==pE
2e030 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
2e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e050 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2e060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e070 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2e080 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66   if( (k>=pAggInf
2e090 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20  o->nColumn).    
2e0a0 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d           && (k =
2e0b0 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
2e0c0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  n(pParse->db, pA
2e0d0 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20  ggInfo))>=0 .   
2e0e0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2e0f0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
2e100 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
2e110 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [k];.           
2e120 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
2e130 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20  pExpr->y.pTab;. 
2e140 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2e150 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70  l->iTable = pExp
2e160 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
2e170 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2e180 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
2e190 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
2e1a0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65         pCol->iMe
2e1b0 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
2e1c0 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
2e1d0 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
2e1e0 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
2e1f0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2e200 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
2e210 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2e220 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
2e230 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBy ){.         
2e240 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b         int j, n;
2e250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e260 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d   ExprList *pGB =
2e270 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
2e280 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBy;.           
2e290 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
2e2a0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d  List_item *pTerm
2e2b0 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20   = pGB->a;.     
2e2c0 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70             n = p
2e2d0 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  GB->nExpr;.     
2e2e0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
2e2f0 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54  =0; j<n; j++, pT
2e300 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
2e310 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
2e320 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
2e330 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
2e340 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
2e350 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
2e360 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
2e370 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
2e380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e390 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45   pE->iColumn==pE
2e3a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
2e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3c0 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
2e3d0 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20  rColumn = j;.   
2e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2e400 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e410 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2e420 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2e430 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e440 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2e450 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
2e460 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2e470 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70  SorterColumn = p
2e480 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e  AggInfo->nSortin
2e490 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20  gColumn++;.     
2e4a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e4b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e4c0 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
2e4d0 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f   now an entry fo
2e4e0 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49  r pExpr in pAggI
2e4f0 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74  nfo->aCol[] (eit
2e500 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  her.            
2e510 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61  ** because it wa
2e520 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f  s there before o
2e530 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  r because we jus
2e540 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20  t created it).. 
2e550 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f             ** Co
2e560 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20  nvert the pExpr 
2e570 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43  to be a TK_AGG_C
2e580 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20  OLUMN referring 
2e590 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  to that.        
2e5a0 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d      ** pAggInfo-
2e5b0 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20  >aCol[] entry.. 
2e5c0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2e5d0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
2e5e0 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
2e5f0 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
2e600 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
2e610 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
2e620 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
2e630 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
2e640 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b  = TK_AGG_COLUMN;
2e650 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
2e660 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29  pr->iAgg = (i16)
2e670 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  k;.            b
2e680 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2e690 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72  } /* endif pExpr
2e6a0 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
2e6b0 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20  >iCursor */.    
2e6c0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f      } /* end loo
2e6d0 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  p over pSrcList 
2e6e0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
2e6f0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2e700 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  e;.    }.    cas
2e710 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
2e720 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28  N: {.      if( (
2e730 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e  pNC->ncFlags & N
2e740 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a  C_InAggFunc)==0.
2e750 20 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65         && pWalke
2e760 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d  r->walkerDepth==
2e770 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20  pExpr->op2.     
2e780 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
2e790 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
2e7a0 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63  Expr is a duplic
2e7b0 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61  ate of another a
2e7c0 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20  ggregate .      
2e7d0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68    ** function th
2e7e0 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  at is already in
2e7f0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74   the pAggInfo st
2e800 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20  ructure.        
2e810 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  */.        struc
2e820 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
2e830 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f  pItem = pAggInfo
2e840 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  ->aFunc;.       
2e850 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
2e860 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
2e870 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2e880 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2e890 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
2e8a0 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45  pItem->pExpr, pE
2e8b0 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  xpr, -1)==0 ){. 
2e8c0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2e8d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2e8e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e8f0 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d  if( i>=pAggInfo-
2e900 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  >nFunc ){.      
2e910 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20      /* pExpr is 
2e920 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20  original.  Make 
2e930 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
2e940 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
2e950 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2e960 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d          u8 enc =
2e970 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
2e980 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  ;.          i = 
2e990 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70  addAggInfoFunc(p
2e9a0 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
2e9b0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
2e9c0 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20  if( i>=0 ){.    
2e9d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e9e0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2e9f0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
2ea00 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20  lect) );.       
2ea10 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41       pItem = &pA
2ea20 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
2ea30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
2ea40 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
2ea50 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
2ea60 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b  pItem->iMem = ++
2ea70 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2ea80 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2ea90 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2eaa0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
2eab0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
2eac0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75        pItem->pFu
2ead0 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nc = sqlite3Find
2eae0 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
2eaf0 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
2eb00 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75          pExpr->u
2eb10 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20  .zToken, .      
2eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2eb30 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45  pr->x.pList ? pE
2eb40 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
2eb50 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29  xpr : 0, enc, 0)
2eb60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2eb70 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
2eb80 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   EP_Distinct ){.
2eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2eba0 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
2ebb0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2ebc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
2ebd0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2ebe0 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
2ebf0 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ct = -1;.       
2ec00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ec10 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2ec20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78       /* Make pEx
2ec30 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  pr point to the 
2ec40 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67  appropriate pAgg
2ec50 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e  Info->aFunc[] en
2ec60 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  try.        */. 
2ec70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2ec80 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2ec90 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
2eca0 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
2ecb0 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53  );.        ExprS
2ecc0 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
2ecd0 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
2ece0 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
2ecf0 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b  ->iAgg = (i16)i;
2ed00 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
2ed10 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
2ed20 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  nfo;.        ret
2ed30 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2ed40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ed50 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
2ed60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
2ed70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2ed80 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2ed90 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
2eda0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2edb0 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20  InSelect(Walker 
2edc0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
2edd0 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e   *pSelect){.  UN
2ede0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2edf0 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b  Select);.  pWalk
2ee00 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2b  er->walkerDepth+
2ee10 2b 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  +;.  return WRC_
2ee20 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
2ee30 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 41  ic void analyzeA
2ee40 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
2ee50 74 45 6e 64 28 57 61 6c 6b 65 72 20 2a 70 57 61  tEnd(Walker *pWa
2ee60 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
2ee70 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44  elect){.  UNUSED
2ee80 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65  _PARAMETER(pSele
2ee90 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ct);.  pWalker->
2eea0 77 61 6c 6b 65 72 44 65 70 74 68 2d 2d 3b 0a 7d  walkerDepth--;.}
2eeb0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
2eec0 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
2eed0 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
2eee0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2eef0 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
2ef00 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
2ef10 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
2ef20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  to AggInfo objec
2ef30 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67  t that pNC->pAgg
2ef40 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  Info.** points t
2ef50 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65  o.  Additional e
2ef60 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20  ntries are made 
2ef70 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f  on the AggInfo o
2ef80 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65  bject as.** nece
2ef90 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
2efa0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
2efb0 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
2efc0 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
2efd0 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
2efe0 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
2eff0 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
2f000 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ames()..*/.void 
2f010 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2f020 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d  zeAggregates(Nam
2f030 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
2f040 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57  xpr *pExpr){.  W
2f050 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78  alker w;.  w.xEx
2f060 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  prCallback = ana
2f070 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20  lyzeAggregate;. 
2f080 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2f090 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
2f0a0 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a  egatesInSelect;.
2f0b0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2f0c0 61 63 6b 32 20 3d 20 61 6e 61 6c 79 7a 65 41 67  ack2 = analyzeAg
2f0d0 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
2f0e0 45 6e 64 3b 0a 20 20 77 2e 77 61 6c 6b 65 72 44  End;.  w.walkerD
2f0f0 65 70 74 68 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  epth = 0;.  w.u.
2f100 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 77 2e 70  pNC = pNC;.  w.p
2f110 50 61 72 73 65 20 3d 20 30 3b 0a 20 20 61 73 73  Parse = 0;.  ass
2f120 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ert( pNC->pSrcLi
2f130 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  st!=0 );.  sqlit
2f140 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
2f150 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
2f160 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  Call sqlite3Expr
2f170 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2f180 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  s() for every ex
2f190 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a  pression in an.*
2f1a0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
2f1b0 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  t.  Return the n
2f1c0 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
2f1d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2f1e0 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
2f1f0 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74   analysis is cut
2f200 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20   short..*/.void 
2f210 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2f220 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f  zeAggList(NameCo
2f230 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
2f240 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2f250 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2f260 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
2f270 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
2f280 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74  t ){.    for(pIt
2f290 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
2f2a0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
2f2b0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
2f2c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2f2d0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2f2e0 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e  tes(pNC, pItem->
2f2f0 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2f300 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
2f310 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77  ate a single new
2f320 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75 73   register for us
2f330 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69  e to hold some i
2f340 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
2f350 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  lt..*/.int sqlit
2f360 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72  e3GetTempReg(Par
2f370 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
2f380 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
2f390 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Reg==0 ){.    re
2f3a0 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  turn ++pParse->n
2f3b0 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Mem;.  }.  retur
2f3c0 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  n pParse->aTempR
2f3d0 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65  eg[--pParse->nTe
2f3e0 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mpReg];.}../*.**
2f3f0 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65   Deallocate a re
2f400 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61  gister, making a
2f410 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75  vailable for reu
2f420 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  se for some othe
2f430 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2f  r.** purpose..*/
2f440 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
2f450 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73  easeTempReg(Pars
2f460 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
2f470 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67  Reg){.  if( iReg
2f480 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d   && pParse->nTem
2f490 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
2f4a0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
2f4b0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
2f4c0 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
2f4d0 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69  >nTempReg++] = i
2f4e0 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
2f4f0 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65  * Allocate or de
2f500 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b  allocate a block
2f510 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75   of nReg consecu
2f520 74 69 76 65 20 72 65 67 69 73 74 65 72 73 2e 0a  tive registers..
2f530 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
2f540 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  tTempRange(Parse
2f550 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52   *pParse, int nR
2f560 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  eg){.  int i, n;
2f570 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29  .  if( nReg==1 )
2f580 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47   return sqlite3G
2f590 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2f5a0 29 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d  );.  i = pParse-
2f5b0 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20  >iRangeReg;.  n 
2f5c0 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  = pParse->nRange
2f5d0 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c  Reg;.  if( nReg<
2f5e0 3d 6e 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  =n ){.    pParse
2f5f0 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e  ->iRangeReg += n
2f600 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
2f610 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52  >nRangeReg -= nR
2f620 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eg;.  }else{.   
2f630 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65   i = pParse->nMe
2f640 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
2f650 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20  >nMem += nReg;. 
2f660 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
2f670 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
2f680 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61  easeTempRange(Pa
2f690 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2f6a0 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
2f6b0 7b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20  {.  if( nReg==1 
2f6c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
2f6d0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
2f6e0 72 73 65 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  rse, iReg);.    
2f6f0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
2f700 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e  ( nReg>pParse->n
2f710 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20  RangeReg ){.    
2f720 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2f730 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50  g = nReg;.    pP
2f740 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
2f750 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
2f760 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65  *.** Mark all te
2f770 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
2f780 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61  s as being unava
2f790 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65  ilable for reuse
2f7a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2f7b0 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2f7c0 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
2f7d0 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65  ){.  pParse->nTe
2f7e0 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61  mpReg = 0;.  pPa
2f7f0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2f800 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c   0;.}../*.** Val
2f810 69 64 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65  idate that no te
2f820 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
2f830 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68   falls within th
2f840 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46  e range of.** iF
2f850 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63  irst..iLast, inc
2f860 6c 75 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f  lusive.  This ro
2f870 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
2f880 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  ll from within a
2f890 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
2f8a0 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  ments..*/.#ifdef
2f8b0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
2f8c0 74 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73  t sqlite3NoTemps
2f8d0 49 6e 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  InRange(Parse *p
2f8e0 50 61 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73  Parse, int iFirs
2f8f0 74 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20  t, int iLast){. 
2f900 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50   int i;.  if( pP
2f910 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e  arse->nRangeReg>
2f920 30 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e  0.   && pParse->
2f930 69 52 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65  iRangeReg+pParse
2f940 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3e 20 69 46  ->nRangeReg > iF
2f950 69 72 73 74 0a 20 20 20 26 26 20 70 50 61 72 73  irst.   && pPars
2f960 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3c 3d 20  e->iRangeReg <= 
2f970 69 4c 61 73 74 0a 20 20 29 7b 0a 20 20 20 20 20  iLast.  ){.     
2f980 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2f990 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
2f9a0 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b  e->nTempReg; i++
2f9b0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
2f9c0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d  e->aTempReg[i]>=
2f9d0 69 46 69 72 73 74 20 26 26 20 70 50 61 72 73 65  iFirst && pParse
2f9e0 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69  ->aTempReg[i]<=i
2f9f0 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
2fa00 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
2fa10 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
2fa20 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2fa30 5f 44 45 42 55 47 20 2a 2f 0a                    _DEBUG */.