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

Artifact 9aea9dbac1169c5cda3ee5d288b9e6c25de597a38023f8104406e0312145ca8d:


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 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  xpr->pTab ){.   
07f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0800: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0810: 74 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  ty(pExpr->pTab, 
0820: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
0830: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0840: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
0850: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0860: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
0870: 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20  gs&EP_xIsSelect 
0880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
0890: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08a0: 79 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  y(.        pExpr
08b0: 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65  ->pLeft->x.pSele
08c0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  ct->pEList->a[pE
08d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
08e0: 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  xpr.    );.  }. 
08f0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61   return pExpr->a
0900: 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  ffinity;.}../*.*
0910: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
0920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
0930: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0940: 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c  r to be the coll
0950: 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
0960: 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65  e named by pToke
0970: 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f  n.   Return a po
0980: 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45  inter to a new E
0990: 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a  xpr node that.**
09a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
09b0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
09c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
09d0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
09e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61  rror occurs, tha
09f0: 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64  t fact is record
0a00: 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62  ed in pParse->db
0a10: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70  .** and the pExp
0a20: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72  r parameter is r
0a30: 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65  eturned unchange
0a40: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
0a50: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0a60: 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20  eToken(.  Parse 
0a70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0a80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0a90: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
0aa0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
0ab0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22      /* Add the "
0ac0: 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20  COLLATE" clause 
0ad0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
0ae0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  on */.  const To
0af0: 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20  ken *pCollName, 
0b00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
0b10: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
0b20: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0b40: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
0b50: 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  pCollName */.){.
0b60: 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d    if( pCollName-
0b70: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  >n>0 ){.    Expr
0b80: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
0b90: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
0ba0: 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45  ->db, TK_COLLATE
0bb0: 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71  , pCollName, deq
0bc0: 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  uote);.    if( p
0bd0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
0be0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72  w->pLeft = pExpr
0bf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
0c00: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
0c10: 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  e|EP_Skip;.     
0c20: 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
0c30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0c40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20  n pExpr;.}.Expr 
0c50: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0c60: 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72  ollateString(Par
0c70: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0c80: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
0c90: 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65  har *zC){.  Toke
0ca0: 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  n s;.  assert( z
0cb0: 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  C!=0 );.  sqlite
0cc0: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28  3TokenInit(&s, (
0cd0: 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74  char*)zC);.  ret
0ce0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0cf0: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
0d00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73  Parse, pExpr, &s
0d10: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  , 0);.}../*.** S
0d20: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0d30: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0d40: 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65  s and any unlike
0d50: 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c  ly().** or likel
0d60: 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e  ihood() function
0d70: 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   at the root of 
0d80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
0d90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
0da0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45  xprSkipCollate(E
0db0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77  xpr *pExpr){.  w
0dc0: 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45  hile( pExpr && E
0dd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0de0: 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29  Expr, EP_Skip) )
0df0: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
0e00: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0e10: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
0e20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
0e30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0e40: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
0e50: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ect) );.      as
0e60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70  sert( pExpr->x.p
0e70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
0e80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0e90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
0ea0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  CTION );.      p
0eb0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Expr = pExpr->x.
0ec0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
0ed0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
0ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0ef0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
0f00: 45 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  E );.      pExpr
0f10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0f30: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0f50: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0f60: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0f70: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0f80: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0f90: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0fa0: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0fb0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0fc0: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
0fd0: 71 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20  quence might be 
0fe0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20  determined by a 
0ff0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
1000: 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72  .** or by the pr
1010: 65 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75  esence of a colu
1020: 6d 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65  mn with a define
1030: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
1040: 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45  ence..** COLLATE
1050: 20 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20   operators take 
1060: 66 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65  first precedence
1070: 2e 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73  .  Left operands
1080: 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65   take.** precede
1090: 6e 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f  nce over right o
10a0: 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c  perands..*/.Coll
10b0: 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72  Seq *sqlite3Expr
10c0: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
10d0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
10e0: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
10f0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1100: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1110: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
1120: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
1130: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
1140: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
1150: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
1160: 50 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61  P_Generic ) brea
1170: 6b 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  k;.    if( op==T
1180: 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b  K_CAST || op==TK
1190: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
11a0: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
11b0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
11c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
11d0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f  TK_COLLATE || (o
11e0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
11f0: 26 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c  & p->op2==TK_COL
1200: 4c 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70  LATE) ){.      p
1210: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
1220: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
1230: 20 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e   ENC(db), 0, p->
1240: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1250: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1260: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
1270: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
1280: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
1290: 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45      || op==TK_RE
12a0: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
12b0: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26  _TRIGGER).     &
12c0: 26 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20  & p->pTab!=0.   
12d0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d   ){.      /* op=
12e0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
12f0: 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  p->pTab!=0 happe
1300: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
1310: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
1320: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
1330: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1340: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1350: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1360: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1370: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1380: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1390: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
13a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
13b0: 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c   = p->pTab->aCol
13c0: 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
13d0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
13e0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
13f0: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
1400: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1410: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1420: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
1430: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
1440: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1450: 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66  Left && (p->pLef
1460: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
1470: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
1480: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66       p = p->pLef
1490: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
14a0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
14b0: 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74  ext  = p->pRight
14c0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
14d0: 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73   Expr.x union is
14e0: 20 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74   never used at t
14f0: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
1500: 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20  Expr.pRight */. 
1510: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1520: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
1530: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
1540: 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c          /* p->fl
1550: 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c  ags holds EP_Col
1560: 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66  late and p->pLef
1570: 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f  t->flags does no
1580: 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20  t.  And.        
1590: 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20  ** p->x.pSelect 
15a0: 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70  cannot.  So if p
15b0: 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73  ->x.pLeft exists
15c0: 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61  , it must hold a
15d0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61  t.        ** lea
15e0: 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74  st one EP_Collat
15f0: 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c  e. Thus the foll
1600: 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53  owing two ALWAYS
1610: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
1620: 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26   p->x.pList!=0 &
1630: 26 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61  & ALWAYS(!ExprHa
1640: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
1650: 78 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20  xIsSelect)) ){. 
1660: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
1670: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1680: 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78  0; ALWAYS(i<p->x
1690: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20  .pList->nExpr); 
16a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
16b0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
16c0: 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74  perty(p->x.pList
16d0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  ->a[i].pExpr, EP
16e0: 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20  _Collate) ){.   
16f0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74             pNext
1700: 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61   = p->x.pList->a
1710: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
1720: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1730: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1740: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1750: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20    }.        p = 
1760: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1770: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1780: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1790: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
17a0: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
17b0: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
17c0: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
17d0: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
17e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
17f0: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
1800: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1810: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
1820: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1830: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
1840: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
1850: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1860: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
1870: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1880: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
1890: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
18a0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
18b0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
18c0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
18d0: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
18e0: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
18f0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1900: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
1910: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
1920: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
1930: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
1940: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
1950: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
1960: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
1970: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
1980: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
1990: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
19a0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
19b0: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
19c0: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
19d0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
19e0: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
19f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a00: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
1a10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1a20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1a30: 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BLOB;.    }.  }
1a40: 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26  else if( !aff1 &
1a50: 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  & !aff2 ){.    /
1a60: 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f  * Neither side o
1a70: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
1a80: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43   is a column.  C
1a90: 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a  ompare the.    *
1aa0: 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74  * results direct
1ab0: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ly..    */.    r
1ac0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1ad0: 5f 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BLOB;.  }else{.
1ae0: 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20      /* One side 
1af0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
1b00: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55   other is not. U
1b10: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  se the columns a
1b20: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
1b30: 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20  assert( aff1==0 
1b40: 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20  || aff2==0 );.  
1b50: 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b    return (aff1 +
1b60: 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aff2);.  }.}../
1b70: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
1b80: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1b90: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tor.  Return the
1ba0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1bb0: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
1bc0: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
1bd0: 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20   operands prior 
1be0: 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  to doing the com
1bf0: 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
1c00: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
1c10: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
1c20: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
1c30: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
1c40: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
1c50: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1c60: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
1c70: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
1c80: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
1c90: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
1ca0: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
1cb0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
1cc0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
1cd0: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70  ->op==TK_NE || p
1ce0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1cf0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1d00: 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65  _ISNOT );.  asse
1d10: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
1d20: 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69   );.  aff = sqli
1d30: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1d40: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1d50: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
1d60: 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ht ){.    aff = 
1d70: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1d80: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52  finity(pExpr->pR
1d90: 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65  ight, aff);.  }e
1da0: 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50  lse if( ExprHasP
1db0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1dc0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1dd0: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1de0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1df0: 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63  (pExpr->x.pSelec
1e00: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t->pEList->a[0].
1e10: 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d  pExpr, aff);.  }
1e20: 65 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20  else if( aff==0 
1e30: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c  ){.    aff = SQL
1e40: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
1e50: 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  }.  return aff;.
1e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1e70: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65  s a comparison e
1e80: 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27  xpression, eg. '
1e90: 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29  =', '<', IN(...)
1ea0: 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66   etc..** idx_aff
1eb0: 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66  inity is the aff
1ec0: 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65  inity of an inde
1ed0: 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75  xed column. Retu
1ee0: 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68  rn true.** if th
1ef0: 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66  e index with aff
1f00: 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69  inity idx_affini
1f10: 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74  ty may be used t
1f20: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74  o implement.** t
1f30: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  he comparison in
1f40: 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pExpr..*/.int s
1f50: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
1f60: 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70  ityOk(Expr *pExp
1f70: 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69  r, char idx_affi
1f80: 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66  nity){.  char af
1f90: 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  f = comparisonAf
1fa0: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20  finity(pExpr);. 
1fb0: 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a   switch( aff ){.
1fc0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1fd0: 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20  AFF_BLOB:.      
1fe0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61  return 1;.    ca
1ff0: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  se SQLITE_AFF_TE
2000: 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  XT:.      return
2010: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53   idx_affinity==S
2020: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
2030: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
2040: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2050: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
2060: 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29  ty(idx_affinity)
2070: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
2080: 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c  eturn the P5 val
2090: 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ue that should b
20a0: 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e  e used for a bin
20b0: 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a  ary comparison.*
20c0: 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c  * opcode (OP_Eq,
20d0: 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65   OP_Ge etc.) use
20e0: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78  d to compare pEx
20f0: 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a  pr1 and pExpr2..
2100: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e  */.static u8 bin
2110: 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70  aryCompareP5(Exp
2120: 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20  r *pExpr1, Expr 
2130: 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d  *pExpr2, int jum
2140: 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61  pIfNull){.  u8 a
2150: 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74  ff = (char)sqlit
2160: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2170: 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20  Expr2);.  aff = 
2180: 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61  (u8)sqlite3Compa
2190: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
21a0: 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75  1, aff) | (u8)ju
21b0: 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75  mpIfNull;.  retu
21c0: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
21d0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
21e0: 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69  r to the collati
21f0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74  on sequence that
2200: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
2210: 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63  by.** a binary c
2220: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
2230: 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65  or comparing pLe
2240: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
2250: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74  *.** If the left
2260: 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e   hand expression
2270: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
2280: 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20   sequence type, 
2290: 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73  then it is.** us
22a0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  ed. Otherwise th
22b0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
22c0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67  ence for the rig
22d0: 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ht hand expressi
22e0: 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f  on.** is used, o
22f0: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42  r the default (B
2300: 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65  INARY) if neithe
2310: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  r expression has
2320: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20   a collating.** 
2330: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  type..**.** Argu
2340: 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74  ment pRight (but
2350: 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20   not pLeft) may 
2360: 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  be a null pointe
2370: 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  r. In this case,
2380: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f  .** it is not co
2390: 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c  nsidered..*/.Col
23a0: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e  lSeq *sqlite3Bin
23b0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
23c0: 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  q(.  Parse *pPar
23d0: 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65  se, .  Expr *pLe
23e0: 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69  ft, .  Expr *pRi
23f0: 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ght.){.  CollSeq
2400: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72   *pColl;.  asser
2410: 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66  t( pLeft );.  if
2420: 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ( pLeft->flags &
2430: 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
2440: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2450: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2460: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
2470: 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74  }else if( pRight
2480: 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61   && (pRight->fla
2490: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
24a0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  !=0 ){.    pColl
24b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24c0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52  llSeq(pParse, pR
24d0: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
24e0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
24f0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2500: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
2510: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
2520: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
2530: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2540: 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  q(pParse, pRight
2550: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2560: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
2570: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
2580: 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72  ode for a compar
2590: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ison operator..*
25a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
25b0: 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  eCompare(.  Pars
25c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
25d0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e   The parsing (an
25e0: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
25f0: 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  g) context */.  
2600: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
2610: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
2620: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
2630: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20  *pRight,     /* 
2640: 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  The right operan
2650: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64  d */.  int opcod
2660: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
2670: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64  comparison opcod
2680: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20  e */.  int in1, 
2690: 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69  int in2, /* Regi
26a0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65  ster holding ope
26b0: 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64  rands */.  int d
26c0: 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
26d0: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75  Jump here if tru
26e0: 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  e.  */.  int jum
26f0: 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66  pIfNull    /* If
2700: 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65   true, jump if e
2710: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
2720: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   NULL */.){.  in
2730: 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72  t p5;.  int addr
2740: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b  ;.  CollSeq *p4;
2750: 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33  ..  p4 = sqlite3
2760: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
2770: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
2780: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70  ft, pRight);.  p
2790: 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  5 = binaryCompar
27a0: 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68  eP5(pLeft, pRigh
27b0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
27c0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
27d0: 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73  VdbeAddOp4(pPars
27e0: 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65  e->pVdbe, opcode
27f0: 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31  , in2, dest, in1
2800: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
2820: 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53  id*)p4, P4_COLLS
2830: 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EQ);.  sqlite3Vd
2840: 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73  beChangeP5(pPars
2850: 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35  e->pVdbe, (u8)p5
2860: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
2870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2880: 6e 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73  n true if expres
2890: 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20  sion pExpr is a 
28a0: 76 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65  vector, or false
28b0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
28c0: 2a 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65  * A vector is de
28d0: 66 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70  fined as any exp
28e0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73  ression that res
28f0: 75 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d  ults in two or m
2900: 6f 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f  ore.** columns o
2910: 66 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79  f result.  Every
2920: 20 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20   TK_VECTOR node 
2930: 69 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63  is an vector bec
2940: 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73  ause the.** pars
2950: 65 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65  er will not gene
2960: 72 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52  rate a TK_VECTOR
2970: 20 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e   with fewer than
2980: 20 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a   two entries..**
2990: 20 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54   But a TK_SELECT
29a0: 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72   might be either
29b0: 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73   a vector or a s
29c0: 63 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c  calar. It is onl
29d0: 79 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20  y.** considered 
29e0: 61 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68  a vector if it h
29f0: 61 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72  as two or more r
2a00: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  esult columns..*
2a10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2a20: 72 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a  rIsVector(Expr *
2a30: 70 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e  pExpr){.  return
2a40: 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
2a50: 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b  orSize(pExpr)>1;
2a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
2a70: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
2a80: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
2a90: 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79  rgument is of ty
2aa0: 70 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a  pe TK_VECTOR .**
2ab0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
2ac0: 65 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  er of expression
2ad0: 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e  s in the vector.
2ae0: 20 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72   Or, if the expr
2af0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73  ession.** is a s
2b00: 75 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72  ub-select, retur
2b10: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2b20: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73  columns in the s
2b30: 75 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a  ub-select. For.*
2b40: 2a 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65  * any other type
2b50: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   of expression, 
2b60: 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74  return 1..*/.int
2b70: 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
2b80: 6f 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78  orSize(Expr *pEx
2b90: 70 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70  pr){.  u8 op = p
2ba0: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
2bb0: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
2bc0: 29 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70  ) op = pExpr->op
2bd0: 32 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  2;.  if( op==TK_
2be0: 56 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65  VECTOR ){.    re
2bf0: 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c  turn pExpr->x.pL
2c00: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65  ist->nExpr;.  }e
2c10: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53  lse if( op==TK_S
2c20: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74  ELECT ){.    ret
2c30: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  urn pExpr->x.pSe
2c40: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
2c50: 78 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  xpr;.  }else{.  
2c60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2c70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2c80: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
2c90: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  ubexpression of 
2ca0: 70 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20  pVector that is 
2cb0: 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75  the i-th.** colu
2cc0: 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  mn of the vector
2cd0: 20 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74   (numbered start
2ce0: 69 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68  ing with 0).  Th
2cf0: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a  e caller must.**
2d00: 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69   ensure that i i
2d10: 73 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a  s within range..
2d20: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
2d30: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61   is really a sca
2d40: 6c 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72  lar (and "scalar
2d50: 22 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20  " here includes 
2d60: 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68  subqueries.** th
2d70: 61 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  at return a sing
2d80: 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e  le column!) then
2d90: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20   return pVector 
2da0: 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  unmodified..**.*
2db0: 2a 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e  * pVector retain
2dc0: 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  s ownership of t
2dd0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65  he returned sube
2de0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
2df0: 20 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69   If the vector i
2e00: 73 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  s a (SELECT ...)
2e10: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
2e20: 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73  sion returned is
2e30: 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70  .** just the exp
2e40: 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20  ression for the 
2e50: 69 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65  i-th term of the
2e60: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64   result set, and
2e70: 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72   may.** not be r
2e80: 65 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74  eady for evaluat
2e90: 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ion because the 
2ea0: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73  table cursor has
2eb0: 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e   not yet.** been
2ec0: 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a   positioned..*/.
2ed0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63  Expr *sqlite3Vec
2ee0: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
2ef0: 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69  Expr *pVector, i
2f00: 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28  nt i){.  assert(
2f10: 20 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65   i<sqlite3ExprVe
2f20: 63 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72  ctorSize(pVector
2f30: 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ) );.  if( sqlit
2f40: 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
2f50: 56 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61  Vector) ){.    a
2f60: 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e  ssert( pVector->
2f70: 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f  op2==0 || pVecto
2f80: 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
2f90: 45 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56  ER );.    if( pV
2fa0: 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  ector->op==TK_SE
2fb0: 4c 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d  LECT || pVector-
2fc0: 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  >op2==TK_SELECT 
2fd0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2fe0: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65  pVector->x.pSele
2ff0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ct->pEList->a[i]
3000: 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73  .pExpr;.    }els
3010: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
3020: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
3030: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
3040: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3050: 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   pVector;.}../*.
3060: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  ** Compute and r
3070: 65 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72  eturn a new Expr
3080: 20 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77 68   object which wh
3090: 65 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20  en passed to.** 
30a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
30b0: 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  ) will generate 
30c0: 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f  all necessary co
30d0: 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a  de to compute.**
30e0: 20 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63   the iField-th c
30f0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
3100: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70  tor expression p
3110: 56 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74  Vector..**.** It
3120: 20 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74   is ok for pVect
3130: 6f 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61  or to be a scala
3140: 72 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46  r (as long as iF
3150: 69 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49  ield==0).  .** I
3160: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69  n that case, thi
3170: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
3180: 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  like sqlite3Expr
3190: 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Dup()..**.** The
31a0: 20 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65   caller owns the
31b0: 20 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f   returned Expr o
31c0: 62 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65 73  bject and is res
31d0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20  ponsible for.** 
31e0: 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
31f0: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
3200: 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73   eventually gets
3210: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   freed..**.** Th
3220: 65 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73  e caller retains
3230: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56   ownership of pV
3240: 65 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74  ector.  If pVect
3250: 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43  or is a TK_SELEC
3260: 54 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  T,.** then the r
3270: 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77  eturned object w
3280: 69 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56  ill reference pV
3290: 65 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65  ector and so pVe
32a0: 63 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e  ctor must remain
32b0: 0a 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68  .** valid for th
32c0: 65 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65  e life of the re
32d0: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20  turned object.  
32e0: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
32f0: 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20  TK_VECTOR.** or 
3300: 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  a scalar express
3310: 69 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e  ion, then it can
3320: 20 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73   be deleted as s
3330: 6f 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74  oon as this rout
3340: 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a  ine.** returns..
3350: 2a 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f  **.** A trick to
3360: 20 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45   cause a TK_SELE
3370: 43 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65  CT pVector to be
3380: 20 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65   deleted togethe
3390: 72 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65  r with.** the re
33a0: 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65  turned Expr obje
33b0: 63 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20  ct is to attach 
33c0: 74 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74  the pVector to t
33d0: 68 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a  he pRight field.
33e0: 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  ** of the return
33f0: 65 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  ed TK_SELECT_COL
3400: 55 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e  UMN Expr object.
3410: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
3420: 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69  3ExprForVectorFi
3430: 65 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  eld(.  Parse *pP
3440: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
3450: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
3460: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
3470: 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r,       /* The 
3480: 76 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66  vector.  List of
3490: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20   expressions or 
34a0: 61 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a  a sub-SELECT */.
34b0: 20 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20    int iField    
34c0: 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
34d0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65  column of the ve
34e0: 63 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a  ctor to return *
34f0: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65  /.){.  Expr *pRe
3500: 74 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72  t;.  if( pVector
3510: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3520: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3530: 56 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20  Vector->flags & 
3540: 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a  EP_xIsSelect );.
3550: 20 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45      /* The TK_SE
3560: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72  LECT_COLUMN Expr
3570: 20 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20   node:.    **.  
3580: 20 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20    ** pLeft:     
3590: 20 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f        pVector co
35a0: 6e 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45  ntaining TK_SELE
35b0: 43 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64  CT.  Not deleted
35c0: 2e 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a  ..    ** pRight:
35d0: 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73            not us
35e0: 65 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69  ed.  But recursi
35f0: 76 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20  vely deleted..  
3600: 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20    ** iColumn:   
3610: 20 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61        Index of a
3620: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74   column in pVect
3630: 6f 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65  or.    ** iTable
3640: 3a 20 20 20 20 20 20 20 20 20 20 30 20 6f 72 20  :          0 or 
3650: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
3660: 6c 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53  lumns on the LHS
3670: 20 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e   of an assignmen
3680: 74 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e  t.    ** pLeft->
3690: 69 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20  iTable:   First 
36a0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
36b0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
36c0: 72 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20  result, or 0.   
36d0: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
36e0: 20 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75       if the resu
36f0: 6c 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f  lt is not yet co
3700: 6d 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  mputed..    **. 
3710: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70     ** sqlite3Exp
3720: 72 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66  rDelete() specif
3730: 69 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65  ically skips the
3740: 20 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74   recursive delet
3750: 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66  e of.    ** pLef
3760: 74 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43  t on TK_SELECT_C
3770: 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75  OLUMN nodes.  Bu
3780: 74 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c  t pRight is foll
3790: 6f 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72  owed, so pVector
37a0: 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61  .    ** can be a
37b0: 74 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68  ttached to pRigh
37c0: 74 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20  t to cause this 
37d0: 6e 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e  node to take own
37e0: 65 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a  ership of.    **
37f0: 20 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63   pVector.  Typic
3800: 61 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20  ally there will 
3810: 62 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53  be multiple TK_S
3820: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  ELECT_COLUMN nod
3830: 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  es.    ** with t
3840: 68 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f  he same pLeft po
3850: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65  inter to the pVe
3860: 63 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f  ctor, but only o
3870: 6e 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a  ne of them.    *
3880: 2a 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70  * will own the p
3890: 56 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  Vector..    */. 
38a0: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
38b0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
38c0: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c  K_SELECT_COLUMN,
38d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
38e0: 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52  pRet ){.      pR
38f0: 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46  et->iColumn = iF
3900: 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74  ield;.      pRet
3910: 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f  ->pLeft = pVecto
3920: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
3930: 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20  ert( pRet==0 || 
3940: 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  pRet->iTable==0 
3950: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3960: 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d  if( pVector->op=
3970: 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65  =TK_VECTOR ) pVe
3980: 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e  ctor = pVector->
3990: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c  x.pList->a[iFiel
39a0: 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52  d].pExpr;.    pR
39b0: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
39c0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
39d0: 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d  pVector, 0);.  }
39e0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
39f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72  }../*.** If expr
3a00: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
3a10: 6f 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43  of type TK_SELEC
3a20: 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  T, generate code
3a30: 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
3a40: 69 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72  it. Return the r
3a50: 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68  egister in which
3a60: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
3a70: 74 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68  tored (or, if th
3a80: 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74  e .** sub-select
3a90: 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68   returns more th
3aa0: 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74  an one column, t
3ab0: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
3ac0: 72 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73  rray.** of regis
3ad0: 74 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68  ters in which th
3ae0: 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
3af0: 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ed)..**.** If pE
3b00: 78 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f  xpr is not a TK_
3b10: 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f  SELECT expressio
3b20: 6e 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  n, return 0..*/.
3b30: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43  static int exprC
3b40: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72  odeSubselect(Par
3b50: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
3b60: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
3b70: 72 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  reg = 0;.#ifndef
3b80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
3b90: 51 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70  QUERY.  if( pExp
3ba0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
3bb0: 20 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71   ){.    reg = sq
3bc0: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
3bd0: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
3be0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
3bf0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67  dif.  return reg
3c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
3c10: 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e  ent pVector poin
3c20: 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65  ts to a vector e
3c30: 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68  xpression - eith
3c40: 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a  er a TK_VECTOR.*
3c50: 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74  * or TK_SELECT t
3c60: 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65  hat returns more
3c70: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
3c80: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
3c90: 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72  returns.** the r
3ca0: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f  egister number o
3cb0: 66 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  f a register tha
3cc0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
3cd0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65  alue of.** eleme
3ce0: 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65  nt iField of the
3cf0: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   vector..**.** I
3d00: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
3d10: 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73  K_SELECT express
3d20: 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66  ion, then code f
3d30: 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20  or it must have 
3d40: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3d50: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
3d60: 20 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62   the exprCodeSub
3d70: 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65  select() routine
3d80: 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
3d90: 65 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53  e parameter regS
3da0: 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20  elect should be 
3db0: 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
3dc0: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
3dd0: 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  rs.** containing
3de0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
3df0: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  the sub-select. 
3e00: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f  .**.** If pVecto
3e10: 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f  r is of type TK_
3e20: 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64  VECTOR, then cod
3e30: 65 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73  e for the reques
3e40: 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20  ted field.** is 
3e50: 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68  generated. In th
3e60: 69 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72  is case (*pRegFr
3e70: 65 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74  ee) may be set t
3e80: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
3e90: 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  ** a temporary r
3ea0: 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72  egister to be fr
3eb0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
3ec0: 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
3ed0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ng..**.** Before
3ee0: 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70   returning, outp
3ef0: 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  ut parameter (*p
3f00: 70 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f  pExpr) is set to
3f10: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
3f20: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72   Expr object cor
3f30: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c  responding to el
3f40: 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74  ement iElem of t
3f50: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74  he vector..*/.st
3f60: 61 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63  atic int exprVec
3f70: 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50  torRegister(.  P
3f80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3fa0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
3fb0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74  */.  Expr *pVect
3fc0: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
3fd0: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74       /* Vector t
3fe0: 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e  o extract elemen
3ff0: 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
4000: 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20  iField,         
4010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4020: 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20  ield to extract 
4030: 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a  from pVector */.
4040: 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c    int regSelect,
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
4070: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
4080: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
4090: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
40a0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78        /* OUT: Ex
40b0: 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74  pression element
40c0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46   */.  int *pRegF
40d0: 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
40e0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65        /* OUT: Te
40f0: 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
4100: 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f  ree */.){.  u8 o
4110: 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b  p = pVector->op;
4120: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
4130: 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d  K_VECTOR || op==
4140: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
4150: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
4160: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
4170: 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70  ISTER ){.    *pp
4180: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65  Expr = sqlite3Ve
4190: 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
41a0: 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64  (pVector, iField
41b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56  );.    return pV
41c0: 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46  ector->iTable+iF
41d0: 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ield;.  }.  if( 
41e0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
41f0: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70  .    *ppExpr = p
4200: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
4210: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69  t->pEList->a[iFi
4220: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
4230: 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63   return regSelec
4240: 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20  t+iField;.  }.  
4250: 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f  *ppExpr = pVecto
4260: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46  r->x.pList->a[iF
4270: 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72  ield].pExpr;.  r
4280: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
4290: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
42a0: 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46  , *ppExpr, pRegF
42b0: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ree);.}../*.** E
42c0: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
42d0: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
42e0: 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74  between two vect
42f0: 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75  or values. Compu
4300: 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  te.** the result
4310: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
4320: 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c  on (1, 0, or NUL
4330: 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  L) and write tha
4340: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f  t.** result into
4350: 20 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a   register dest..
4360: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4370: 20 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68   must satisfy th
4380: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63  e following prec
4390: 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  onditions:.**.**
43a0: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
43b0: 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70  ==TK_IS:      op
43c0: 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d  ==TK_EQ and p5==
43d0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
43e0: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
43f0: 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70  ==TK_ISNOT:   op
4400: 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d  ==TK_NE and p5==
4410: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
4420: 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20      otherwise:  
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
4440: 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  ==pExpr->op and 
4450: 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20  p5==0.*/.static 
4460: 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43  void codeVectorC
4470: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
4480: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
4490: 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f  /* Code generato
44a0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
44b0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
44c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
44d0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
44e0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
4500: 72 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74  rite results int
4510: 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
4520: 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20  */.  u8 op,     
4530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
4540: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
4550: 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  r */.  u8 p5    
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4570: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72  SQLITE_NULLEQ or
4580: 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64   zero */.){.  Vd
4590: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
45a0: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
45b0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
45c0: 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69  eft;.  Expr *pRi
45d0: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
45e0: 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74  ght;.  int nLeft
45f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
4600: 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
4610: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4620: 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69  regLeft = 0;.  i
4630: 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b  nt regRight = 0;
4640: 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a  .  u8 opx = op;.
4650: 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d    int addrDone =
4660: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4670: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28  Label(v);..  if(
4680: 20 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45   nLeft!=sqlite3E
4690: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52  xprVectorSize(pR
46a0: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  ight) ){.    sql
46b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
46c0: 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
46d0: 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72  misused");.    r
46e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
46f0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
4700: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
4710: 6f 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20  op==TK_NE .     
4720: 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    || pExpr->op==
4730: 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IS || pExpr->
4740: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20  op==TK_ISNOT .  
4750: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f       || pExpr->o
4760: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70  p==TK_LT || pExp
4770: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20  r->op==TK_GT .  
4780: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f       || pExpr->o
4790: 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70  p==TK_LE || pExp
47a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20  r->op==TK_GE .  
47b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
47c0: 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70  pr->op==op || (p
47d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
47e0: 26 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20  && op==TK_EQ).  
47f0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45            || (pE
4800: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4810: 54 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20  T && op==TK_NE) 
4820: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d  );.  assert( p5=
4830: 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21  =0 || pExpr->op!
4840: 3d 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =op );.  assert(
4850: 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c   p5==SQLITE_NULL
4860: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
4870: 3d 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20  =op );..  p5 |= 
4880: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a  SQLITE_STOREP2;.
4890: 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45    if( opx==TK_LE
48a0: 20 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a   ) opx = TK_LT;.
48b0: 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45    if( opx==TK_GE
48c0: 20 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a   ) opx = TK_GT;.
48d0: 0a 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70  .  regLeft = exp
48e0: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  rCodeSubselect(p
48f0: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
4900: 20 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72   regRight = expr
4910: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4920: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a  arse, pRight);..
4930: 20 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c    for(i=0; 1 /*L
4940: 6f 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72  oop exits by "br
4950: 65 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20  eak"*/; i++){.  
4960: 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
4970: 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30   0, regFree2 = 0
4980: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20  ;.    Expr *pL, 
4990: 2a 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31  *pR; .    int r1
49a0: 2c 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74  , r2;.    assert
49b0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66  ( i>=0 && i<nLef
49c0: 74 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30  t );.    if( i>0
49d0: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61   ) sqlite3ExprCa
49e0: 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
49f0: 0a 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65  .    r1 = exprVe
4a00: 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61  ctorRegister(pPa
4a10: 72 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72  rse, pLeft, i, r
4a20: 65 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65  egLeft, &pL, &re
4a30: 67 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20  gFree1);.    r2 
4a40: 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  = exprVectorRegi
4a50: 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69  ster(pParse, pRi
4a60: 67 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74  ght, i, regRight
4a70: 2c 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32  , &pR, &regFree2
4a80: 29 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  );.    codeCompa
4a90: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70  re(pParse, pL, p
4aa0: 52 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20  R, opx, r1, r2, 
4ab0: 64 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74  dest, p5);.    t
4ac0: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
4ad0: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
4ae0: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
4af0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70  .    testcase(op
4b00: 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
4b10: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4b20: 50 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63  P_Le);.    testc
4b30: 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
4b40: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4b50: 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
4b60: 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
4b70: 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
4b80: 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
4b90: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4ba0: 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65  op==OP_Eq); Vdbe
4bb0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4bc0: 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73  =OP_Eq);.    tes
4bd0: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
4be0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4bf0: 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
4c00: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
4c10: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
4c20: 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20   regFree1);.    
4c30: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
4c40: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
4c50: 67 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28  gFree2);.    if(
4c60: 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78   i>0 ) sqlite3Ex
4c70: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
4c80: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  e);.    if( i==n
4c90: 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20  Left-1 ){.      
4ca0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4cb0: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20   if( opx==TK_EQ 
4cc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4cd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4ce0: 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64  _IfNot, dest, ad
4cf0: 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76  drDone); VdbeCov
4d00: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
4d10: 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45  p5 |= SQLITE_KEE
4d20: 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  PNULL;.    }else
4d30: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20   if( opx==TK_NE 
4d40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4d50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4d60: 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44  _If, dest, addrD
4d70: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
4d80: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20  ge(v);.      p5 
4d90: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
4da0: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
4db0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d       assert( op=
4dc0: 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b  =TK_LT || op==TK
4dd0: 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45  _GT || op==TK_LE
4de0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b   || op==TK_GE );
4df0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4e00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45  beAddOp2(v, OP_E
4e10: 6c 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64  lseNotEq, 0, add
4e20: 72 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  rDone);.      Vd
4e30: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
4e40: 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20  op==TK_LT);.    
4e50: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
4e60: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a  (v, op==TK_GT);.
4e70: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
4e80: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
4e90: 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  E);.      VdbeCo
4ea0: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
4eb0: 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66  TK_GE);.      if
4ec0: 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f  ( i==nLeft-2 ) o
4ed0: 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20  px = op;.    }. 
4ee0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
4ef0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
4f00: 61 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69  addrDone);.}..#i
4f10: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
4f20: 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20  R_DEPTH>0./*.** 
4f30: 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d  Check that argum
4f40: 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c  ent nHeight is l
4f50: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
4f60: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
4f70: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
4f80: 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66  epth allowed. If
4f90: 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76   it is not, leav
4fa0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
4fb0: 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e  ge in.** pParse.
4fc0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
4fd0: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50  xprCheckHeight(P
4fe0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
4ff0: 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e  t nHeight){.  in
5000: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5010: 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74  ;.  int mxHeight
5020: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
5030: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5040: 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a  IT_EXPR_DEPTH];.
5050: 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78    if( nHeight>mx
5060: 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  Height ){.    sq
5070: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5080: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45  arse, .       "E
5090: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69  xpression tree i
50a0: 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78  s too large (max
50b0: 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c  imum depth %d)",
50c0: 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b   mxHeight.    );
50d0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
50e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
50f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
5100: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
5110: 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65  ee functions, he
5120: 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65  ightOfExpr(), he
5130: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29  ightOfExprList()
5140: 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66  .** and heightOf
5150: 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73  Select(), are us
5160: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
5170: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5180: 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70  ht.** of any exp
5190: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
51a0: 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73  erenced by the s
51b0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
51c0: 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  as the.** first 
51d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
51e0: 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20  If this maximum 
51f0: 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65  height is greate
5200: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
5210: 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64  nt value pointed
5220: 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67  .** to by pnHeig
5230: 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70  ht, the second p
5240: 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73  arameter, then s
5250: 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20  et *pnHeight to 
5260: 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  that.** value..*
5270: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
5280: 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20  ightOfExpr(Expr 
5290: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
52a0: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
52b0: 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68     if( p->nHeigh
52c0: 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20  t>*pnHeight ){. 
52d0: 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d       *pnHeight =
52e0: 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20   p->nHeight;.   
52f0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
5300: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
5310: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
5320: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5330: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5340: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
5350: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
5360: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65  ; i++){.      he
5370: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b  ightOfExpr(p->a[
5380: 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67  i].pExpr, pnHeig
5390: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ht);.    }.  }.}
53a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
53b0: 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65  ghtOfSelect(Sele
53c0: 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  ct *p, int *pnHe
53d0: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
53e0: 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  {.    heightOfEx
53f0: 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e  pr(p->pWhere, pn
5400: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5410: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61  ghtOfExpr(p->pHa
5420: 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b  ving, pnHeight);
5430: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5440: 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48  r(p->pLimit, pnH
5450: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5460: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66  htOfExpr(p->pOff
5470: 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  set, pnHeight);.
5480: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5490: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
54a0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
54b0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
54c0: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48  p->pGroupBy, pnH
54d0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
54e0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
54f0: 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67  pOrderBy, pnHeig
5500: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5510: 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f  fSelect(p->pPrio
5520: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
5530: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
5540: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
5550: 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20  variable in the 
5560: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
5570: 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d   as an .** argum
5580: 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69  ent. An expressi
5590: 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64  on with no child
55a0: 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20  ren, Expr.pList 
55b0: 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c  or .** Expr.pSel
55c0: 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61  ect member has a
55d0: 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e   height of 1. An
55e0: 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  y other expressi
55f0: 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67  on.** has a heig
5600: 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  ht equal to the 
5610: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
5620: 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20  f any other .** 
5630: 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20  referenced Expr 
5640: 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  plus one..**.** 
5650: 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 45  Also propagate E
5660: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
5670: 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e 78  s up from Expr.x
5680: 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e 66  .pList to Expr.f
5690: 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72  lags,.** if appr
56a0: 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
56b0: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
56c0: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
56d0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
56e0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
56f0: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
5700: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
5710: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
5720: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
5730: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
5740: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
5750: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
5760: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
5770: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
5780: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
5790: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
57a0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
57b0: 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48  (p->x.pList, &nH
57c0: 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66  eight);.    p->f
57d0: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
57e0: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
57f0: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5800: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70  .pList);.  }.  p
5810: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69  ->nHeight = nHei
5820: 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ght + 1;.}../*.*
5830: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
5840: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
5850: 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53 65  using the exprSe
5860: 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74 69  tHeight() functi
5870: 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65  on. If.** the he
5880: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
5890: 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  than the maximum
58a0: 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73   allowed express
58b0: 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65  ion depth,.** le
58c0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
58d0: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  pParse..**.** Al
58e0: 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c 6c  so propagate all
58f0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c   EP_Propagate fl
5900: 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ags from the Exp
5910: 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a  r.x.pList into.*
5920: 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a  * Expr.flags. .*
5930: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
5940: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
5950: 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ags(Parse *pPars
5960: 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  e, Expr *p){.  i
5970: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
5980: 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70 72  ) return;.  expr
5990: 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20  SetHeight(p);.  
59a0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
59b0: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
59c0: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f  ->nHeight);.}../
59d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
59e0: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
59f0: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
5a00: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
5a10: 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63  .** by the selec
5a20: 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
5a30: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
5a40: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5a50: 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
5a60: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
5a70: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
5a80: 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  .  heightOfSelec
5a90: 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  t(p, &nHeight);.
5aa0: 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74    return nHeight
5ab0: 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f  ;.}.#else /* ABO
5ac0: 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66 6f  VE:  Height enfo
5ad0: 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e  rcement enabled.
5ae0: 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74 20    BELOW: Height 
5af0: 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20  enforcement off 
5b00: 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61  */./*.** Propaga
5b10: 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67  te all EP_Propag
5b20: 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74  ate flags from t
5b30: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
5b40: 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61  into.** Expr.fla
5b50: 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gs. .*/.void sql
5b60: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
5b70: 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20  tAndFlags(Parse 
5b80: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
5b90: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  ){.  if( p && p-
5ba0: 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78 70  >x.pList && !Exp
5bb0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5bc0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
5bd0: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d  .    p->flags |=
5be0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
5bf0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
5c00: 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29  lags(p->x.pList)
5c10: 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20  ;.  }.}.#define 
5c20: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29  exprSetHeight(y)
5c30: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5c40: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
5c50: 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  >0 */../*.** Thi
5c60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
5c70: 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20   core allocator 
5c80: 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a  for Expr nodes..
5c90: 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  **.** Construct 
5ca0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
5cb0: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
5cc0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
5cd0: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
5ce0: 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66   this node and f
5cf0: 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72  or the pToken ar
5d00: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67  gument is a sing
5d10: 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  le allocation.**
5d20: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
5d30: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
5d40: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
5d50: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
5d60: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
5d70: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
5d80: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
5d90: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
5da0: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72  If dequote is tr
5db0: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  ue, then the tok
5dc0: 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73  en (if it exists
5dd0: 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a  ) is dequoted..*
5de0: 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20  * If dequote is 
5df0: 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74  false, no dequot
5e00: 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ing is performed
5e10: 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a  .  The deQuote.*
5e20: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  * parameter is i
5e30: 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e  gnored if pToken
5e40: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
5e50: 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f  he token does no
5e60: 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62  t.** appear to b
5e70: 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68  e quoted.  If th
5e80: 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66  e quotes were of
5e90: 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20   the form "..." 
5ea0: 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a  (double-quotes).
5eb0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44  ** then the EP_D
5ec0: 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73  blQuoted flag is
5ed0: 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72   set on the expr
5ee0: 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a  ession node..**.
5ef0: 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  ** Special case:
5f00: 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45    If op==TK_INTE
5f10: 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70  GER and pToken p
5f20: 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e  oints to a strin
5f30: 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  g that.** can be
5f40: 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f   translated into
5f50: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
5f60: 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  r, then the toke
5f70: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72  n is not.** stor
5f80: 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20  ed in u.zToken. 
5f90: 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e   Instead, the in
5fa0: 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73 20  teger values is 
5fb0: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
5fc0: 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65  u.iValue and the
5fd0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
5fe0: 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78  g is set.  No ex
5ff0: 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69  tra storage.** i
6000: 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  s allocated to h
6010: 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 20  old the integer 
6020: 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65 71  text and the deq
6030: 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e  uote flag is ign
6040: 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ored..*/.Expr *s
6050: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
6060: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
6070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
6080: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
6090: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 29 20  DbMallocRawNN() 
60a0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60c0: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
60d0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  e */.  const Tok
60e0: 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f  en *pToken,    /
60f0: 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74  * Token argument
6100: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
6110: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
6120: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
6130: 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65   True to dequote
6140: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
6150: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72  New;.  int nExtr
6160: 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61  a = 0;.  int iVa
6170: 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  lue = 0;..  asse
6180: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
6190: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
61a0: 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45   if( op!=TK_INTE
61b0: 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a  GER || pToken->z
61c0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  ==0.          ||
61d0: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
61e0: 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61  (pToken->z, &iVa
61f0: 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lue)==0 ){.     
6200: 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e   nExtra = pToken
6210: 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  ->n+1;.      ass
6220: 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29  ert( iValue>=0 )
6230: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
6240: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
6250: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
6260: 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72  zeof(Expr)+nExtr
6270: 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  a);.  if( pNew )
6280: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  {.    memset(pNe
6290: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  w, 0, sizeof(Exp
62a0: 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  r));.    pNew->o
62b0: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20  p = (u8)op;.    
62c0: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
62d0: 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  .    if( pToken 
62e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  ){.      if( nEx
62f0: 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tra==0 ){.      
6300: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6310: 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
6320: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
6330: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
6340: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6350: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
6360: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  en = (char*)&pNe
6370: 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  w[1];.        as
6380: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21  sert( pToken->z!
6390: 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d  =0 || pToken->n=
63a0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
63b0: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65  ( pToken->n ) me
63c0: 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  mcpy(pNew->u.zTo
63d0: 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ken, pToken->z, 
63e0: 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20  pToken->n);.    
63f0: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
6400: 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20  en[pToken->n] = 
6410: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  0;.        if( d
6420: 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65  equote && sqlite
6430: 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Isquote(pNew->u
6440: 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20  .zToken[0]) ){. 
6450: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
6460: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  w->u.zToken[0]==
6470: 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67  '"' ) pNew->flag
6480: 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65  s |= EP_DblQuote
6490: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  d;.          sql
64a0: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
64b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
64c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
64d0: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
64e0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
64f0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67  .    pNew->nHeig
6500: 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20  ht = 1;.#endif  
6510: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
6520: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ew;.}../*.** All
6530: 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  ocate a new expr
6540: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d  ession node from
6550: 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
6560: 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61  ed token that ha
6570: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65  s.** already bee
6580: 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45  n dequoted..*/.E
6590: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
65a0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
65c0: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
65d0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
65e0: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
65f0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
6600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
6610: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
6620: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6630: 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20  *zToken      /* 
6640: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
6650: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
6660: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a  /.){.  Token x;.
6670: 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a    x.z = zToken;.
6680: 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f    x.n = zToken ?
6690: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
66a0: 28 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20  (zToken) : 0;.  
66b0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
66c0: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20  prAlloc(db, op, 
66d0: 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &x, 0);.}../*.**
66e0: 20 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73   Attach subtrees
66f0: 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
6700: 74 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f  t to the Expr no
6710: 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  de pRoot..**.** 
6720: 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74  If pRoot==NULL t
6730: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61  hat means that a
6740: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6750: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
6760: 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61  urred..** In tha
6770: 74 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74  t case, delete t
6780: 68 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66  he subtrees pLef
6790: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f  t and pRight..*/
67a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
67b0: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
67c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
67d0: 20 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20    Expr *pRoot,. 
67e0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20   Expr *pLeft,.  
67f0: 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a  Expr *pRight.){.
6800: 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29    if( pRoot==0 )
6810: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
6820: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6830: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6840: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
6850: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
6860: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
6870: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
6880: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29      if( pRight )
6890: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
68a0: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a  Right = pRight;.
68b0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61        pRoot->fla
68c0: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
68d0: 74 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61  te & pRight->fla
68e0: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  gs;.    }.    if
68f0: 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ( pLeft ){.     
6900: 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20   pRoot->pLeft = 
6910: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f  pLeft;.      pRo
6920: 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ot->flags |= EP_
6930: 50 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66  Propagate & pLef
6940: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
6950: 20 20 20 20 65 78 70 72 53 65 74 48 65 69 67 68      exprSetHeigh
6960: 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a  t(pRoot);.  }.}.
6970: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
6980: 61 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69  an Expr node whi
6990: 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79  ch joins as many
69a0: 20 61 73 20 74 77 6f 20 73 75 62 74 72 65 65 73   as two subtrees
69b0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62  ..**.** One or b
69c0: 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62 74 72  oth of the subtr
69d0: 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ees can be NULL.
69e0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
69f0: 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a  er to the new.**
6a00: 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c   Expr node.  Or,
6a10: 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   if an OOM error
6a20: 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50 61   occurs, set pPa
6a30: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
6a40: 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74  ailed,.** free t
6a50: 68 65 20 73 75 62 74 72 65 65 73 20 61 6e 64 20  he subtrees and 
6a60: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
6a70: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78  Expr *sqlite3PEx
6a80: 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  pr(.  Parse *pPa
6a90: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
6aa0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
6ab0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ad0: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
6ae0: 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  de */.  Expr *pL
6af0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
6b00: 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20  /* Left operand 
6b10: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
6b20: 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
6b30: 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  Right operand */
6b40: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20  .){.  Expr *p;. 
6b50: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20   if( op==TK_AND 
6b60: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
6b70: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b  =0 ){.    /* Tak
6b80: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73  e advantage of s
6b90: 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c  hort-circuit fal
6ba0: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
6bb0: 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70  for AND */.    p
6bc0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
6bd0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  d(pParse->db, pL
6be0: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
6bf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73  }else{.    p = s
6c00: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
6c10: 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  wNN(pParse->db, 
6c20: 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
6c30: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
6c40: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
6c50: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
6c60: 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f 70 20 26      p->op = op &
6c70: 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a 20 20 20   TKFLG_MASK;.   
6c80: 20 20 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b     p->iAgg = -1;
6c90: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6ca0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
6cb0: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
6cc0: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
6cd0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  t);.  }.  if( p 
6ce0: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ) {.    sqlite3E
6cf0: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
6d00: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
6d10: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
6d20: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   p;.}../*.** Add
6d30: 20 70 53 65 6c 65 63 74 20 74 6f 20 74 68 65 20   pSelect to the 
6d40: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 66  Expr.x.pSelect f
6d50: 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70 45  ield.  Or, if pE
6d60: 78 70 72 20 69 73 20 4e 55 4c 4c 20 28 64 75 65  xpr is NULL (due
6d70: 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20  .** do a memory 
6d80: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
6d90: 72 65 29 20 74 68 65 6e 20 64 65 6c 65 74 65 20  re) then delete 
6da0: 74 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65  the pSelect obje
6db0: 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
6dc0: 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63  te3PExprAddSelec
6dd0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
6de0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 65   Expr *pExpr, Se
6df0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
6e00: 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
6e10: 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c     pExpr->x.pSel
6e20: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20  ect = pSelect;. 
6e30: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
6e40: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
6e50: 53 65 6c 65 63 74 7c 45 50 5f 53 75 62 71 75 65  Select|EP_Subque
6e60: 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
6e70: 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64  ExprSetHeightAnd
6e80: 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 45  Flags(pParse, pE
6e90: 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  xpr);.  }else{. 
6ea0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
6eb0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
6ec0: 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  led );.    sqlit
6ed0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
6ee0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 65  Parse->db, pSele
6ef0: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  ct);.  }.}.../*.
6f00: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
6f10: 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65  sion is always e
6f20: 69 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41  ither TRUE or FA
6f30: 4c 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c  LSE (respectivel
6f40: 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  y),.** then retu
6f50: 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61  rn 1.  If one ca
6f60: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74  nnot determine t
6f70: 68 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f  he truth value o
6f80: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
6f90: 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ion at compile-t
6fa0: 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ime return 0..**
6fb0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f  .** This is an o
6fc0: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66  ptimization.  If
6fd0: 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e   is OK to return
6fe0: 20 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a   0 here even if.
6ff0: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
7000: 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61  n really is alwa
7010: 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73  ys false or fals
7020: 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74  e (a false negat
7030: 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20  ive)..** But it 
7040: 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75  is a bug to retu
7050: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
7060: 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76  ession might hav
7070: 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62  e different.** b
7080: 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e  oolean values in
7090: 20 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75   different circu
70a0: 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73  mstances (a fals
70b0: 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a  e positive.).**.
70c0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
70d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
70e0: 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74  s part of condit
70f0: 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c  ional for a.** L
7100: 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77  EFT JOIN, then w
7110: 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
7120: 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ne at compile-ti
7130: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
7140: 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20  t.** is it true 
7150: 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77  or false, so alw
7160: 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ays return 0..*/
7170: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
7180: 41 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20  AlwaysTrue(Expr 
7190: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
71a0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
71b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
71c0: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
71d0: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
71e0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
71f0: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
7200: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30  0;.  return v!=0
7210: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65  ;.}.static int e
7220: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45  xprAlwaysFalse(E
7230: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76  xpr *p){.  int v
7240: 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72   = 0;.  if( Expr
7250: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
7260: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
7270: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
7280: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
7290: 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74  ger(p, &v) ) ret
72a0: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
72b0: 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a  v==0;.}../*.** J
72c0: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
72d0: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
72e0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
72f0: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
7300: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
7310: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
7320: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
7330: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  on..**.** If one
7340: 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68   side or the oth
7350: 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73  er of the AND is
7360: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c   known to be fal
7370: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
7380: 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67  .** of returning
7390: 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69   an AND expressi
73a0: 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  on, just return 
73b0: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
73c0: 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20  ssion with.** a 
73d0: 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a  value of false..
73e0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
73f0: 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20  ExprAnd(sqlite3 
7400: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74  *db, Expr *pLeft
7410: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
7420: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
7430: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
7440: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
7450: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
7460: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
7470: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70  .  }else if( exp
7480: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65  rAlwaysFalse(pLe
7490: 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79  ft) || exprAlway
74a0: 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29  sFalse(pRight) )
74b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
74c0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
74d0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
74e0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
74f0: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
7500: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
7510: 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
7520: 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
7530: 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d  kens[0], 0);.  }
7540: 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a  else{.    Expr *
7550: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
7560: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41  prAlloc(db, TK_A
7570: 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ND, 0, 0);.    s
7580: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
7590: 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65  Subtrees(db, pNe
75a0: 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  w, pLeft, pRight
75b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e  );.    return pN
75c0: 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ew;.  }.}../*.**
75d0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
75e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
75f0: 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20   for a function 
7600: 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  with multiple.**
7610: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45   arguments..*/.E
7620: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
7630: 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
7640: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
7650: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
7660: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
7670: 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33  *pNew;.  sqlite3
7680: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7690: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  b;.  assert( pTo
76a0: 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ken );.  pNew = 
76b0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
76c0: 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  (db, TK_FUNCTION
76d0: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
76e0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
76f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
7700: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
7710: 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65  st); /* Avoid me
7720: 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d  mory leak when m
7730: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
7740: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7750: 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  .  pNew->x.pList
7760: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65   = pList;.  asse
7770: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
7780: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
7790: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71  sSelect) );.  sq
77a0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
77b0: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73  htAndFlags(pPars
77c0: 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  e, pNew);.  retu
77d0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
77e0: 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61  * Assign a varia
77f0: 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e  ble number to an
7800: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
7810: 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63   encodes a wildc
7820: 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ard.** in the or
7830: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
7840: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69  ment.  .**.** Wi
7850: 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69  ldcards consisti
7860: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22  ng of a single "
7870: 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ?" are assigned 
7880: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7890: 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ial.** variable 
78a0: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69  number..**.** Wi
78b0: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
78c0: 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61  orm "?nnn" are a
78d0: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62  ssigned the numb
78e0: 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61  er "nnn".  We ma
78f0: 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22  ke.** sure "nnn"
7900: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69 67 20   is not too big 
7910: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61  to avoid a denia
7920: 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74  l of service att
7930: 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ack when.** the 
7940: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  SQL statement co
7950: 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65  mes from an exte
7960: 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a  rnal source..**.
7970: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
7980: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c  the form ":aaa",
7990: 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61   "@aaa", or "$aa
79a0: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
79b0: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
79c0: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
79d0: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
79e0: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
79f0: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
7a00: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
7a10: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
7a20: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
7a30: 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69   sequential vari
7a40: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
7a50: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
7a60: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
7a70: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
7a80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
7a90: 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32 20 6e  pr *pExpr, u32 n
7aa0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7ab0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7ac0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7ad0: 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20 69 66    ynVar x;..  if
7ae0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
7af0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21  urn;.  assert( !
7b00: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7b10: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
7b20: 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50  ue|EP_Reduced|EP
7b30: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20  _TokenOnly) );. 
7b40: 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54   z = pExpr->u.zT
7b50: 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
7b60: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
7b70: 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 61  ( z[0]!=0 );.  a
7b80: 73 73 65 72 74 28 20 6e 3d 3d 28 75 33 32 29 73  ssert( n==(u32)s
7b90: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7ba0: 29 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  ) );.  if( z[1]=
7bb0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =0 ){.    /* Wil
7bc0: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
7bd0: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
7be0: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
7bf0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61   number */.    a
7c00: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27  ssert( z[0]=='?'
7c10: 20 29 3b 0a 20 20 20 20 78 20 3d 20 28 79 6e 56   );.    x = (ynV
7c20: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
7c30: 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ar);.  }else{.  
7c40: 20 20 69 6e 74 20 64 6f 41 64 64 20 3d 20 30 3b    int doAdd = 0;
7c50: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
7c60: 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  ?' ){.      /* W
7c70: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
7c80: 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e  orm "?nnn".  Con
7c90: 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e  vert "nnn" to an
7ca0: 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20   integer and.   
7cb0: 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20     ** use it as 
7cc0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  the variable num
7cd0: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  ber */.      i64
7ce0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   i;.      int bO
7cf0: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  k;.      if( n==
7d00: 32 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54  2 ){ /*OPTIMIZAT
7d10: 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a 20 20  ION-IF-TRUE*/.  
7d20: 20 20 20 20 20 20 69 20 3d 20 7a 5b 31 5d 2d 27        i = z[1]-'
7d30: 30 27 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  0';  /* The comm
7d40: 6f 6e 20 63 61 73 65 20 6f 66 20 3f 4e 20 66 6f  on case of ?N fo
7d50: 72 20 61 20 73 69 6e 67 6c 65 20 64 69 67 69 74  r a single digit
7d60: 20 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f   N */.        bO
7d70: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  k = 1;.      }el
7d80: 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20  se{.        bOk 
7d90: 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69  = 0==sqlite3Atoi
7da0: 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d  64(&z[1], &i, n-
7db0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  1, SQLITE_UTF8);
7dc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
7dd0: 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b  estcase( i==0 );
7de0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7df0: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74   i==1 );.      t
7e00: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
7e10: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7e20: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7e30: 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20  BER]-1 );.      
7e40: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
7e50: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7e60: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
7e70: 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69  MBER] );.      i
7e80: 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31  f( bOk==0 || i<1
7e90: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
7ea0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7eb0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
7ec0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7ed0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7ee0: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
7ef0: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
7f00: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
7f10: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
7f20: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7f30: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7f40: 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  BER]);.        r
7f50: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
7f60: 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29       x = (ynVar)
7f70: 69 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70  i;.      if( x>p
7f80: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
7f90: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
7fa0: 56 61 72 20 3d 20 28 69 6e 74 29 78 3b 0a 20 20  Var = (int)x;.  
7fb0: 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b        doAdd = 1;
7fc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
7fd0: 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d   sqlite3VListNum
7fe0: 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70  ToName(pParse->p
7ff0: 56 4c 69 73 74 2c 20 78 29 3d 3d 30 20 29 7b 0a  VList, x)==0 ){.
8000: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
8010: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
8020: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
8030: 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a  ildcards like ":
8040: 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20  aaa", "$aaa" or 
8050: 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "@aaa".  Reuse t
8060: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
8070: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
8080: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
8090: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
80a0: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
80b0: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20   the name.      
80c0: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
80d0: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
80e0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
80f0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
8100: 20 20 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20     */.      x = 
8110: 28 79 6e 56 61 72 29 73 71 6c 69 74 65 33 56 4c  (ynVar)sqlite3VL
8120: 69 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 70 50 61  istNameToNum(pPa
8130: 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20  rse->pVList, z, 
8140: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3d  n);.      if( x=
8150: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20  =0 ){.        x 
8160: 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72  = (ynVar)(++pPar
8170: 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 20  se->nVar);.     
8180: 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20     doAdd = 1;.  
8190: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
81a0: 69 66 28 20 64 6f 41 64 64 20 29 7b 0a 20 20 20  if( doAdd ){.   
81b0: 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73     pParse->pVLis
81c0: 74 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74  t = sqlite3VList
81d0: 41 64 64 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  Add(db, pParse->
81e0: 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20 78 29  pVList, z, n, x)
81f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  ;.    }.  }.  pE
8200: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78  xpr->iColumn = x
8210: 3b 0a 20 20 69 66 28 20 78 3e 64 62 2d 3e 61 4c  ;.  if( x>db->aL
8220: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8230: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
8240: 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  R] ){.    sqlite
8250: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8260: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20  , "too many SQL 
8270: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
8280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
8290: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
82a0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
82b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
82c0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
82d0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
82e0: 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eNN(sqlite3 *db,
82f0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73   Expr *p){.  ass
8300: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 2f  ert( p!=0 );.  /
8310: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20  * Sanity check: 
8320: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
8330: 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  IntValue is non-
8340: 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65  negative if it e
8350: 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  xists */.  asser
8360: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
8370: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
8380: 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c  ue) || p->u.iVal
8390: 75 65 3e 3d 30 20 29 3b 0a 23 69 66 64 65 66 20  ue>=0 );.#ifdef 
83a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
83b0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
83c0: 74 79 28 70 2c 20 45 50 5f 4c 65 61 66 29 20 26  ty(p, EP_Leaf) &
83d0: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
83e0: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
83f0: 6c 79 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ly) ){.    asser
8400: 74 28 20 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29  t( p->pLeft==0 )
8410: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
8420: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
8430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70    assert( p->x.p
8440: 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 7d  Select==0 );.  }
8450: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 45  .#endif.  if( !E
8460: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8470: 2c 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  , (EP_TokenOnly|
8480: 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20  EP_Leaf)) ){.   
8490: 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75   /* The Expr.x u
84a0: 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73  nion is never us
84b0: 65 64 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  ed at the same t
84c0: 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69 67  ime as Expr.pRig
84d0: 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ht */.    assert
84e0: 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20  ( p->x.pList==0 
84f0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  || p->pRight==0 
8500: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  );.    if( p->pL
8510: 65 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b  eft && p->op!=TK
8520: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
8530: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8540: 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66  teNN(db, p->pLef
8550: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
8560: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
8570: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66  >pRight);.    if
8580: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8590: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
85a0: 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
85b0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
85c0: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
85d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
85e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
85f0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
8600: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
8610: 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48  .  }.  if( ExprH
8620: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8630: 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c  _MemToken) ) sql
8640: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8650: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69  ->u.zToken);.  i
8660: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
8670: 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63  rty(p, EP_Static
8680: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
8690: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
86a0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
86b0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71  te3ExprDelete(sq
86c0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
86d0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73  *p){.  if( p ) s
86e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
86f0: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  NN(db, p);.}../*
8700: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
8710: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
8720: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
8730: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75   expression stru
8740: 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64  cture .** passed
8750: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
8760: 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  gument. This is 
8770: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58  always one of EX
8780: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20  PR_FULLSIZE,.** 
8790: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
87a0: 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   or EXPR_TOKENON
87b0: 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69  LYSIZE..*/.stati
87c0: 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74  c int exprStruct
87d0: 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  Size(Expr *p){. 
87e0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
87f0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
8800: 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45  Only) ) return E
8810: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
8820: 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  E;.  if( ExprHas
8830: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
8840: 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e  educed) ) return
8850: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
8860: 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52  E;.  return EXPR
8870: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  _FULLSIZE;.}../*
8880: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
8890: 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65  r*Size() routine
88a0: 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68  s each return th
88b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
88c0: 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
88d0: 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66   store a copy of
88e0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f   an expression o
88f0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  r expression tre
8900: 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20  e.  They differ 
8910: 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f  in.** how much o
8920: 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65  f the tree is me
8930: 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  asured..**.**   
8940: 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63    dupedExprStruc
8950: 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65  tSize()     Size
8960: 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70   of only the Exp
8970: 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  r structure .** 
8980: 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64      dupedExprNod
8990: 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69  eSize()       Si
89a0: 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61  ze of Expr + spa
89b0: 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20  ce for token.** 
89c0: 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a      dupedExprSiz
89d0: 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78  e()           Ex
89e0: 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62  pr + token + sub
89f0: 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a  tree components.
8a00: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
8a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
8a50: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
8a60: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66  prStructSize() f
8a70: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
8a80: 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64  two values OR-ed
8a90: 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20   together:  .** 
8aa0: 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65  (1) the space re
8ab0: 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70  quired for a cop
8ac0: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
8ad0: 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64  ructure only and
8ae0: 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f   .** (2) the EP_
8af0: 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69  xxx flags that i
8b00: 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65  ndicate what the
8b10: 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20   structure size 
8b20: 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68  should be..** Th
8b30: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  e return values 
8b40: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
8b50: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50  :.**.**      EXP
8b60: 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20  R_FULLSIZE.**   
8b70: 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53     EXPR_REDUCEDS
8b80: 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63  IZE   | EP_Reduc
8b90: 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ed.**      EXPR_
8ba0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
8bb0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a  EP_TokenOnly.**.
8bc0: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
8bd0: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  he structure can
8be0: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
8bf0: 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  king the return 
8c00: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73  value.** of this
8c10: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78   routine with 0x
8c20: 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20  fff.  The flags 
8c30: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
8c40: 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72  masking the.** r
8c50: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68  eturn value with
8c60: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
8c70: 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  okenOnly..**.** 
8c80: 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66  Note that with f
8c90: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
8ca0: 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69  DUCE, this routi
8cb0: 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c  nes works on ful
8cc0: 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64  l-size.** (unred
8cd0: 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63  uced) Expr objec
8ce0: 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72  ts as they or or
8cf0: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75  iginally constru
8d00: 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73  cted by the pars
8d10: 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78  er..** During ex
8d20: 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
8d30: 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  s, extra informa
8d40: 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64  tion is computed
8d50: 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a   and moved into.
8d60: 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f  ** later parts o
8d70: 66 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63  f teh Expr objec
8d80: 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61  t and that extra
8d90: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67   information mig
8da0: 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a  ht get chopped.*
8db0: 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70  * off if the exp
8dc0: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63  ression is reduc
8dd0: 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  ed.  Note also t
8de0: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
8df0: 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  work to.** make 
8e00: 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  an EXPRDUP_REDUC
8e10: 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75  E copy of a redu
8e20: 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ced expression. 
8e30: 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61   It is only lega
8e40: 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61  l.** to reduce a
8e50: 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73   pristine expres
8e60: 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74  sion tree from t
8e70: 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20  he parser.  The 
8e80: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a  implementation.*
8e90: 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74  * of dupedExprSt
8ea0: 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61  ructSize() conta
8eb0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65  in multiple asse
8ec0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
8ed0: 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20  that attempt.** 
8ee0: 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
8ef0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73  constraint..*/.s
8f00: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
8f10: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
8f20: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
8f30: 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a  ){.  int nSize;.
8f40: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
8f50: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
8f60: 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f  || flags==0 ); /
8f70: 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20  * Only one flag 
8f80: 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  value allowed */
8f90: 0a 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f  .  assert( EXPR_
8fa0: 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20  FULLSIZE<=0xfff 
8fb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78  );.  assert( (0x
8fc0: 66 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65  fff & (EP_Reduce
8fd0: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29  d|EP_TokenOnly))
8fe0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d  ==0 );.  if( 0==
8ff0: 66 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  flags || p->op==
9000: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
9010: 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   ){.    nSize = 
9020: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20  EXPR_FULLSIZE;. 
9030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
9040: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
9050: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
9060: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
9070: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9080: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
9090: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
90a0: 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28   ); .    assert(
90b0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
90c0: 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e  y(p, EP_MemToken
90d0: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
90e0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
90f0: 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  y(p, EP_NoReduce
9100: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ) );.    if( p->
9110: 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c  pLeft || p->x.pL
9120: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  ist ){.      nSi
9130: 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43 45  ze = EXPR_REDUCE
9140: 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75 63  DSIZE | EP_Reduc
9150: 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ed;.    }else{. 
9160: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9170: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
9180: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
9190: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
91a0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20  EP_TokenOnly;.  
91b0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
91c0: 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nSize;.}../*.**
91d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
91e0: 65 74 75 72 6e 73 20 74 68 65 20 73 70 61 63 65  eturns the space
91f0: 20 69 6e 20 62 79 74 65 73 20 72 65 71 75 69 72   in bytes requir
9200: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
9210: 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20  copy .** of the 
9220: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 61  Expr structure a
9230: 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  nd a copy of the
9240: 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73   Expr.u.zToken s
9250: 74 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a 2a  tring (if that.*
9260: 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65 66 69  * string is defi
9270: 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ned.).*/.static 
9280: 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f 64  int dupedExprNod
9290: 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69  eSize(Expr *p, i
92a0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
92b0: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
92c0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20  prStructSize(p, 
92d0: 66 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b 0a  flags) & 0xfff;.
92e0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
92f0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
9300: 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a  Value) && p->u.z
9310: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79  Token ){.    nBy
9320: 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
9330: 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65  len30(p->u.zToke
9340: 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n)+1;.  }.  retu
9350: 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29  rn ROUND8(nByte)
9360: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
9370: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
9380: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
9390: 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69  o create a dupli
93a0: 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  cate of the .** 
93b0: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
93c0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
93d0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63  rgument. The sec
93e0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
93f0: 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69  a.** mask contai
9400: 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58  ning EXPRDUP_XXX
9410: 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
9420: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
9430: 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20   includes space 
9440: 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79  to create a copy
9450: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
9460: 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e  uct.** itself an
9470: 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66  d the buffer ref
9480: 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72  erred to by Expr
9490: 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e  .u.zToken, if an
94a0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
94b0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66  EXPRDUP_REDUCE f
94c0: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
94d0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
94e0: 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73  e includes .** s
94f0: 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74  pace to duplicat
9500: 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73  e all Expr nodes
9510: 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72   in the tree for
9520: 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66  med by Expr.pLef
9530: 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70  t .** and Expr.p
9540: 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20  Right variables 
9550: 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79  (but not for any
9560: 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e   structures poin
9570: 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65  ted to or .** de
9580: 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65  scended from the
9590: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72   Expr.x.pList or
95a0: 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20   Expr.x.pSelect 
95b0: 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73  variables)..*/.s
95c0: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
95d0: 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  xprSize(Expr *p,
95e0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
95f0: 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20  nt nByte = 0;.  
9600: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79  if( p ){.    nBy
9610: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f  te = dupedExprNo
9620: 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  deSize(p, flags)
9630: 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26  ;.    if( flags&
9640: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
9650: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
9660: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
9670: 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20  ->pLeft, flags) 
9680: 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  + dupedExprSize(
9690: 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73  p->pRight, flags
96a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
96b0: 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a  eturn nByte;.}..
96c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
96d0: 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
96e0: 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  o sqlite3ExprDup
96f0: 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
9700: 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20  if pzBuffer .** 
9710: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
9720: 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73   *pzBuffer is as
9730: 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  sumed to point t
9740: 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65  o a buffer large
9750: 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73   enough .** to s
9760: 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66  tore the copy of
9770: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74   expression p, t
9780: 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e  he copies of p->
9790: 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20  u.zToken.** (if 
97a0: 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64  applicable), and
97b0: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74   the copies of t
97c0: 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20  he p->pLeft and 
97d0: 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73  p->pRight expres
97e0: 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79  sions,.** if any
97f0: 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  . Before returni
9800: 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73  ng, *pzBuffer is
9810: 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73   set to the firs
9820: 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 0a  t byte past the.
9830: 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ** portion of th
9840: 65 20 62 75 66 66 65 72 20 63 6f 70 69 65 64 20  e buffer copied 
9850: 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e  into by this fun
9860: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
9870: 20 45 78 70 72 20 2a 65 78 70 72 44 75 70 28 73   Expr *exprDup(s
9880: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
9890: 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67   *p, int dupFlag
98a0: 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72  s, u8 **pzBuffer
98b0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
98c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
98d0: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
98e0: 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20  .  u8 *zAlloc;  
98f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
9900: 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68  ry space from wh
9910: 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70  ich to build Exp
9920: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33  r object */.  u3
9930: 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20  2 staticFlag;   
9940: 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63      /* EP_Static
9950: 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62   if space not ob
9960: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
9970: 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  oc */..  assert(
9980: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
9990: 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72  rt( p );.  asser
99a0: 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c  t( dupFlags==0 |
99b0: 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52  | dupFlags==EXPR
99c0: 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20  DUP_REDUCE );.  
99d0: 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65 72  assert( pzBuffer
99e0: 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d  ==0 || dupFlags=
99f0: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
9a00: 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
9a10: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
9a20: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
9a30: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
9a40: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
9a50: 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a      zAlloc = *pz
9a60: 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74  Buffer;.    stat
9a70: 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74  icFlag = EP_Stat
9a80: 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ic;.  }else{.   
9a90: 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65   zAlloc = sqlite
9aa0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
9ab0: 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  b, dupedExprSize
9ac0: 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a  (p, dupFlags));.
9ad0: 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d      staticFlag =
9ae0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d   0;.  }.  pNew =
9af0: 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b   (Expr *)zAlloc;
9b00: 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ..  if( pNew ){.
9b10: 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53      /* Set nNewS
9b20: 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
9b30: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
9b40: 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
9b50: 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79  ted to.    ** by
9b60: 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65   pNew. This is e
9b70: 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53  ither EXPR_FULLS
9b80: 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45  IZE, EXPR_REDUCE
9b90: 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20  DSIZE or.    ** 
9ba0: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
9bb0: 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65  ZE. nToken is se
9bc0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
9bd0: 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65  of bytes consume
9be0: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
9bf0: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75  copy of the p->u
9c00: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28  .zToken string (
9c10: 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a  if any)..    */.
9c20: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
9c30: 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d  ed nStructSize =
9c40: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
9c50: 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73  Size(p, dupFlags
9c60: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  );.    const int
9c70: 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72   nNewSize = nStr
9c80: 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b  uctSize & 0xfff;
9c90: 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b  .    int nToken;
9ca0: 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61  .    if( !ExprHa
9cb0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9cc0: 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
9cd0: 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
9ce0: 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74    nToken = sqlit
9cf0: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e  e3Strlen30(p->u.
9d00: 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20  zToken) + 1;.   
9d10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54   }else{.      nT
9d20: 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  oken = 0;.    }.
9d30: 20 20 20 20 69 66 28 20 64 75 70 46 6c 61 67 73      if( dupFlags
9d40: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
9d50: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
9d60: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
9d70: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ==0 );.      mem
9d80: 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e  cpy(zAlloc, p, n
9d90: 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65  NewSize);.    }e
9da0: 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e  lse{.      u32 n
9db0: 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72  Size = (u32)expr
9dc0: 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20  StructSize(p);. 
9dd0: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c       memcpy(zAll
9de0: 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20  oc, p, nSize);. 
9df0: 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45       if( nSize<E
9e00: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20  XPR_FULLSIZE ){ 
9e10: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
9e20: 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20  &zAlloc[nSize], 
9e30: 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  0, EXPR_FULLSIZE
9e40: 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  -nSize);.      }
9e50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
9e60: 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65  et the EP_Reduce
9e70: 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c  d, EP_TokenOnly,
9e80: 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66   and EP_Static f
9e90: 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65  lags appropriate
9ea0: 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  ly. */.    pNew-
9eb0: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52  >flags &= ~(EP_R
9ec0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
9ed0: 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50  nly|EP_Static|EP
9ee0: 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  _MemToken);.    
9ef0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e  pNew->flags |= n
9f00: 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50  StructSize & (EP
9f10: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
9f20: 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77  nOnly);.    pNew
9f30: 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69  ->flags |= stati
9f40: 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43  cFlag;..    /* C
9f50: 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f  opy the p->u.zTo
9f60: 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61  ken string, if a
9f70: 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ny. */.    if( n
9f80: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63  Token ){.      c
9f90: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
9fa0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
9fb0: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
9fc0: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d  ewSize];.      m
9fd0: 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d  emcpy(zToken, p-
9fe0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  >u.zToken, nToke
9ff0: 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  n);.    }..    i
a000: 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73  f( 0==((p->flags
a010: 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20  |pNew->flags) & 
a020: 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  (EP_TokenOnly|EP
a030: 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20  _Leaf)) ){.     
a040: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
a050: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
a060: 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  or pNew->x.pList
a070: 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20   member. */.    
a080: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a090: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
a0a0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
a0b0: 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63    pNew->x.pSelec
a0c0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
a0d0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53  tDup(db, p->x.pS
a0e0: 65 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29  elect, dupFlags)
a0f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a100: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
a110: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
a120: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
a130: 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61  >x.pList, dupFla
a140: 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gs);.      }.   
a150: 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20   }..    /* Fill 
a160: 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61  in pNew->pLeft a
a170: 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e  nd pNew->pRight.
a180: 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72   */.    if( Expr
a190: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
a1a0: 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  , EP_Reduced|EP_
a1b0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
a1c0: 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75      zAlloc += du
a1d0: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
a1e0: 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  p, dupFlags);.  
a1f0: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a200: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
a210: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
a220: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eaf) ){.        
a230: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d  pNew->pLeft = p-
a240: 3e 70 4c 65 66 74 20 3f 0a 20 20 20 20 20 20 20  >pLeft ?.       
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
a260: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
a270: 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  eft, EXPRDUP_RED
a280: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20  UCE, &zAlloc) : 
a290: 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
a2a0: 3e 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69  >pRight = p->pRi
a2b0: 67 68 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20  ght ?.          
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
a2d0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
a2e0: 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ht, EXPRDUP_REDU
a2f0: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30  CE, &zAlloc) : 0
a300: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a310: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
a320: 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65          *pzBuffe
a330: 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20  r = zAlloc;.    
a340: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
a350: 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
a360: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
a370: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61  TokenOnly|EP_Lea
a380: 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  f) ){.        if
a390: 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b 5f 53  ( pNew->op==TK_S
a3a0: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  ELECT_COLUMN ){.
a3b0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
a3c0: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a3d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
a3e0: 72 74 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  rt( p->iColumn==
a3f0: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
a400: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
a410: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
a420: 3d 3d 30 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68  ==0  || p->pRigh
a430: 74 3d 3d 70 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  t==p->pLeft );. 
a440: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a450: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
a460: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
a470: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66  rDup(db, p->pLef
a480: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  t, 0);.        }
a490: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
a4a0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
a4b0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
a4c0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
a4d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
a4e0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
a4f0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72  .** Create and r
a500: 65 74 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70  eturn a deep cop
a510: 79 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20  y of the object 
a520: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
a530: 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  cond .** argumen
a540: 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e  t. If an OOM con
a550: 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e  dition is encoun
a560: 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  tered, NULL is r
a570: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74  eturned.** and t
a580: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
a590: 6c 65 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f  led flag set..*/
a5a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a5b0: 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20  OMIT_CTE.static 
a5c0: 57 69 74 68 20 2a 77 69 74 68 44 75 70 28 73 71  With *withDup(sq
a5d0: 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20  lite3 *db, With 
a5e0: 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65  *p){.  With *pRe
a5f0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  t = 0;.  if( p )
a600: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
a610: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73  = sizeof(*p) + s
a620: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
a630: 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20   (p->nCte-1);.  
a640: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
a650: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
a660: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
a670: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69   pRet ){.      i
a680: 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74  nt i;.      pRet
a690: 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65  ->nCte = p->nCte
a6a0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
a6b0: 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
a6c0: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  {.        pRet->
a6d0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73  a[i].pSelect = s
a6e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
a6f0: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c  db, p->a[i].pSel
a700: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
a710: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c   pRet->a[i].pCol
a720: 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  s = sqlite3ExprL
a730: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  istDup(db, p->a[
a740: 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20  i].pCols, 0);.  
a750: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
a760: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
a770: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e  DbStrDup(db, p->
a780: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
a790: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
a7a0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
a7b0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
a7c0: 69 74 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65  ithDup(x,y) 0.#e
a7d0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
a7e0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
a7f0: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
a800: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
a810: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
a820: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
a830: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
a840: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
a850: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
a860: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
a870: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
a880: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
a890: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
a8a0: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
a8b0: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
a8c0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
a8d0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
a8e0: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
a8f0: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
a900: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
a910: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
a920: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
a930: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
a940: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
a950: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
a960: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
a970: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
a980: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
a990: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
a9a0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
a9b0: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
a9c0: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
a9d0: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
a9e0: 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  licated..**.** T
a9f0: 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
aa00: 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f  er contains a co
aa10: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
aa20: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
aa30: 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  gs..** If the EX
aa40: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
aa50: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
aa60: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  he structure ret
aa70: 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72  urned is a.** tr
aa80: 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20  uncated version 
aa90: 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70  of the usual Exp
aaa0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
aab0: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
aac0: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  as.** part of th
aad0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
aae0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
aaf0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
ab00: 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  a..*/.Expr *sqli
ab10: 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74  te3ExprDup(sqlit
ab20: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
ab30: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
ab40: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
ab50: 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  || flags==EXPRDU
ab60: 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65  P_REDUCE );.  re
ab70: 74 75 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70  turn p ? exprDup
ab80: 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30  (db, p, flags, 0
ab90: 29 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73  ) : 0;.}.ExprLis
aba0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
abb0: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
abc0: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  b, ExprList *p, 
abd0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78  int flags){.  Ex
abe0: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
abf0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
ac00: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f  item *pItem, *pO
ac10: 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  ldItem;.  int i;
ac20: 0a 20 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53  .  Expr *pPriorS
ac30: 65 6c 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20  electCol = 0;.  
ac40: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
ac50: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
ac60: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
ac70: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
ac80: 52 61 77 4e 4e 28 64 62 2c 20 0a 20 20 20 20 20  RawNN(db, .     
ac90: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
aca0: 70 4e 65 77 29 2b 73 69 7a 65 6f 66 28 70 4e 65  pNew)+sizeof(pNe
acb0: 77 2d 3e 61 5b 30 5d 29 2a 28 70 2d 3e 6e 45 78  w->a[0])*(p->nEx
acc0: 70 72 2d 31 29 20 29 3b 0a 20 20 69 66 28 20 70  pr-1) );.  if( p
acd0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
ace0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  0;.  pNew->nAllo
acf0: 63 20 3d 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  c = pNew->nExpr 
ad00: 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  = p->nExpr;.  pI
ad10: 74 65 6d 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20  tem = pNew->a;. 
ad20: 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61   pOldItem = p->a
ad30: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ad40: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
ad50: 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b  tem++, pOldItem+
ad60: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f  +){.    Expr *pO
ad70: 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65  ldExpr = pOldIte
ad80: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 45 78  m->pExpr;.    Ex
ad90: 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
ada0: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
adb0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
adc0: 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c  db, pOldExpr, fl
add0: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  ags);.    if( pO
ade0: 6c 64 45 78 70 72 20 0a 20 20 20 20 20 26 26 20  ldExpr .     && 
adf0: 70 4f 6c 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pOldExpr->op==TK
ae00: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20  _SELECT_COLUMN. 
ae10: 20 20 20 20 26 26 20 28 70 4e 65 77 45 78 70 72      && (pNewExpr
ae20: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29   = pItem->pExpr)
ae30: 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
ae40: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78    assert( pNewEx
ae50: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c  pr->iColumn==0 |
ae60: 7c 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 69  | i>0 );.      i
ae70: 66 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f  f( pNewExpr->iCo
ae80: 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lumn==0 ){.     
ae90: 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 45     assert( pOldE
aea0: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64  xpr->pLeft==pOld
aeb0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a  Expr->pRight );.
aec0: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 53 65          pPriorSe
aed0: 6c 65 63 74 43 6f 6c 20 3d 20 70 4e 65 77 45 78  lectCol = pNewEx
aee0: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77  pr->pLeft = pNew
aef0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
af00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
af10: 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
af20: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
af30: 28 20 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70  ( pItem[-1].pExp
af40: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
af50: 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72  assert( pNewExpr
af60: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65 6d  ->iColumn==pItem
af70: 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  [-1].pExpr->iCol
af80: 75 6d 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  umn+1 );.       
af90: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 53   assert( pPriorS
afa0: 65 6c 65 63 74 43 6f 6c 3d 3d 70 49 74 65 6d 5b  electCol==pItem[
afb0: 2d 31 5d 2e 70 45 78 70 72 2d 3e 70 4c 65 66 74  -1].pExpr->pLeft
afc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
afd0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 50  Expr->pLeft = pP
afe0: 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3b 0a 20  riorSelectCol;. 
aff0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b000: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
b010: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
b020: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
b030: 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ame);.    pItem-
b040: 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
b050: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b060: 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  dItem->zSpan);. 
b070: 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72     pItem->sortOr
b080: 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  der = pOldItem->
b090: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70  sortOrder;.    p
b0a0: 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a  Item->done = 0;.
b0b0: 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e      pItem->bSpan
b0c0: 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  IsTab = pOldItem
b0d0: 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20 20  ->bSpanIsTab;.  
b0e0: 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c    pItem->u = pOl
b0f0: 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20  dItem->u;.  }.  
b100: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
b110: 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73  /*.** If cursors
b120: 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77  , triggers, view
b130: 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
b140: 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64   are all omitted
b150: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69   from.** the bui
b160: 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66  ld, then none of
b170: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
b180: 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20  outines, except 
b190: 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53  for .** sqlite3S
b1a0: 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20  electDup(), can 
b1b0: 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74  be called. sqlit
b1c0: 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73  e3SelectDup() is
b1d0: 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61   sometimes.** ca
b1e0: 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c  lled with a NULL
b1f0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69   argument..*/.#i
b200: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
b210: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
b220: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b230: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a  OMIT_TRIGGER) \.
b240: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
b250: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b260: 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  Y).SrcList *sqli
b270: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71  te3SrcListDup(sq
b280: 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69  lite3 *db, SrcLi
b290: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
b2a0: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  ){.  SrcList *pN
b2b0: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
b2c0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65  nt nByte;.  asse
b2d0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
b2e0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
b2f0: 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   0;.  nByte = si
b300: 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e  zeof(*p) + (p->n
b310: 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70  Src>0 ? sizeof(p
b320: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53  ->a[0]) * (p->nS
b330: 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e  rc-1) : 0);.  pN
b340: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
b350: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42  llocRawNN(db, nB
b360: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  yte );.  if( pNe
b370: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
b380: 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20  .  pNew->nSrc = 
b390: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
b3a0: 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->nSrc;.  for(i=
b3b0: 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b  0; i<p->nSrc; i+
b3c0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
b3d0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  rcList_item *pNe
b3e0: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
b3f0: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
b400: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  SrcList_item *pO
b410: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
b420: 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
b430: 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ab;.    pNewItem
b440: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64  ->pSchema = pOld
b450: 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20  Item->pSchema;. 
b460: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61     pNewItem->zDa
b470: 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
b480: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b490: 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  dItem->zDatabase
b4a0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
b4b0: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
b4c0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b4d0: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
b4e0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c     pNewItem->zAl
b4f0: 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ias = sqlite3DbS
b500: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b510: 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
b520: 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20 3d 20   pNewItem->fg = 
b530: 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a 20 20  pOldItem->fg;.  
b540: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72    pNewItem->iCur
b550: 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sor = pOldItem->
b560: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65  iCursor;.    pNe
b570: 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  wItem->addrFillS
b580: 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61  ub = pOldItem->a
b590: 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20  ddrFillSub;.    
b5a0: 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65 74  pNewItem->regRet
b5b0: 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  urn = pOldItem->
b5c0: 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 69  regReturn;.    i
b5d0: 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e  f( pNewItem->fg.
b5e0: 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20  isIndexedBy ){. 
b5f0: 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75       pNewItem->u
b600: 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73  1.zIndexedBy = s
b610: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b620: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e  b, pOldItem->u1.
b630: 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20  zIndexedBy);.   
b640: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
b650: 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 4f 6c 64  >pIBIndex = pOld
b660: 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 3b 0a  Item->pIBIndex;.
b670: 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d      if( pNewItem
b680: 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
b690: 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d  {.      pNewItem
b6a0: 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20  ->u1.pFuncArg = 
b6b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b6c0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
b6d0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 70  , pOldItem->u1.p
b6e0: 46 75 6e 63 41 72 67 2c 20 66 6c 61 67 73 29 3b  FuncArg, flags);
b6f0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20  .    }.    pTab 
b700: 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62  = pNewItem->pTab
b710: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61   = pOldItem->pTa
b720: 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  b;.    if( pTab 
b730: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  ){.      pTab->n
b740: 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  TabRef++;.    }.
b750: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
b760: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
b770: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c  electDup(db, pOl
b780: 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  dItem->pSelect, 
b790: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
b7a0: 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69  Item->pOn = sqli
b7b0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b7c0: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c  OldItem->pOn, fl
b7d0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
b7e0: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
b7f0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
b800: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
b810: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
b820: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
b830: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
b840: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
b850: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
b860: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
b870: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
b880: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
b890: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
b8a0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
b8b0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
b8c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
b8d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
b8e0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
b8f0: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
b900: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
b910: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
b920: 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70  Id = p->nId;.  p
b930: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  New->a = sqlite3
b940: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
b950: 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28  , p->nId*sizeof(
b960: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
b970: 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a  ( pNew->a==0 ){.
b980: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b990: 65 4e 4e 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  eNN(db, pNew);. 
b9a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
b9b0: 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  /* Note that 
b9c0: 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65  because the size
b9d0: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   of the allocati
b9e0: 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73  on for p->a[] is
b9f0: 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73   not.  ** necess
ba00: 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66  arily a power of
ba10: 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c   two, sqlite3IdL
ba20: 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20  istAppend() may 
ba30: 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20  not be called.  
ba40: 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63  ** on the duplic
ba50: 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74  ate created by t
ba60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  his function. */
ba70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
ba80: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
ba90: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
baa0: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
bab0: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
bac0: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
bad0: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
bae0: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65  p->a[i];.    pNe
baf0: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
bb00: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
bb10: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
bb20: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
bb30: 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65  m->idx = pOldIte
bb40: 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65  m->idx;.  }.  re
bb50: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c  turn pNew;.}.Sel
bb60: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
bb70: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
bb80: 62 2c 20 53 65 6c 65 63 74 20 2a 70 44 75 70 2c  b, Select *pDup,
bb90: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
bba0: 65 6c 65 63 74 20 2a 70 52 65 74 20 3d 20 30 3b  elect *pRet = 0;
bbb0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 78 74  .  Select *pNext
bbc0: 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a   = 0;.  Select *
bbd0: 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a 20 20 53  *pp = &pRet;.  S
bbe0: 65 6c 65 63 74 20 2a 70 3b 0a 0a 20 20 61 73 73  elect *p;..  ass
bbf0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
bc00: 66 6f 72 28 70 3d 70 44 75 70 3b 20 70 3b 20 70  for(p=pDup; p; p
bc10: 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  =p->pPrior){.   
bc20: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 20 3d 20   Select *pNew = 
bc30: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
bc40: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
bc50: 2a 70 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  *p) );.    if( p
bc60: 4e 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  New==0 ) break;.
bc70: 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74      pNew->pEList
bc80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
bc90: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
bca0: 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ist, flags);.   
bcb0: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71   pNew->pSrc = sq
bcc0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
bcd0: 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61  db, p->pSrc, fla
bce0: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
bcf0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
bd00: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  xprDup(db, p->pW
bd10: 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  here, flags);.  
bd20: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
bd30: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
bd40: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72  stDup(db, p->pGr
bd50: 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20  oupBy, flags);. 
bd60: 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67     pNew->pHaving
bd70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
bd80: 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  p(db, p->pHaving
bd90: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
bda0: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  ew->pOrderBy = s
bdb0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
bdc0: 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  p(db, p->pOrderB
bdd0: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  y, flags);.    p
bde0: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
bdf0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  .    pNew->pNext
be00: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 70 4e   = pNext;.    pN
be10: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ew->pPrior = 0;.
be20: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74      pNew->pLimit
be30: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
be40: 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  p(db, p->pLimit,
be50: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
be60: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c  w->pOffset = sql
be70: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
be80: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67  p->pOffset, flag
be90: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c  s);.    pNew->iL
bea0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
beb0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
bec0: 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c  .    pNew->selFl
bed0: 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
bee0: 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65  s & ~SF_UsesEphe
bef0: 6d 65 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77 2d  meral;.    pNew-
bf00: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
bf10: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
bf20: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
bf30: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
bf40: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
bf50: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
bf60: 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77   pNew->pWith = w
bf70: 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  ithDup(db, p->pW
bf80: 69 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ith);.    sqlite
bf90: 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
bfa0: 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65  New, p->zSelName
bfb0: 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 4e 65  );.    *pp = pNe
bfc0: 77 3b 0a 20 20 20 20 70 70 20 3d 20 26 70 4e 65  w;.    pp = &pNe
bfd0: 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  w->pPrior;.    p
bfe0: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  Next = pNew;.  }
bff0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
c000: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
c010: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
c020: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
c030: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c  elect *p, int fl
c040: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
c050: 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  p==0 );.  return
c060: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   0;.}.#endif.../
c070: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
c080: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
c090: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
c0a0: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
c0b0: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
c0c0: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
c0d0: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
c0e0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
c0f0: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
c100: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
c110: 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72  ccurs, the entir
c120: 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20  e list is freed 
c130: 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72  and.** NULL is r
c140: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e  eturned.  If non
c150: 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65  -NULL is returne
c160: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  d, then it is gu
c170: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74  aranteed.** that
c180: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
c190: 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
c1a0: 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70  appended..*/.Exp
c1b0: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
c1c0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  prListAppend(.  
c1d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c1e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c1f0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c200: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
c210: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
c220: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
c230: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
c240: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  L */.  Expr *pEx
c250: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr             /
c260: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  * Expression to 
c270: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67  be appended. Mig
c280: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
c290: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
c2a0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
c2b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c2c0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
c2d0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
c2e0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
c2f0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
c300: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
c310: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  N(db, sizeof(Exp
c320: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
c330: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
c340: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
c350: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
c360: 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ->nExpr = 0;.   
c370: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
c380: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
c390: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 4c  pList->nExpr==pL
c3a0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ist->nAlloc ){. 
c3b0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
c3c0: 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  w;.    pNew = sq
c3d0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
c3e0: 62 2c 20 70 4c 69 73 74 2c 20 0a 20 20 20 20 20  b, pList, .     
c3f0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
c400: 70 4c 69 73 74 29 2b 28 32 2a 70 4c 69 73 74 2d  pList)+(2*pList-
c410: 3e 6e 41 6c 6c 6f 63 20 2d 20 31 29 2a 73 69 7a  >nAlloc - 1)*siz
c420: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
c430: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
c440: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
c450: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
c460: 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b     pList = pNew;
c470: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
c480: 6f 63 20 2a 3d 20 32 3b 0a 20 20 7d 0a 20 20 70  oc *= 2;.  }.  p
c490: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
c4a0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
c4b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
c4c0: 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70 72  etof(struct Expr
c4d0: 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29  List_item,zName)
c4e0: 3d 3d 73 69 7a 65 6f 66 28 70 49 74 65 6d 2d 3e  ==sizeof(pItem->
c4f0: 70 45 78 70 72 29 20 29 3b 0a 20 20 61 73 73 65  pExpr) );.  asse
c500: 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73 74 72  rt( offsetof(str
c510: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
c520: 6d 2c 70 45 78 70 72 29 3d 3d 30 20 29 3b 0a 20  m,pExpr)==0 );. 
c530: 20 6d 65 6d 73 65 74 28 26 70 49 74 65 6d 2d 3e   memset(&pItem->
c540: 7a 4e 61 6d 65 2c 30 2c 73 69 7a 65 6f 66 28 2a  zName,0,sizeof(*
c550: 70 49 74 65 6d 29 2d 6f 66 66 73 65 74 6f 66 28  pItem)-offsetof(
c560: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
c570: 69 74 65 6d 2c 7a 4e 61 6d 65 29 29 3b 0a 20 20  item,zName));.  
c580: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
c590: 45 78 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 70  Expr;.  return p
c5a0: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
c5b0: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
c5c0: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
c5d0: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
c5e0: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
c5f0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
c600: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
c610: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
c620: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
c630: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
c640: 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78  pColumns and pEx
c650: 70 72 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72  pr form a vector
c660: 20 61 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63   assignment whic
c670: 68 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  h is part of the
c680: 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f   SET.** clause o
c690: 66 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  f an UPDATE stat
c6a0: 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69  ement.  Like thi
c6b0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
c6c0: 28 61 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31  (a,b,c) = (expr1
c6d0: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
c6e0: 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20   Or:    (a,b,c) 
c6f0: 3d 20 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20  = (SELECT x,y,z 
c700: 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  FROM ....).**.**
c710: 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f   For each term o
c720: 66 20 74 68 65 20 76 65 63 74 6f 72 20 61 73 73  f the vector ass
c730: 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20  ignment, append 
c740: 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74  new entries to t
c750: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
c760: 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e   list pList.  In
c770: 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 73   the case of a s
c780: 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 52  ubquery on the R
c790: 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b  HS, append.** TK
c7a0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65  _SELECT_COLUMN e
c7b0: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45  xpressions..*/.E
c7c0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
c7d0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65  ExprListAppendVe
c7e0: 63 74 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  ctor(.  Parse *p
c7f0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
c800: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c810: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
c820: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  *pList,       /*
c830: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
c840: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
c850: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c  be NULL */.  IdL
c860: 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20  ist *pColumns,  
c870: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e      /* List of n
c880: 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74  ames of LHS of t
c890: 68 65 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f  he assignment */
c8a0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
c8b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63            /* Vec
c8c0: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74  tor expression t
c8d0: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
c8e0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c8f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c900: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c910: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b   int n;.  int i;
c920: 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
c930: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
c940: 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70  Expr : 0;.  /* p
c950: 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79  Columns can only
c960: 20 62 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20   be NULL due to 
c970: 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f  an OOM but an OO
c980: 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a  M will cause an.
c990: 20 20 2a 2a 20 65 78 69 74 20 70 72 69 6f 72 20    ** exit prior 
c9a0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
c9b0: 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f  being invoked */
c9c0: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 6f  .  if( NEVER(pCo
c9d0: 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f  lumns==0) ) goto
c9e0: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
c9f0: 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70  rror;.  if( pExp
ca00: 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74  r==0 ) goto vect
ca10: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
ca20: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48  ..  /* If the RH
ca30: 53 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20 74  S is a vector, t
ca40: 68 65 6e 20 77 65 20 63 61 6e 20 69 6d 6d 65 64  hen we can immed
ca50: 69 61 74 65 6c 79 20 63 68 65 63 6b 20 74 6f 20  iately check to 
ca60: 73 65 65 20 74 68 61 74 20 0a 20 20 2a 2a 20 74  see that .  ** t
ca70: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 52  he size of the R
ca80: 48 53 20 61 6e 64 20 4c 48 53 20 6d 61 74 63 68  HS and LHS match
ca90: 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 52 48  .  But if the RH
caa0: 53 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 0a  S is a SELECT, .
cab0: 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 73 20 28    ** wildcards (
cac0: 22 2a 22 29 20 69 6e 20 74 68 65 20 72 65 73 75  "*") in the resu
cad0: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
cae0: 4c 45 43 54 20 6d 75 73 74 20 62 65 20 65 78 70  LECT must be exp
caf0: 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 20 20 2a  anded before.  *
cb00: 2a 20 77 65 20 63 61 6e 20 64 6f 20 74 68 65 20  * we can do the 
cb10: 73 69 7a 65 20 63 68 65 63 6b 2c 20 73 6f 20 64  size check, so d
cb20: 65 66 65 72 20 74 68 65 20 73 69 7a 65 20 63 68  efer the size ch
cb30: 65 63 6b 20 75 6e 74 69 6c 20 63 6f 64 65 20 67  eck until code g
cb40: 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  eneration..  */.
cb50: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
cb60: 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 43  =TK_SELECT && pC
cb70: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d 28 6e 3d  olumns->nId!=(n=
cb80: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
cb90: 72 53 69 7a 65 28 70 45 78 70 72 29 29 20 29 7b  rSize(pExpr)) ){
cba0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
cbb0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64  rMsg(pParse, "%d
cbc0: 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65   columns assigne
cbd0: 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20  d %d values",.  
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbf0: 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c    pColumns->nId,
cc00: 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65   n);.    goto ve
cc10: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
cc20: 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  r;.  }..  for(i=
cc30: 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73 2d 3e 6e  0; i<pColumns->n
cc40: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  Id; i++){.    Ex
cc50: 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20 73  pr *pSubExpr = s
cc60: 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63  qlite3ExprForVec
cc70: 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65 2c  torField(pParse,
cc80: 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20 20   pExpr, i);.    
cc90: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
cca0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
ccb0: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53 75  arse, pList, pSu
ccc0: 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  bExpr);.    if( 
ccd0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61  pList ){.      a
cce0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
ccf0: 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31 20  xpr==iFirst+i+1 
cd00: 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  );.      pList->
cd10: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
cd20: 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75 6d  ].zName = pColum
cd30: 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  ns->a[i].zName;.
cd40: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e        pColumns->
cd50: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[i].zName = 0;.
cd60: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
cd70: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
cd80: 65 64 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d  ed && pExpr->op=
cd90: 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 41 4c  =TK_SELECT && AL
cda0: 57 41 59 53 28 70 4c 69 73 74 21 3d 30 29 20 29  WAYS(pList!=0) )
cdb0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 46 69 72  {.    Expr *pFir
cdc0: 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 46  st = pList->a[iF
cdd0: 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a 20 20 20  irst].pExpr;.   
cde0: 20 61 73 73 65 72 74 28 20 70 46 69 72 73 74 21   assert( pFirst!
cdf0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
ce00: 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d 3d 54 4b  ( pFirst->op==TK
ce10: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
ce20: 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53  ;.     .    /* S
ce30: 74 6f 72 65 20 74 68 65 20 53 45 4c 45 43 54 20  tore the SELECT 
ce40: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 70 52 69  statement in pRi
ce50: 67 68 74 20 73 6f 20 69 74 20 77 69 6c 6c 20 62  ght so it will b
ce60: 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 0a 20  e deleted when. 
ce70: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70     ** sqlite3Exp
ce80: 72 4c 69 73 74 44 65 6c 65 74 65 28 29 20 69 73  rListDelete() is
ce90: 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 70   called */.    p
cea0: 46 69 72 73 74 2d 3e 70 52 69 67 68 74 20 3d 20  First->pRight = 
ceb0: 70 45 78 70 72 3b 0a 20 20 20 20 70 45 78 70 72  pExpr;.    pExpr
cec0: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65   = 0;..    /* Re
ced0: 6d 65 6d 62 65 72 20 74 68 65 20 73 69 7a 65 20  member the size 
cee0: 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 69 54  of the LHS in iT
cef0: 61 62 6c 65 20 73 6f 20 74 68 61 74 20 77 65 20  able so that we 
cf00: 63 61 6e 20 63 68 65 63 6b 20 74 68 61 74 0a 20  can check that. 
cf10: 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20 61 6e     ** the RHS an
cf20: 64 20 4c 48 53 20 73 69 7a 65 73 20 6d 61 74 63  d LHS sizes matc
cf30: 68 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65  h during code ge
cf40: 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  neration. */.   
cf50: 20 70 46 69 72 73 74 2d 3e 69 54 61 62 6c 65 20   pFirst->iTable 
cf60: 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b  = pColumns->nId;
cf70: 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f 61 70 70  .  }..vector_app
cf80: 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c  end_error:.  sql
cf90: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
cfa0: 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c  b, pExpr);.  sql
cfb0: 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
cfc0: 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a  (db, pColumns);.
cfd0: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
cfe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
cff0: 20 73 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20   sort order for 
d000: 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74  the last element
d010: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 45 78   on the given Ex
d020: 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  prList..*/.void 
d030: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
d040: 65 74 53 6f 72 74 4f 72 64 65 72 28 45 78 70 72  etSortOrder(Expr
d050: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f  List *p, int iSo
d060: 72 74 4f 72 64 65 72 29 7b 0a 20 20 69 66 28 20  rtOrder){.  if( 
d070: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
d080: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
d090: 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30 20 26  SO_UNDEFINED<0 &
d0a0: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3e  & SQLITE_SO_ASC>
d0b0: 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f  =0 && SQLITE_SO_
d0c0: 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73 73 65  DESC>0 );.  asse
d0d0: 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29  rt( p->nExpr>0 )
d0e0: 3b 0a 20 20 69 66 28 20 69 53 6f 72 74 4f 72 64  ;.  if( iSortOrd
d0f0: 65 72 3c 30 20 29 7b 0a 20 20 20 20 61 73 73 65  er<0 ){.    asse
d100: 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70  rt( p->a[p->nExp
d110: 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 3d 3d  r-1].sortOrder==
d120: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 3b  SQLITE_SO_ASC );
d130: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
d140: 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  .  p->a[p->nExpr
d150: 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  -1].sortOrder = 
d160: 28 75 38 29 69 53 6f 72 74 4f 72 64 65 72 3b 0a  (u8)iSortOrder;.
d170: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
d180: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e   ExprList.a[].zN
d190: 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ame element of t
d1a0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
d1b0: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
d1c0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
d1d0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
d1e0: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
d1f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
d200: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e  M error.  But pN
d210: 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  ame should never
d220: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
d230: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
d240: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
d250: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
d260: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
d270: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
d280: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d290: 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  SetName(.  Parse
d2a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d2b0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
d2c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
d2d0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
d2e0: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
d2f0: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
d300: 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pan. */.  Token 
d310: 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
d320: 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20    /* Name to be 
d330: 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  added */.  int d
d340: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
d350: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61     /* True to ca
d360: 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20  use the name to 
d370: 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29  be dequoted */.)
d380: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  {.  assert( pLis
d390: 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  t!=0 || pParse->
d3a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d3b0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
d3c0: 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
d3d0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
d3e0: 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72  pItem;.    asser
d3f0: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
d400: 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d  0 );.    pItem =
d410: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
d420: 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
d430: 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a  assert( pItem->z
d440: 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
d450: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
d460: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
d470: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
d480: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
d490: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
d4a0: 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65  ) sqlite3Dequote
d4b0: 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pItem->zName);.
d4c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
d4d0: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
d4e0: 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20  ].zSpan element 
d4f0: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
d500: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
d510: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
d520: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
d530: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
d540: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
d550: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
d560: 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e  t pSpan should n
d570: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
d580: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
d590: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
d5a0: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
d5b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
d5c0: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
d5d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
d5e0: 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50  ListSetSpan(.  P
d5f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d600: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
d610: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
d620: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
d630: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
d640: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
d650: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78  he span. */.  Ex
d660: 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20  prSpan *pSpan   
d670: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61        /* The spa
d680: 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  n to be added */
d690: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
d6a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
d6b0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
d6c0: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
d6d0: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
d6e0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
d6f0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
d700: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
d710: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
d720: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
d730: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
d740: 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r>0 );.    asser
d750: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
d760: 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45  led || pItem->pE
d770: 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70  xpr==pSpan->pExp
d780: 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
d790: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
d7a0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
d7b0: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
d7c0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
d7d0: 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e  , (char*)pSpan->
d7e0: 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20  zStart,.        
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
d810: 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20  )(pSpan->zEnd - 
d820: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b  pSpan->zStart));
d830: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
d840: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
d850: 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74  list pEList cont
d860: 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69  ains more than i
d870: 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a  Limit elements,.
d880: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
d890: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
d8a0: 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rse..*/.void sql
d8b0: 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
d8c0: 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65  kLength(.  Parse
d8d0: 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72   *pParse,.  Expr
d8e0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20  List *pEList,.  
d8f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a  const char *zObj
d900: 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20  ect.){.  int mx 
d910: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
d920: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
d930: 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73  T_COLUMN];.  tes
d940: 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26  tcase( pEList &&
d950: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
d960: 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  mx );.  testcase
d970: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
d980: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20  st->nExpr==mx+1 
d990: 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
d9a0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
d9b0: 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >mx ){.    sqlit
d9c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d9d0: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
d9e0: 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62  umns in %s", zOb
d9f0: 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ject);.  }.}../*
da00: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
da10: 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tire expression 
da20: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
da30: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
da40: 76 6f 69 64 20 65 78 70 72 4c 69 73 74 44 65 6c  void exprListDel
da50: 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64  eteNN(sqlite3 *d
da60: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
da70: 73 74 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70  st){.  int i = p
da80: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73  List->nExpr;.  s
da90: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
daa0: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 20 70 4c  tem *pItem =  pL
dab0: 69 73 74 2d 3e 61 3b 0a 20 20 61 73 73 65 72 74  ist->a;.  assert
dac0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
dad0: 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71   );.  do{.    sq
dae0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
daf0: 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  db, pItem->pExpr
db00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
db10: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
db20: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
db30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
db40: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20  tem->zSpan);.   
db50: 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 7d 77 68 69   pItem++;.  }whi
db60: 6c 65 28 20 2d 2d 69 3e 30 20 29 3b 0a 20 20 73  le( --i>0 );.  s
db70: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
db80: 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69  b, pList);.}.voi
db90: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
dba0: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
dbb0: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
dbc0: 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69  List){.  if( pLi
dbd0: 73 74 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c  st ) exprListDel
dbe0: 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29  eteNN(db, pList)
dbf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
dc00: 6e 20 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52  n the bitwise-OR
dc10: 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61   of all Expr.fla
dc20: 67 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  gs fields in the
dc30: 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69   given.** ExprLi
dc40: 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  st..*/.u32 sqlit
dc50: 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28  e3ExprListFlags(
dc60: 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a  const ExprList *
dc70: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
dc80: 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20  .  u32 m = 0;.  
dc90: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
dca0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
dcb0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
dcc0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
dcd0: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
dce0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 61  .pExpr;.       a
dcf0: 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
dd00: 29 3b 0a 20 20 20 20 20 20 20 6d 20 7c 3d 20 70  );.       m |= p
dd10: 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  Expr->flags;.   
dd20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
dd30: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  m;.}../*.** Thes
dd40: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57  e routines are W
dd50: 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20  alker callbacks 
dd60: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78  used to check ex
dd70: 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20  pressions to.** 
dd80: 73 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20  see if they are 
dd90: 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73  "constant" for s
dda0: 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ome definition o
ddb0: 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65  f constant.  The
ddc0: 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  .** Walker.eCode
ddd0: 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65   value determine
dde0: 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63  s the type of "c
ddf0: 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20  onstant" we are 
de00: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a  looking.** for..
de10: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
de20: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
de30: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
de40: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
de50: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
de60: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
de70: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
de80: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
de90: 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73  Code==1.**     s
dea0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
deb0: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20  tantNotJoin()   
dec0: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
ded0: 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20  >eCode==2.**    
dee0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
def0: 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20  bleConstant()   
df00: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
df10: 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20  r->eCode==3.**  
df20: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
df30: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
df40: 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c  on()        pWal
df50: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72  ker->eCode==4 or
df60: 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20   5.**.** In all 
df70: 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62  cases, the callb
df80: 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e  acks set Walker.
df90: 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72  eCode=0 and abor
dfa0: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
dfb0: 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20  ion.** is found 
dfc0: 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73  to not be a cons
dfd0: 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tant..**.** The 
dfe0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
dff0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
e000: 29 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76  ) is used for ev
e010: 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73  aluating express
e020: 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45  ions.** in a CRE
e030: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
e040: 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72  ent.  The Walker
e050: 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20  .eCode value is 
e060: 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a  5 when parsing.*
e070: 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63  * an existing sc
e080: 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20  hema and 4 when 
e090: 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77  processing a new
e0a0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62   statement.  A b
e0b0: 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
e0c0: 72 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f  r raises an erro
e0d0: 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d  r for new statem
e0e0: 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c  ents, but is sil
e0f0: 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a  ently converted.
e100: 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65  ** to NULL for e
e110: 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e  xisting schemas.
e120: 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71    This allows sq
e130: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
e140: 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74  es that .** cont
e150: 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61  ain a bound para
e160: 6d 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68  meter because th
e170: 65 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65  ey were generate
e180: 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
e190: 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
e1a0: 20 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79   to be parsed by
e1b0: 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
e1c0: 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75  of SQLite withou
e1d0: 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d  t raising a.** m
e1e0: 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20  alformed schema 
e1f0: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
e200: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
e210: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
e220: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
e230: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
e240: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69  pWalker->eCode i
e250: 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 2 then any ter
e260: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
e270: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
e280: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
e290: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
e2a0: 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20   of a left join 
e2b0: 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65  disqualifies the
e2c0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
e2d0: 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73   from being cons
e2e0: 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e  idered constant.
e2f0: 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65   */.  if( pWalke
e300: 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45  r->eCode==2 && E
e310: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
e320: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
e330: 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  n) ){.    pWalke
e340: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
e350: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
e360: 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rt;.  }..  switc
e370: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
e380: 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
e390: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  functions to be 
e3a0: 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20  constant if all 
e3b0: 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20  their arguments 
e3c0: 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20  are constant.   
e3d0: 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70   ** and either p
e3e0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
e3f0: 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e   or 5 or the fun
e400: 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20  ction has the.  
e410: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43    ** SQLITE_FUNC
e420: 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a  _CONST flag. */.
e430: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
e440: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  TION:.      if( 
e450: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d  pWalker->eCode>=
e460: 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  4 || ExprHasProp
e470: 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f  erty(pExpr,EP_Co
e480: 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  nstFunc) ){.    
e490: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
e4a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
e4b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57  else{.        pW
e4c0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
e4d0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e4e0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
e4f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
e500: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
e510: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
e520: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
e530: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
e540: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  G_COLUMN:.      
e550: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
e560: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
e570: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
e580: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
e590: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
e5a0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
e5b0: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
e5c0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e5d0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
e5e0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
e5f0: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
e600: 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70  r->eCode==3 && p
e610: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
e620: 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b  alker->u.iCur ){
e630: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e640: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
e650: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
e660: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
e670: 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55     case TK_IF_NU
e680: 4c 4c 5f 52 4f 57 3a 0a 20 20 20 20 20 20 74 65  LL_ROW:.      te
e690: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
e6a0: 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
e6b0: 57 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b  W );.      pWalk
e6c0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
e6d0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
e6e0: 41 62 6f 72 74 3b 0a 20 20 20 20 63 61 73 65 20  Abort;.    case 
e6f0: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20  TK_VARIABLE:.   
e700: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
e710: 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20  eCode==5 ){.    
e720: 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20      /* Silently 
e730: 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61  convert bound pa
e740: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70  rameters that ap
e750: 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43  pear inside of C
e760: 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a  REATE.        **
e770: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f   statements into
e780: 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72   a NULL when par
e790: 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20  sing the CREATE 
e7a0: 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f  statement text o
e7b0: 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ut.        ** of
e7c0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e7d0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
e7e0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
e7f0: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TK_NULL;.      }
e800: 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72  else if( pWalker
e810: 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20  ->eCode==4 ){.  
e820: 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64        /* A bound
e830: 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20   parameter in a 
e840: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
e850: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
e860: 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a   from.        **
e870: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
e880: 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72  () causes an err
e890: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57  or */.        pW
e8a0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
e8b0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e8c0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
e8d0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
e8e0: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
e8f0: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
e900: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
e910: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
e920: 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49  ; /* selectNodeI
e930: 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64  sConstant will d
e940: 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  isallow */.     
e950: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
e960: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
e970: 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65  ); /* selectNode
e980: 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20  IsConstant will 
e990: 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  disallow */.    
e9a0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
e9b0: 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61  tinue;.  }.}.sta
e9c0: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f  tic int selectNo
e9d0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c  deIsConstant(Wal
e9e0: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
e9f0: 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  lect *NotUsed){.
ea00: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
ea10: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70  ER(NotUsed);.  p
ea20: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
ea30: 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
ea40: 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20  Abort;.}.static 
ea50: 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28  int exprIsConst(
ea60: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69  Expr *p, int ini
ea70: 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72 29  tFlag, int iCur)
ea80: 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
ea90: 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c  w.eCode = initFl
eaa0: 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ag;.  w.xExprCal
eab0: 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
eac0: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e  IsConstant;.  w.
ead0: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
eae0: 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  = selectNodeIsCo
eaf0: 6e 73 74 61 6e 74 3b 0a 23 69 66 64 65 66 20 53  nstant;.#ifdef S
eb00: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77 2e  QLITE_DEBUG.  w.
eb10: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
eb20: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
eb30: 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e  WalkAssert2;.#en
eb40: 64 69 66 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d  dif.  w.u.iCur =
eb50: 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33   iCur;.  sqlite3
eb60: 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
eb70: 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
eb80: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  e;.}../*.** Walk
eb90: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
eba0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
ebb0: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
ebc0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
ebd0: 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
ebe0: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
ebf0: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
ec00: 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46  n calls..**.** F
ec10: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
ec20: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
ec30: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
ec40: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
ec50: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
ec60: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
ec70: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
ec80: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
ec90: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
eca0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
ecb0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
ecc0: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
ecd0: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
ece0: 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a  Const(p, 1, 0);.
ecf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
ed00: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
ed10: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
ed20: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
ed30: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
ed40: 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  .** that does no
ed50: 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20   originate from 
ed60: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
ed70: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69  clauses of a joi
ed80: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  n..** Return 0 i
ed90: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
eda0: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
edb0: 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72  ion calls or ter
edc0: 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e  ms from.** an ON
edd0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
ede0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
edf0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
ee00: 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a  tJoin(Expr *p){.
ee10: 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
ee20: 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d  onst(p, 2, 0);.}
ee30: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
ee40: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
ee50: 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
ee60: 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
ee70: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
ee80: 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c  ** for any singl
ee90: 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62  e row of the tab
eea0: 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
eeb0: 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  Cur.  In other w
eec0: 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70  ords, the.** exp
eed0: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74  ression must not
eee0: 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f   refer to any no
eef0: 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
ef00: 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79  function nor any
ef10: 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20  .** table other 
ef20: 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e  than iCur..*/.in
ef30: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  t sqlite3ExprIsT
ef40: 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70  ableConstant(Exp
ef50: 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b  r *p, int iCur){
ef60: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
ef70: 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72  Const(p, 3, iCur
ef80: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  );.}.../*.** sql
ef90: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63  ite3WalkExpr() c
efa0: 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
efb0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
efc0: 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 29  stantOrGroupBy()
efd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
efe0: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
eff0: 6e 74 4f 72 47 72 6f 75 70 42 79 28 57 61 6c 6b  ntOrGroupBy(Walk
f000: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
f010: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70  r *pExpr){.  Exp
f020: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20  rList *pGroupBy 
f030: 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 47 72  = pWalker->u.pGr
f040: 6f 75 70 42 79 3b 0a 20 20 69 6e 74 20 69 3b 0a  oupBy;.  int i;.
f050: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70  .  /* Check if p
f060: 45 78 70 72 20 69 73 20 69 64 65 6e 74 69 63 61  Expr is identica
f070: 6c 20 74 6f 20 61 6e 79 20 47 52 4f 55 50 20 42  l to any GROUP B
f080: 59 20 74 65 72 6d 2e 20 49 66 20 73 6f 2c 20 63  Y term. If so, c
f090: 6f 6e 73 69 64 65 72 0a 20 20 2a 2a 20 69 74 20  onsider.  ** it 
f0a0: 63 6f 6e 73 74 61 6e 74 2e 20 20 2a 2f 0a 20 20  constant.  */.  
f0b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
f0c0: 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
f0d0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
f0e0: 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
f0f0: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71  Expr;.    if( sq
f100: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
f110: 28 30 2c 20 70 45 78 70 72 2c 20 70 2c 20 2d 31  (0, pExpr, p, -1
f120: 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  )<2 ){.      Col
f130: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
f140: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
f150: 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65  (pWalker->pParse
f160: 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , p);.      if( 
f170: 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 73 71 6c 69  pColl==0 || sqli
f180: 74 65 33 5f 73 74 72 69 63 6d 70 28 22 42 49 4e  te3_stricmp("BIN
f190: 41 52 59 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  ARY", pColl->zNa
f1a0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
f1b0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
f1c0: 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
f1d0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
f1e0: 6b 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  k if pExpr is a 
f1f0: 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 66 20 73  sub-select. If s
f200: 6f 2c 20 63 6f 6e 73 69 64 65 72 20 69 74 20 76  o, consider it v
f210: 61 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66  ariable. */.  if
f220: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
f230: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
f240: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 57  elect) ){.    pW
f250: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
f260: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
f270: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 72  _Abort;.  }..  r
f280: 65 74 75 72 6e 20 65 78 70 72 4e 6f 64 65 49 73  eturn exprNodeIs
f290: 43 6f 6e 73 74 61 6e 74 28 70 57 61 6c 6b 65 72  Constant(pWalker
f2a0: 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
f2b0: 2a 2a 20 57 61 6c 6b 20 74 68 65 20 65 78 70 72  ** Walk the expr
f2c0: 65 73 73 69 6f 6e 20 74 72 65 65 20 70 61 73 73  ession tree pass
f2d0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
f2e0: 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e  argument. Return
f2f0: 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 66 20   non-zero.** if 
f300: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
f310: 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
f320: 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 6f 72   of constants or
f330: 20 63 6f 70 69 65 73 20 6f 66 20 74 65 72 6d 73   copies of terms
f340: 20 0a 2a 2a 20 69 6e 20 70 47 72 6f 75 70 42 79   .** in pGroupBy
f350: 20 74 68 61 74 20 73 6f 72 74 20 77 69 74 68 20   that sort with 
f360: 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  the BINARY colla
f370: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a  tion sequence..*
f380: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f390: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
f3a0: 65 72 6d 69 6e 65 20 69 66 20 61 20 74 65 72 6d  ermine if a term
f3b0: 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 63   of the HAVING c
f3c0: 6c 61 75 73 65 20 63 61 6e 0a 2a 2a 20 62 65 20  lause can.** be 
f3d0: 70 72 6f 6d 6f 74 65 64 20 69 6e 74 6f 20 74 68  promoted into th
f3e0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
f3f0: 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 73 75   In order for su
f400: 63 68 20 61 20 70 72 6f 6d 6f 74 69 6f 6e 20 74  ch a promotion t
f410: 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74 68 65 20 76  o work,.** the v
f420: 61 6c 75 65 20 6f 66 20 74 68 65 20 48 41 56 49  alue of the HAVI
f430: 4e 47 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6d  NG clause term m
f440: 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
f450: 66 6f 72 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20  for all members 
f460: 6f 66 0a 2a 2a 20 61 20 22 67 72 6f 75 70 22 2e  of.** a "group".
f470: 20 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e    The requiremen
f480: 74 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50  t that the GROUP
f490: 20 42 59 20 74 65 72 6d 20 6d 75 73 74 20 62 65   BY term must be
f4a0: 20 42 49 4e 41 52 59 0a 2a 2a 20 61 73 73 75 6d   BINARY.** assum
f4b0: 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
f4c0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
f4d0: 6e 63 65 20 77 69 6c 6c 20 68 61 76 65 20 61 20  nce will have a 
f4e0: 66 69 6e 65 72 2d 67 72 61 69 6e 65 64 0a 2a 2a  finer-grained.**
f4f0: 20 67 72 6f 75 70 69 6e 67 20 74 68 61 6e 20 62   grouping than b
f500: 69 6e 61 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  inary.  In other
f510: 20 77 6f 72 64 73 20 28 41 3d 42 20 43 4f 4c 4c   words (A=B COLL
f520: 41 54 45 20 62 69 6e 61 72 79 29 20 69 6d 70 6c  ATE binary) impl
f530: 69 65 73 0a 2a 2a 20 41 3d 42 20 69 6e 20 65 76  ies.** A=B in ev
f540: 65 72 79 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74  ery other collat
f550: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 54  ing sequence.  T
f560: 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74  he requirement t
f570: 68 61 74 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50  hat the.** GROUP
f580: 20 42 59 20 62 65 20 42 49 4e 41 52 59 20 69 73   BY be BINARY is
f590: 20 73 74 72 69 63 74 65 72 20 74 68 61 6e 20 6e   stricter than n
f5a0: 65 63 65 73 73 61 72 79 2e 20 20 49 74 20 77 6f  ecessary.  It wo
f5b0: 75 6c 64 20 61 6c 73 6f 20 77 6f 72 6b 0a 2a 2a  uld also work.**
f5c0: 20 74 6f 20 70 72 6f 6d 6f 74 65 20 48 41 56 49   to promote HAVI
f5d0: 4e 47 20 63 6c 61 75 73 65 73 20 74 68 61 74 20  NG clauses that 
f5e0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 61 6c 74  use the same alt
f5f0: 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
f600: 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 61  ng.** sequence a
f610: 73 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  s the GROUP BY t
f620: 65 72 6d 2c 20 62 75 74 20 74 68 61 74 20 69 73  erm, but that is
f630: 20 6d 75 63 68 20 68 61 72 64 65 72 20 74 6f 20   much harder to 
f640: 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c 74 65 72 6e  check,.** altern
f650: 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
f660: 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 75 6e  sequences are un
f670: 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68 69 73  common, and this
f680: 20 69 73 20 6f 6e 6c 79 20 61 6e 0a 2a 2a 20 6f   is only an.** o
f690: 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 73 6f 20  ptimization, so 
f6a0: 77 65 20 74 61 6b 65 20 74 68 65 20 65 61 73 79  we take the easy
f6b0: 20 77 61 79 20 6f 75 74 20 61 6e 64 20 73 69 6d   way out and sim
f6c0: 70 6c 79 20 72 65 71 75 69 72 65 20 74 68 65 0a  ply require the.
f6d0: 2a 2a 20 47 52 4f 55 50 20 42 59 20 74 6f 20 75  ** GROUP BY to u
f6e0: 73 65 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f  se the BINARY co
f6f0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f700: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f710: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
f720: 47 72 6f 75 70 42 79 28 50 61 72 73 65 20 2a 70  GroupBy(Parse *p
f730: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20  Parse, Expr *p, 
f740: 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
f750: 42 79 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  By){.  Walker w;
f760: 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a  .  w.eCode = 1;.
f770: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
f780: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
f790: 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 3b  nstantOrGroupBy;
f7a0: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
f7b0: 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  back = 0;.  w.u.
f7c0: 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
f7d0: 70 42 79 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  pBy;.  w.pParse 
f7e0: 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
f7f0: 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
f800: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
f810: 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Code;.}../*.** W
f820: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
f830: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
f840: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
f850: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
f860: 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66  nstant.** or a f
f870: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74  unction call wit
f880: 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  h constant argum
f890: 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e  ents.  Return an
f8a0: 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  d 0 if there.** 
f8b0: 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65  are any variable
f8c0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
f8d0: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
f8e0: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
f8f0: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
f900: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
f910: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
f920: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
f930: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
f940: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
f950: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
f960: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
f970: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
f980: 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20  OrFunction(Expr 
f990: 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a  *p, u8 isInit){.
f9a0: 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69 74    assert( isInit
f9b0: 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31  ==0 || isInit==1
f9c0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70   );.  return exp
f9d0: 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73  rIsConst(p, 4+is
f9e0: 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66  Init, 0);.}..#if
f9f0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
fa00: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f  E_CURSOR_HINTS./
fa10: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
fa20: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
fa30: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
fa40: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
fa50: 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79  ns a.** subquery
fa60: 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
fa70: 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  Return 0 if ther
fa80: 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72  e are no subquer
fa90: 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ies..*/.int sqli
faa0: 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53  te3ExprContainsS
fab0: 75 62 71 75 65 72 79 28 45 78 70 72 20 2a 70 29  ubquery(Expr *p)
fac0: 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
fad0: 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77  w.eCode = 1;.  w
fae0: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
faf0: 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
fb00: 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63  Noop;.  w.xSelec
fb10: 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65  tCallback = sele
fb20: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
fb30: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
fb40: 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63  DEBUG.  w.xSelec
fb50: 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c  tCallback2 = sql
fb60: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73  ite3SelectWalkAs
fb70: 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20  sert2;.#endif.  
fb80: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
fb90: 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
fba0: 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23   w.eCode==0;.}.#
fbb0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
fbc0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
fbd0: 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e   codes a constan
fbe0: 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69  t integer that i
fbf0: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a  s small enough.*
fc00: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32  * to fit in a 32
fc10: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65  -bit integer, re
fc20: 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74  turn 1 and put t
fc30: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
fc40: 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70  integer.** in *p
fc50: 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65  Value.  If the e
fc60: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
fc70: 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69   an integer or i
fc80: 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a  f it is too big.
fc90: 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73  ** to fit in a s
fca0: 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74  igned 32-bit int
fcb0: 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61  eger, return 0 a
fcc0: 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65  nd leave *pValue
fcd0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
fce0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
fcf0: 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c  Integer(Expr *p,
fd00: 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20   int *pValue){. 
fd10: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69   int rc = 0;.  i
fd20: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
fd30: 20 30 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79   0;  /* Can only
fd40: 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e   happen followin
fd50: 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f  g on OOM */..  /
fd60: 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69  * If an expressi
fd70: 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  on is an integer
fd80: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69   literal that fi
fd90: 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  ts in a signed 3
fda0: 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67  2-bit.  ** integ
fdb0: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f  er, then the EP_
fdc0: 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69  IntValue flag wi
fdd0: 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
fde0: 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73  been set */.  as
fdf0: 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
fe00: 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66  INTEGER || (p->f
fe10: 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
fe20: 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ue)!=0.         
fe30: 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49    || sqlite3GetI
fe40: 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  nt32(p->u.zToken
fe50: 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20  , &rc)==0 );..  
fe60: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
fe70: 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
fe80: 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75    *pValue = p->u
fe90: 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74  .iValue;.    ret
fea0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69  urn 1;.  }.  swi
feb0: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
fec0: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
fed0: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
fee0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
fef0: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61  er(p->pLeft, pVa
ff00: 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
ff10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
ff20: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
ff30: 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20       int v;.    
ff40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
ff50: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
ff60: 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  eft, &v) ){.    
ff70: 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28      assert( v!=(
ff80: 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29 20 29  -2147483647-1) )
ff90: 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75  ;.        *pValu
ffa0: 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20  e = -v;.        
ffb0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
ffc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ffd0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
ffe0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
fff0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10000 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
10010 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
10020 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70  nce that the exp
10030 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e  ression can be N
10040 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ULL..**.** If th
10050 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67  e expression mig
10060 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66  ht be NULL or if
10070 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10080 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a  is too complex.*
10090 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e  * to tell return
100a0 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54   TRUE.  .**.** T
100b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
100c0 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69  sed as an optimi
100d0 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20  zation, to skip 
100e0 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65  OP_IsNull opcode
100f0 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f  s.** when we kno
10100 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63  w that a value c
10110 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20  annot be NULL.  
10120 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70  Hence, a false p
10130 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75  ositive.** (retu
10140 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20  rning TRUE when 
10150 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72  in fact the expr
10160 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72  ession can never
10170 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a   be NULL) might.
10180 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65  ** be a small pe
10190 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75  rformance hit bu
101a0 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68  t is otherwise h
101b0 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65  armless.  On the
101c0 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20   other.** hand, 
101d0 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  a false negative
101e0 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53   (returning FALS
101f0 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  E when the resul
10200 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29  t could be NULL)
10210 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  .** will likely 
10220 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
10230 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20  orrect answer.  
10240 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74  So when in doubt
10250 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45  , return.** TRUE
10260 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10270 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f  ExprCanBeNull(co
10280 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  nst Expr *p){.  
10290 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20  u8 op;.  while( 
102a0 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
102b0 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
102c0 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c  NUS ){ p = p->pL
102d0 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  eft; }.  op = p-
102e0 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
102f0 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
10300 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
10310 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
10320 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20  se TK_INTEGER:. 
10330 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
10340 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  G:.    case TK_F
10350 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LOAT:.    case T
10360 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65  K_BLOB:.      re
10370 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65  turn 0;.    case
10380 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
10390 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61    assert( p->pTa
103a0 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65  b!=0 );.      re
103b0 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70  turn ExprHasProp
103c0 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65  erty(p, EP_CanBe
103d0 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20  Null) ||.       
103e0 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d        (p->iColum
103f0 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61 62 2d  n>=0 && p->pTab-
10400 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e  >aCol[p->iColumn
10410 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20  ].notNull==0);. 
10420 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
10430 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
10440 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
10450 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
10460 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
10470 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68  a constant which
10480 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63   would be.** unc
10490 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66  hanged by OP_Aff
104a0 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61  inity with the a
104b0 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e  ffinity given in
104c0 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   the second.** a
104d0 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
104e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
104f0 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
10500 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e   if the OP_Affin
10510 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  ity operation.**
10520 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e   can be omitted.
10530 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20    When in doubt 
10540 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41  return FALSE.  A
10550 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a   false negative.
10560 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20  ** is harmless. 
10570 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   A false positiv
10580 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20  e, however, can 
10590 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72  result in the wr
105a0 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a  ong.** answer..*
105b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
105c0 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
105d0 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70  Change(const Exp
105e0 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b  r *p, char aff){
105f0 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20  .  u8 op;.  if( 
10600 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
10610 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b  BLOB ) return 1;
10620 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
10630 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e  =TK_UPLUS || p->
10640 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b  op==TK_UMINUS ){
10650 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d   p = p->pLeft; }
10660 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
10670 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
10680 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
10690 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
106a0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
106b0 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
106c0 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
106d0 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
106e0 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
106f0 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
10700 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  }.    case TK_FL
10710 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  OAT: {.      ret
10720 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
10730 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d  AFF_REAL || aff=
10740 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
10750 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  RIC;.    }.    c
10760 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
10770 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
10780 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f==SQLITE_AFF_TE
10790 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  XT;.    }.    ca
107a0 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
107b0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
107c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
107d0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
107e0 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c  assert( p->iTabl
107f0 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61  e>=0 );  /* p ca
10800 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20  nnot be part of 
10810 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  a CHECK constrai
10820 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  nt */.      retu
10830 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a  rn p->iColumn<0.
10840 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66            && (af
10850 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
10860 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51  TEGER || aff==SQ
10870 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
10880 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  );.    }.    def
10890 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65  ault: {.      re
108a0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
108b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
108c0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
108d0 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20  ven string is a 
108e0 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61  row-id column na
108f0 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  me..*/.int sqlit
10900 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20  e3IsRowid(const 
10910 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20  char *z){.  if( 
10920 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
10930 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20  , "_ROWID_")==0 
10940 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
10950 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
10960 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20  (z, "ROWID")==0 
10970 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
10980 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
10990 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20  (z, "OID")==0 ) 
109a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
109b0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  rn 0;.}../*.** p
109c0 58 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20  X is the RHS of 
109d0 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20  an IN operator. 
109e0 20 49 66 20 70 58 20 69 73 20 61 20 53 45 4c 45   If pX is a SELE
109f0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  CT statement .**
10a00 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 69 6d   that can be sim
10a10 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69 72  plified to a dir
10a20 65 63 74 20 74 61 62 6c 65 20 61 63 63 65 73 73  ect table access
10a30 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a  , then return.**
10a40 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
10a50 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
10a60 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e 6f  nt.  If pX is no
10a70 74 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  t a SELECT state
10a80 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74  ment,.** or if t
10a90 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
10aa0 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ent needs to be 
10ab0 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f 20  manifested into 
10ac0 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74  a transient.** t
10ad0 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75 72  able, then retur
10ae0 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64  n NULL..*/.#ifnd
10af0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
10b00 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 53  UBQUERY.static S
10b10 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61  elect *isCandida
10b20 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20  teForInOpt(Expr 
10b30 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  *pX){.  Select *
10b40 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  p;.  SrcList *pS
10b50 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc;.  ExprList *
10b60 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
10b70 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pTab;.  int i;.
10b80 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
10b90 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
10ba0 73 53 65 6c 65 63 74 29 20 29 20 72 65 74 75 72  sSelect) ) retur
10bb0 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 73  n 0;  /* Not a s
10bc0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28  ubquery */.  if(
10bd0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
10be0 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  (pX, EP_VarSelec
10bf0 74 29 20 20 29 20 72 65 74 75 72 6e 20 30 3b 20  t)  ) return 0; 
10c00 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20 73   /* Correlated s
10c10 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d  ubq */.  p = pX-
10c20 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66  >x.pSelect;.  if
10c30 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65  ( p->pPrior ) re
10c40 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
10c50 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f       /* Not a co
10c60 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f  mpound SELECT */
10c70 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
10c80 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
10c90 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20  t|SF_Aggregate) 
10ca0 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ){.    testcase(
10cb0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
10cc0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
10cd0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
10ce0 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
10cf0 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65  testcase( (p->se
10d00 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
10d10 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
10d20 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61  te))==SF_Aggrega
10d30 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  te );.    return
10d40 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e   0; /* No DISTIN
10d50 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e  CT keyword and n
10d60 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  o aggregate func
10d70 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61  tions */.  }.  a
10d80 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
10d90 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  By==0 );        
10da0 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
10db0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
10dc0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  */.  if( p->pLim
10dd0 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
10de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
10df0 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75  as no LIMIT clau
10e00 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
10e10 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10e30 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73  * No LIMIT means
10e40 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20   no OFFSET */.  
10e50 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20  if( p->pWhere ) 
10e60 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
10e70 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
10e80 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
10e90 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
10ea0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
10eb0 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53  c!=0 );.  if( pS
10ec0 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
10ed0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
10ee0 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20   /* Single term 
10ef0 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
10f00 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b  /.  if( pSrc->a[
10f10 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74  0].pSelect ) ret
10f20 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52  urn 0;     /* FR
10f30 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71  OM is not a subq
10f40 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a  uery or view */.
10f50 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61    pTab = pSrc->a
10f60 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65  [0].pTab;.  asse
10f70 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
10f80 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
10f90 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20  Select==0 );    
10fa0 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
10fb0 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20  clause is not a 
10fc0 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73  view */.  if( Is
10fd0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
10fe0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
10ff0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
11000 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
11010 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  ble */.  pEList 
11020 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61  = p->pEList;.  a
11030 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
11040 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c   );.  /* All SEL
11050 45 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74  ECT results must
11060 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a   be columns. */.
11070 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
11080 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
11090 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73  {.    Expr *pRes
110a0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
110b0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
110c0 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  Res->op!=TK_COLU
110d0 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
110e0 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
110f0 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61  >iTable==pSrc->a
11100 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20  [0].iCursor );  
11110 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61  /* Not a correla
11120 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ted subquery */.
11130 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
11140 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11150 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
11160 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
11170 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
11180 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
11190 20 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b   code that check
111a0 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
111b0 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
111c0 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65  table iCur to se
111d0 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61  e if.** it conta
111e0 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74  ins any NULL ent
111f0 72 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65  ries.  Cause the
11200 20 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67   register at reg
11210 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65  HasNull to be se
11220 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55  t.** to a non-NU
11230 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72  LL value if iCur
11240 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c   contains no NUL
11250 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73  Ls.  Cause regis
11260 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a  ter regHasNull.*
11270 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e  * to be set to N
11280 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74  ULL if iCur cont
11290 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
112a0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f   NULL values..*/
112b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
112c0 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
112d0 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ag(Vdbe *v, int 
112e0 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73  iCur, int regHas
112f0 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64  Null){.  int add
11300 72 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r1;.  sqlite3Vdb
11310 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
11320 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73  teger, 0, regHas
11330 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d  Null);.  addr1 =
11340 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11350 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
11360 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65   iCur); VdbeCove
11370 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
11380 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11390 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c  OP_Column, iCur,
113a0 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b   0, regHasNull);
113b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
113c0 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
113d0 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56  _TYPEOFARG);.  V
113e0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
113f0 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25  first_entry_in(%
11400 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73  d)", iCur));.  s
11410 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
11420 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a  re(v, addr1);.}.
11430 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66  #endif...#ifndef
11440 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
11450 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20  QUERY./*.** The 
11460 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49  argument is an I
11470 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
11480 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
11490 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a  bquery) on the .
114a0 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  ** right-hand si
114b0 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
114c0 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73   if that list is
114d0 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74   constant..*/.st
114e0 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
114f0 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28  InRhsIsConstant(
11500 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78  Expr *pIn){.  Ex
11510 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20  pr *pLHS;.  int 
11520 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21  res;.  assert( !
11530 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
11540 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  pIn, EP_xIsSelec
11550 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70  t) );.  pLHS = p
11560 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e  In->pLeft;.  pIn
11570 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72  ->pLeft = 0;.  r
11580 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  es = sqlite3Expr
11590 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b  IsConstant(pIn);
115a0 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
115b0 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72  pLHS;.  return r
115c0 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  es;.}.#endif../*
115d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
115e0 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
115f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
11600 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20  of the IN (...) 
11610 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65  operator..** The
11620 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73   pX parameter is
11630 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
11640 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
11650 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  e IN operator, w
11660 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
11670 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f   either a list o
11680 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72  f expressions or
11690 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a   a subquery..**.
116a0 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
116b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
116c0 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
116d0 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  a b-tree object 
116e0 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75  that can.** be u
116f0 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65  sed either to te
11700 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  st for membershi
11710 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74  p in the RHS set
11720 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74   or to iterate t
11730 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65  hrough.** all me
11740 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53  mbers of the RHS
11750 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64   set, skipping d
11760 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  uplicates..**.**
11770 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65   A cursor is ope
11780 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65  ned on the b-tre
11790 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  e object that is
117a0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
117b0 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61  IN operator.** a
117c0 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73  nd pX->iTable is
117d0 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
117e0 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72  x of that cursor
117f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
11800 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68  rned value of th
11810 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69  is function indi
11820 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65  cates the b-tree
11830 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77   type, as follow
11840 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e  s:.**.**   IN_IN
11850 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d  DEX_ROWID      -
11860 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
11870 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61  opened on a data
11880 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20  base table..**  
11890 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
118a0 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f  ASC  - The curso
118b0 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
118c0 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
118d0 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
118e0 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54  X_INDEX_DESC - T
118f0 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
11900 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e  ened on a descen
11910 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
11920 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20   IN_INDEX_EPH   
11930 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
11940 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
11950 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61  a specially crea
11960 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ted and.**      
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68     populated eph
11990 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  eremal table..**
119a0 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50     IN_INDEX_NOOP
119b0 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73         - No curs
119c0 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  or was allocated
119d0 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  .  The IN operat
119e0 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20  or must be.**   
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65        implemente
11a10 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20  d as a sequence 
11a20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
11a30 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
11a40 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62  g b-tree might b
11a50 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48  e used if the RH
11a60 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20  S expression pX 
11a70 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73  is a simple.** s
11a80 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a  ubquery such as:
11a90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
11aa0 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f  T <column1>, <co
11ab0 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c  lumn2>... FROM <
11ac0 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20  table>.**.** If 
11ad0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
11ae0 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
11af0 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63  list or a more c
11b00 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c  omplex subquery,
11b10 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65   then.** an ephe
11b20 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68  meral table migh
11b30 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e  t need to be gen
11b40 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
11b50 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20  RHS and then.** 
11b60 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20  pX->iTable made 
11b70 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
11b80 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
11b90 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a  instead of an.**
11ba0 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e   existing table.
11bb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61  .**.** The inFla
11bc0 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73  gs parameter mus
11bd0 74 20 63 6f 6e 74 61 69 6e 20 65 78 61 63 74 6c  t contain exactl
11be0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74  y one of the bit
11bf0 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  s.** IN_INDEX_ME
11c00 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49  MBERSHIP or IN_I
11c10 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66 20 69  NDEX_LOOP.  If i
11c20 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a  nFlags contains.
11c30 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  ** IN_INDEX_MEMB
11c40 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65  ERSHIP, then the
11c50 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
11c60 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
11c70 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65 6d 62  r a.** fast memb
11c80 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57 68  ership test.  Wh
11c90 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  en the IN_INDEX_
11ca0 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c  LOOP bit is set,
11cb0 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64 65 78   the.** IN index
11cc0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
11cd0 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76   loop over all v
11ce0 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48 53  alues of the RHS
11cf0 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20 6f 70   of the.** IN op
11d00 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  erator..**.** Wh
11d10 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  en IN_INDEX_LOOP
11d20 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
11d30 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
11d40 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
11d50 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20  .** through the 
11d60 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65  set members) the
11d70 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73  n the b-tree mus
11d80 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75  t not contain du
11d90 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20  plicates..** An 
11da0 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
11db0 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c  must be used unl
11dc0 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  ess the selected
11dd0 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61   columns are gua
11de0 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
11df0 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72   unique - either
11e00 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
11e10 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
11e20 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a  Y KEY or due to.
11e30 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73  ** a UNIQUE cons
11e40 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e  traint or index.
11e50 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
11e60 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
11e70 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65  is used (and the
11e80 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
11e90 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
11ea0 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
11eb0 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20   tests) then an 
11ec0 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
11ed0 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
11ee0 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73   unless <columns
11ef0 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e  > is a single IN
11f00 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
11f10 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a  Y column or an .
11f20 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  ** index can be 
11f30 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20 73  found with the s
11f40 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e  pecified <column
11f50 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d  s> as its left-m
11f60 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ost..**.** If th
11f70 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  e IN_INDEX_NOOP_
11f80 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  OK and IN_INDEX_
11f90 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62  MEMBERSHIP are b
11fa0 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69  oth set and.** i
11fb0 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
11fc0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
11fd0 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
11fe0 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69  bquery) then thi
11ff0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67  s.** routine mig
12000 68 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63  ht decide that c
12010 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d  reating an ephem
12020 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20  eral b-tree for 
12030 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65  membership.** te
12040 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70  sting is too exp
12050 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72  ensive and retur
12060 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e  n IN_INDEX_NOOP.
12070 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
12080 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  the.** calling r
12090 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d  outine should im
120a0 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f  plement the IN o
120b0 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20  perator using a 
120c0 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45  sequence.** of E
120d0 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73  q or Ne comparis
120e0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  on operations..*
120f0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d  *.** When the b-
12100 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73  tree is being us
12110 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ed for membershi
12120 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c  p tests, the cal
12130 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
12140 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b   might need to k
12150 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
12160 6f 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20  ot the RHS side 
12170 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
12180 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61  or.** contains a
12190 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73   NULL.  If prRhs
121a0 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61  HasNull is not a
121b0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e   NULL pointer an
121c0 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  d .** if there i
121d0 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61  s any chance tha
121e0 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68  t the (...) migh
121f0 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
12200 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e   value at.** run
12210 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67  time, then a reg
12220 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
12230 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73  ed and the regis
12240 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74  ter number writt
12250 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48  en.** to *prRhsH
12260 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65  asNull. If there
12270 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
12280 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e  at the (...) con
12290 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20  tains a.** NULL 
122a0 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52  value, then *prR
122b0 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66  hsHasNull is lef
122c0 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
122d0 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72  ** If a register
122e0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
122f0 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73  d its location s
12300 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48  tored in *prRhsH
12310 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20  asNull, then.** 
12320 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61  the value in tha
12330 74 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20  t register will 
12340 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62  be NULL if the b
12350 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f  -tree contains o
12360 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55  ne or more.** NU
12370 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69  LL values, and i
12380 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e  t will be some n
12390 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66  on-NULL value if
123a0 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74   the b-tree cont
123b0 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20  ains no.** NULL 
123c0 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  values..**.** If
123d0 20 74 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d   the aiMap param
123e0 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  eter is not NULL
123f0 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  , it must point 
12400 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74  to an array cont
12410 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c  aining.** one el
12420 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63  ement for each c
12430 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62  olumn returned b
12440 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  y the SELECT sta
12450 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48  tement on the RH
12460 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e  S.** of the IN(.
12470 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68  ..) operator. Th
12480 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20  e i'th entry of 
12490 74 68 65 20 61 72 72 61 79 20 69 73 20 70 6f 70  the array is pop
124a0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ulated with the.
124b0 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  ** offset of the
124c0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
124d0 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
124e0 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72  'th column retur
124f0 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45  ned by the.** SE
12500 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c  LECT. For exampl
12510 65 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73  e, if the expres
12520 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65  sion and selecte
12530 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a  d index are:.**.
12540 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20  **   (?,?,?) IN 
12550 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20  (SELECT a, b, c 
12560 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52  FROM t1).**   CR
12570 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
12580 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a   t1(b, c, a);.**
12590 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d  .** then aiMap[]
125a0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
125b0 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f  th {2, 0, 1}..*/
125c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
125d0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
125e0 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  t sqlite3FindInI
125f0 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
12600 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
12610 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
12620 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
12630 2a 70 58 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pX,            
12640 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
12650 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
12660 53 29 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  S) of the IN ope
12670 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69  rator */.  u32 i
12680 6e 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  nFlags,         
12690 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45        /* IN_INDE
126a0 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53  X_LOOP, _MEMBERS
126b0 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f  HIP, and/or _NOO
126c0 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  P_OK */.  int *p
126d0 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20  rRhsHasNull,    
126e0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
126f0 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74   holding NULL st
12700 61 74 75 73 2e 20 20 53 65 65 20 6e 6f 74 65 73  atus.  See notes
12710 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70   */.  int *aiMap
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
12740 20 49 6e 64 65 78 20 66 69 65 6c 64 73 20 74 6f   Index fields to
12750 20 52 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a 29   RHS fields */.)
12760 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20  {.  Select *p;  
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
12790 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74  ECT to the right
127a0 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
127b0 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
127c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
127d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
127e0 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e  pe of RHS table.
127f0 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20   IN_INDEX_* */. 
12800 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
12810 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
12820 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
12830 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
12840 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42  e */.  int mustB
12850 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20  eUnique;        
12860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12870 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74  True if RHS must
12880 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20   be unique */.  
12890 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
128a0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
128b0 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ;     /* Virtual
128c0 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
128d0 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  oded */..  asser
128e0 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
128f0 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71   );.  mustBeUniq
12900 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20  ue = (inFlags & 
12910 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d  IN_INDEX_LOOP)!=
12920 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  0;..  /* If the 
12930 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28 2e  RHS of this IN(.
12940 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ..) operator is 
12950 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69 66  a SELECT, and if
12960 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20 2a   it matters .  *
12970 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
12980 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75   the SELECT resu
12990 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  lt contains NULL
129a0 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20 77   values, check w
129b0 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e  hether.  ** or n
129c0 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75 61  ot NULL is actua
129d0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69 74  lly possible (it
129e0 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72   may not be, for
129f0 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20   example, due . 
12a00 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20   ** to NOT NULL 
12a10 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
12a20 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20 6e  he schema). If n
12a30 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
12a40 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a  e possible,.  **
12a50 20 73 65 74 20 70 72 52 68 73 48 61 73 4e 75 6c   set prRhsHasNul
12a60 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63 6f  l to 0 before co
12a70 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20  ntinuing.  */.  
12a80 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
12a90 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73 20 26   && (pX->flags &
12aa0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
12ab0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
12ac0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
12ad0 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  t = pX->x.pSelec
12ae0 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66  t->pEList;.    f
12af0 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
12b00 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12b10 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12b20 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45  ExprCanBeNull(pE
12b30 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
12b40 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
12b50 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45 4c 69  .    if( i==pELi
12b60 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
12b70 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20     prRhsHasNull 
12b80 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
12b90 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
12ba0 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
12bb0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
12bc0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20  can be used to. 
12bd0 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20   ** satisfy the 
12be0 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20  query.  This is 
12bf0 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65  preferable to ge
12c00 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a  nerating a new .
12c10 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74    ** ephemeral t
12c20 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  able.  */.  if( 
12c30 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
12c40 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69 64  && (p = isCandid
12c50 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29 29  ateForInOpt(pX))
12c60 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
12c70 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
12c80 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
12c90 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
12ca0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  nnection */.    
12cb0 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cd0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
12ce0 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
12cf0 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20 20  i16 iDb;        
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d10 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
12d20 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20  se idx for pTab 
12d30 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  */.    ExprList 
12d40 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c  *pEList = p->pEL
12d50 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78  ist;.    int nEx
12d60 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
12d70 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  pr;..    assert(
12d80 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12da0 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
12db0 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
12dc0 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
12dd0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
12de0 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20  .pExpr!=0 ); /* 
12df0 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
12e00 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
12e10 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
12e20 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20   p->pSrc!=0 );  
12e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12e40 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
12e50 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
12e60 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20  ) */.    pTab = 
12e70 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
12e80 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65  ab;..    /* Code
12e90 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69   an OP_Transacti
12ea0 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c  on and OP_TableL
12eb0 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e  ock for <table>.
12ec0 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
12ed0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
12ee0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
12ef0 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  hema);.    sqlit
12f00 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
12f10 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
12f20 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c  .    sqlite3Tabl
12f30 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
12f40 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
12f50 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
12f60 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 20  .    assert(v); 
12f70 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64   /* sqlite3GetVd
12f80 62 65 28 29 20 68 61 73 20 61 6c 77 61 79 73 20  be() has always 
12f90 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  been previously 
12fa0 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66  called */.    if
12fb0 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45  ( nExpr==1 && pE
12fc0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
12fd0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
12fe0 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 20 49       /* The "x I
12ff0 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20  N (SELECT rowid 
13000 46 52 4f 4d 20 74 61 62 6c 65 29 22 20 63 61 73  FROM table)" cas
13010 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  e */.      int i
13020 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
13030 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
13040 6e 63 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  nce);.      Vdbe
13050 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
13060 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
13070 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
13080 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
13090 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
130a0 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
130b0 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20  EX_ROWID;..     
130c0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
130d0 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
130e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
130f0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13110 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
13120 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
13130 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79      int affinity
13140 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  _ok = 1;.      i
13150 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  nt i;..      /* 
13160 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  Check that the a
13170 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c  ffinity that wil
13180 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72  l be used to per
13190 66 6f 72 6d 20 65 61 63 68 20 0a 20 20 20 20 20  form each .     
131a0 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   ** comparison i
131b0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
131c0 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 65 61  e affinity of ea
131d0 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62  ch column in tab
131e0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
131f0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
13200 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 69   operator.  If i
13210 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  t not, it is not
13220 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a 20 20 20   possible to.   
13230 20 20 20 2a 2a 20 75 73 65 20 61 6e 79 20 69 6e     ** use any in
13240 64 65 78 20 6f 66 20 74 68 65 20 52 48 53 20 74  dex of the RHS t
13250 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  able.  */.      
13260 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
13270 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b   && affinity_ok;
13280 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
13290 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69  xpr *pLhs = sqli
132a0 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
132b0 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c  bexpr(pX->pLeft,
132c0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74   i);.        int
132d0 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e   iCol = pEList->
132e0 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[i].pExpr->iCol
132f0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61  umn;.        cha
13300 72 20 69 64 78 61 66 66 20 3d 20 73 71 6c 69 74  r idxaff = sqlit
13310 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66  e3TableColumnAff
13320 69 6e 69 74 79 28 70 54 61 62 2c 69 43 6f 6c 29  inity(pTab,iCol)
13330 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c 65 20 2a  ; /* RHS table *
13340 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  /.        char c
13350 6d 70 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43  mpaff = sqlite3C
13360 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
13370 4c 68 73 2c 20 69 64 78 61 66 66 29 3b 0a 20 20  Lhs, idxaff);.  
13380 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13390 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  cmpaff==SQLITE_A
133a0 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20  FF_BLOB );.     
133b0 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d 70     testcase( cmp
133c0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
133d0 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20  TEXT );.        
133e0 73 77 69 74 63 68 28 20 63 6d 70 61 66 66 20 29  switch( cmpaff )
133f0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  {.          case
13400 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
13410 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  :.            br
13420 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  eak;.          c
13430 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
13440 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20  EXT:.           
13450 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f 6d 70 61   /* sqlite3Compa
13460 72 65 41 66 66 69 6e 69 74 79 28 29 20 6f 6e 6c  reAffinity() onl
13470 79 20 72 65 74 75 72 6e 73 20 54 45 58 54 20 69  y returns TEXT i
13480 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68  f one side or th
13490 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
134a0 20 6f 74 68 65 72 20 68 61 73 20 6e 6f 20 61 66   other has no af
134b0 66 69 6e 69 74 79 20 61 6e 64 20 74 68 65 20 6f  finity and the o
134c0 74 68 65 72 20 73 69 64 65 20 69 73 20 54 45 58  ther side is TEX
134d0 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20 20 20 20  T.  Hence,.     
134e0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e         ** the on
134f0 6c 79 20 77 61 79 20 66 6f 72 20 63 6d 70 61 66  ly way for cmpaf
13500 66 20 74 6f 20 62 65 20 54 45 58 54 20 69 73 20  f to be TEXT is 
13510 66 6f 72 20 69 64 78 61 66 66 20 74 6f 20 62 65  for idxaff to be
13520 20 54 45 58 54 0a 20 20 20 20 20 20 20 20 20 20   TEXT.          
13530 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20 74 68 65    ** and for the
13540 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 4c 48 53   term on the LHS
13550 20 6f 66 20 74 68 65 20 49 4e 20 74 6f 20 68 61   of the IN to ha
13560 76 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 20  ve no affinity. 
13570 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  */.            a
13580 73 73 65 72 74 28 20 69 64 78 61 66 66 3d 3d 53  ssert( idxaff==S
13590 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
135a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
135b0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64  eak;.          d
135c0 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
135d0 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20      affinity_ok 
135e0 3d 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  = sqlite3IsNumer
135f0 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 61 66  icAffinity(idxaf
13600 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  f);.        }.  
13610 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
13620 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a   affinity_ok ){.
13630 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
13640 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
13650 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 69 6c  g index that wil
13660 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68 69 73 20  l work for this 
13670 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
13680 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
13690 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
136a0 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 3b 20  dx && eType==0; 
136b0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
136c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42 69 74  ){.          Bit
136d0 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b 20 20 20  mask colUsed;   
136e0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66     /* Columns of
136f0 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20   the index used 
13700 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 42 69 74  */.          Bit
13710 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20 20 20 20  mask mCol;      
13720 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 74     /* Mask for t
13730 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d  he current colum
13740 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  n */.          i
13750 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
13760 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74 69 6e 75  <nExpr ) continu
13770 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;.          /* 
13780 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e 20  Maximum nColumn 
13790 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74 20 42 4d  is BMS-2, not BM
137a0 53 2d 31 2c 20 73 6f 20 74 68 61 74 20 77 65 20  S-1, so that we 
137b0 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20 20 20 20  can compute.    
137c0 20 20 20 20 20 20 2a 2a 20 42 49 54 4d 41 53 4b        ** BITMASK
137d0 28 6e 45 78 70 72 29 20 77 69 74 68 6f 75 74 20  (nExpr) without 
137e0 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a 20  overflowing */. 
137f0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
13800 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  e( pIdx->nColumn
13810 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20  ==BMS-2 );.     
13820 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
13830 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d  Idx->nColumn==BM
13840 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  S-1 );.         
13850 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
13860 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63 6f 6e 74  mn>=BMS-1 ) cont
13870 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
13880 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71 75 65  if( mustBeUnique
13890 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
138a0 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  if( pIdx->nKeyCo
138b0 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20  l>nExpr.        
138c0 20 20 20 20 20 7c 7c 28 70 49 64 78 2d 3e 6e 43       ||(pIdx->nC
138d0 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26 26 20 21  olumn>nExpr && !
138e0 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
138f0 64 78 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  dx)).           
13900 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13910 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
13920 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f  This index is no
13930 74 20 75 6e 69 71 75 65 20 6f 76 65 72 20 74 68  t unique over th
13940 65 20 49 4e 20 52 48 53 20 63 6f 6c 75 6d 6e 73  e IN RHS columns
13950 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
13960 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
13970 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73  .          colUs
13980 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 6c  ed = 0;   /* Col
13990 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 20 75 73  umns of index us
139a0 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  ed so far */.   
139b0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
139c0 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  i<nExpr; i++){. 
139d0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
139e0 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56  *pLhs = sqlite3V
139f0 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
13a00 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b  r(pX->pLeft, i);
13a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
13a20 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69 73 74  r *pRhs = pEList
13a30 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
13a40 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
13a50 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65  q *pReq = sqlite
13a60 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
13a70 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
13a80 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20  hs, pRhs);.     
13a90 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
13aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
13ab0 65 72 74 28 20 70 52 65 71 21 3d 30 20 7c 7c 20  ert( pReq!=0 || 
13ac0 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58  pRhs->iColumn==X
13ad0 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 61 72 73  N_ROWID || pPars
13ae0 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 20 20 20  e->nErr );.     
13af0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
13b00 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  j<nExpr; j++){. 
13b10 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
13b20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
13b30 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75 6d  j]!=pRhs->iColum
13b40 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
13b50 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
13b60 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  rt( pIdx->azColl
13b70 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  [j] );.         
13b80 20 20 20 20 20 69 66 28 20 70 52 65 71 21 3d 30       if( pReq!=0
13b90 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
13ba0 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20  mp(pReq->zName, 
13bb0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  pIdx->azColl[j])
13bc0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
13bd0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
13be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
13bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
13c00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
13c10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
13c20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20 62  if( j==nExpr ) b
13c30 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
13c40 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42 49 54    mCol = MASKBIT
13c50 28 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (j);.           
13c60 20 69 66 28 20 6d 43 6f 6c 20 26 20 63 6f 6c 55   if( mCol & colU
13c70 73 65 64 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20  sed ) break; /* 
13c80 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75 73 65 64  Each column used
13c90 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20 20   only once */.  
13ca0 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65            colUse
13cb0 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20 20  d |= mCol;.     
13cc0 20 20 20 20 20 20 20 69 66 28 20 61 69 4d 61 70         if( aiMap
13cd0 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b   ) aiMap[i] = j;
13ce0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a  .          }.  .
13cf0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
13d00 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c 20 63 6f  ( i==nExpr || co
13d10 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42 49 54 28  lUsed!=(MASKBIT(
13d20 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a 20 20 20  nExpr)-1) );.   
13d30 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 55 73         if( colUs
13d40 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78  ed==(MASKBIT(nEx
13d50 70 72 29 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  pr)-1) ){.      
13d60 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
13d70 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
13d80 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
13d90 69 6e 64 65 78 20 70 49 64 78 20 69 73 20 75 73  index pIdx is us
13da0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
13db0 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20      int iAddr = 
13dc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13dd0 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
13de0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
13df0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13e00 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20  MIT_EXPLAIN.    
13e10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13e20 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13e30 45 78 70 6c 61 69 6e 2c 20 30 2c 20 30 2c 20 30  Explain, 0, 0, 0
13e40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13e50 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
13e60 62 2c 20 22 55 53 49 4e 47 20 49 4e 44 45 58 20  b, "USING INDEX 
13e70 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54  %s FOR IN-OPERAT
13e80 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  OR",pIdx->zName)
13e90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13ea0 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 23 65 6e  P4_DYNAMIC);.#en
13eb0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
13ec0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13ed0 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
13ee0 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e  , iTab, pIdx->tn
13ef0 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  um, iDb);.      
13f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13f10 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
13f20 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20  arse, pIdx);.   
13f30 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
13f40 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
13f50 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
13f60 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
13f70 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ( IN_INDEX_INDEX
13f80 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45  _DESC == IN_INDE
13f90 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b  X_INDEX_ASC+1 );
13fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 54 79  .            eTy
13fb0 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  pe = IN_INDEX_IN
13fc0 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e  DEX_ASC + pIdx->
13fd0 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 20  aSortOrder[0];. 
13fe0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66   .            if
13ff0 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29  ( prRhsHasNull )
14000 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
14010 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53  ENABLE_COLUMN_US
14020 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20  ED_MASK.        
14030 20 20 20 20 20 20 69 36 34 20 6d 61 73 6b 20 3d        i64 mask =
14040 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a 20   (1<<nExpr)-1;. 
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
14060 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
14070 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73  p8(v, OP_Columns
14080 55 73 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20  Used, .         
14090 20 20 20 20 20 20 20 20 20 69 54 61 62 2c 20 30           iTab, 0
140a0 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61 73 6b 2c  , 0, (u8*)&mask,
140b0 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64   P4_INT64);.#end
140c0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  if.             
140d0 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d   *prRhsHasNull =
140e0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
140f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
14100 66 28 20 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20  f( nExpr==1 ){. 
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
14120 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c  qlite3SetHasNull
14130 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a 70  Flag(v, iTab, *p
14140 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20  rRhsHasNull);.  
14150 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
14160 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14170 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14180 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
14190 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Addr);.         
141a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20   }.        } /* 
141b0 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 69 6e  End loop over in
141c0 64 65 78 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d  dexes */.      }
141d0 20 2f 2a 20 45 6e 64 20 69 66 28 20 61 66 66 69   /* End if( affi
141e0 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20 20  nity_ok ) */.   
141f0 20 7d 20 2f 2a 20 45 6e 64 20 69 66 20 6e 6f 74   } /* End if not
14200 20 61 6e 20 72 6f 77 69 64 20 69 6e 64 65 78 20   an rowid index 
14210 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 61 74  */.  } /* End at
14220 74 65 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a  tempt to optimiz
14230 65 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  e using an index
14240 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20   */..  /* If no 
14250 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e 64 65  preexisting inde
14260 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66  x is available f
14270 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75 73 65  or the IN clause
14280 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44  .  ** and IN_IND
14290 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c  EX_NOOP is an al
142a0 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a  lowed reply.  **
142b0 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f 66 20   and the RHS of 
142c0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
142d0 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61  is a list, not a
142e0 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 61   subquery.  ** a
142f0 6e 64 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f  nd the RHS is no
14300 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20 68 61  t constant or ha
14310 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 74  s two or fewer t
14320 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  erms,.  ** then 
14330 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74 68 20  it is not worth 
14340 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65  creating an ephe
14350 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 65  meral table to e
14360 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68 65  valuate.  ** the
14370 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f 20   IN operator so 
14380 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f  return IN_INDEX_
14390 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  NOOP..  */.  if(
143a0 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26 26 20   eType==0.   && 
143b0 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e  (inFlags & IN_IN
143c0 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20  DEX_NOOP_OK).   
143d0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
143e0 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
143f0 6c 65 63 74 29 0a 20 20 20 26 26 20 28 21 73 71  lect).   && (!sq
14400 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73  lite3InRhsIsCons
14410 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e  tant(pX) || pX->
14420 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d  x.pList->nExpr<=
14430 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54 79 70  2).  ){.    eTyp
14440 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  e = IN_INDEX_NOO
14450 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54  P;.  }..  if( eT
14460 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ype==0 ){.    /*
14470 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   Could not find 
14480 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
14490 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73  e or index to us
144a0 65 20 61 73 20 74 68 65 20 52 48 53 20 62 2d 74  e as the RHS b-t
144b0 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77  ree..    ** We w
144c0 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65  ill have to gene
144d0 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  rate an ephemera
144e0 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68  l table to do th
144f0 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20  e job..    */.  
14500 20 20 75 33 32 20 73 61 76 65 64 4e 51 75 65 72    u32 savedNQuer
14510 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
14520 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20  nQueryLoop;.    
14530 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  int rMayHaveNull
14540 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20   = 0;.    eType 
14550 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a  = IN_INDEX_EPH;.
14560 20 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73 20      if( inFlags 
14570 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  & IN_INDEX_LOOP 
14580 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
14590 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b  >nQueryLoop = 0;
145a0 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70  .      if( pX->p
145b0 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Left->iColumn<0 
145c0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
145d0 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
145e0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
145f0 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
14600 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d  X_ROWID;.      }
14610 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
14620 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20  rRhsHasNull ){. 
14630 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75       *prRhsHasNu
14640 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c  ll = rMayHaveNul
14650 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  l = ++pParse->nM
14660 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  em;.    }.    sq
14670 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
14680 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72  ct(pParse, pX, r
14690 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79  MayHaveNull, eTy
146a0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
146b0 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ID);.    pParse-
146c0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61  >nQueryLoop = sa
146d0 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
146e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e   }else{.    pX->
146f0 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
14700 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61 70 20   }..  if( aiMap 
14710 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44  && eType!=IN_IND
14720 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 26 26 20  EX_INDEX_ASC && 
14730 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f  eType!=IN_INDEX_
14740 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20  INDEX_DESC ){.  
14750 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20    int i, n;.    
14760 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  n = sqlite3ExprV
14770 65 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e 70 4c  ectorSize(pX->pL
14780 65 66 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  eft);.    for(i=
14790 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d  0; i<n; i++) aiM
147a0 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20  ap[i] = i;.  }. 
147b0 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d   return eType;.}
147c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
147d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
147e0 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75  QUERY./*.** Argu
147f0 6d 65 6e 74 20 70 45 78 70 72 20 69 73 20 61 6e  ment pExpr is an
14800 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e   (?, ?...) IN(..
14810 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54  .) expression. T
14820 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
14830 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72   allocates and r
14840 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d 74 65 72  eturns a nul-ter
14850 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63  minated string c
14860 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68  ontaining .** th
14870 65 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20  e affinities to 
14880 62 65 20 75 73 65 64 20 66 6f 72 20 65 61 63 68  be used for each
14890 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63   column of the c
148a0 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a  omparison..**.**
148b0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
148c0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
148d0 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72   caller to ensur
148e0 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  e that the retur
148f0 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73  ned.** string is
14900 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
14910 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  d using sqlite3D
14920 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  bFree()..*/.stat
14930 69 63 20 63 68 61 72 20 2a 65 78 70 72 49 4e 41  ic char *exprINA
14940 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
14950 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
14960 70 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 65  pr){.  Expr *pLe
14970 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
14980 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20  t;.  int nVal = 
14990 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
149a0 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20  rSize(pLeft);.  
149b0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
149c0 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  = (pExpr->flags 
149d0 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
149e0 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  ? pExpr->x.pSele
149f0 63 74 20 3a 20 30 3b 0a 20 20 63 68 61 72 20 2a  ct : 0;.  char *
14a00 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  zRet;..  assert(
14a10 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
14a20 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d 20 73 71  N );.  zRet = sq
14a30 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
14a40 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61  (pParse->db, nVa
14a50 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a 52 65 74  l+1);.  if( zRet
14a60 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
14a70 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
14a80 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
14a90 45 78 70 72 20 2a 70 41 20 3d 20 73 71 6c 69 74  Expr *pA = sqlit
14aa0 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
14ab0 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
14ac0 20 20 20 20 20 20 63 68 61 72 20 61 20 3d 20 73        char a = s
14ad0 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
14ae0 74 79 28 70 41 29 3b 0a 20 20 20 20 20 20 69 66  ty(pA);.      if
14af0 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
14b00 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 73       zRet[i] = s
14b10 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
14b20 69 6e 69 74 79 28 70 53 65 6c 65 63 74 2d 3e 70  inity(pSelect->p
14b30 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
14b40 72 2c 20 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r, a);.      }el
14b50 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74  se{.        zRet
14b60 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20 20 20 7d  [i] = a;.      }
14b70 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 74 5b  .    }.    zRet[
14b80 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  nVal] = '\0';.  
14b90 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  }.  return zRet;
14ba0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
14bb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
14bc0 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f  UBQUERY./*.** Lo
14bd0 61 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  ad the Parse obj
14be0 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
14bf0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
14c00 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 0a   with an error .
14c10 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68  ** message of th
14c20 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
14c30 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75  "sub-select retu
14c40 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20  rns N columns - 
14c50 65 78 70 65 63 74 65 64 20 4d 22 0a 2a 2f 20 20  expected M".*/  
14c60 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 75   .void sqlite3Su
14c70 62 73 65 6c 65 63 74 45 72 72 6f 72 28 50 61 72  bselectError(Par
14c80 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
14c90 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20 6e 45 78  nActual, int nEx
14ca0 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  pect){.  const c
14cb0 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22 73 75 62  har *zFmt = "sub
14cc0 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
14cd0 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70  %d columns - exp
14ce0 65 63 74 65 64 20 25 64 22 3b 0a 20 20 73 71 6c  ected %d";.  sql
14cf0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14d00 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41 63 74 75  rse, zFmt, nActu
14d10 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b 0a 7d 0a  al, nExpect);.}.
14d20 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78  #endif../*.** Ex
14d30 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
14d40 73 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 20  s a vector that 
14d50 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 69 6e  has been used in
14d60 20 61 20 63 6f 6e 74 65 78 74 20 77 68 65 72 65   a context where
14d70 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 70 65  .** it is not pe
14d80 72 6d 69 74 74 65 64 2e 20 49 66 20 70 45 78 70  rmitted. If pExp
14d90 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  r is a sub-selec
14da0 74 20 76 65 63 74 6f 72 2c 20 74 68 69 73 20 72  t vector, this r
14db0 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73  outine .** loads
14dc0 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
14dd0 74 20 77 69 74 68 20 61 20 6d 65 73 73 61 67 65  t with a message
14de0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
14df0 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63  .**   "sub-selec
14e00 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75  t returns N colu
14e10 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 31  mns - expected 1
14e20 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69  ".**.** Or, if i
14e30 74 20 69 73 20 61 20 72 65 67 75 6c 61 72 20 73  t is a regular s
14e40 63 61 6c 61 72 20 76 65 63 74 6f 72 3a 0a 2a 2a  calar vector:.**
14e50 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61 6c 75 65  .**   "row value
14e60 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20 20 20 0a   misused".*/   .
14e70 76 6f 69 64 20 73 71 6c 69 74 65 33 56 65 63 74  void sqlite3Vect
14e80 6f 72 45 72 72 6f 72 4d 73 67 28 50 61 72 73 65  orErrorMsg(Parse
14e90 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
14ea0 70 45 78 70 72 29 7b 0a 23 69 66 6e 64 65 66 20  pExpr){.#ifndef 
14eb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
14ec0 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
14ed0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
14ee0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
14ef0 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
14f00 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ror(pParse, pExp
14f10 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
14f20 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b  List->nExpr, 1);
14f30 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
14f40 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45    {.    sqlite3E
14f50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14f60 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
14f70 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ed");.  }.}../*.
14f80 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
14f90 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71   for scalar subq
14fa0 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61  ueries used as a
14fb0 20 73 75 62 71 75 65 72 79 20 65 78 70 72 65 73   subquery expres
14fc0 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a  sion, EXISTS,.**
14fd0 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   or IN operators
14fe0 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a  .  Examples:.**.
14ff0 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61  **     (SELECT a
15000 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20   FROM b)        
15010 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a    -- subquery.**
15020 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c       EXISTS (SEL
15030 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
15040 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65  -- EXISTS subque
15050 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  ry.**     x IN (
15060 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20  4,5,11)         
15070 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
15080 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e  tor with list on
15090 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
150a0 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45  .**     x IN (SE
150b0 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
150c0 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
150d0 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20  r with subquery 
150e0 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a  on the right.**.
150f0 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72  ** The pExpr par
15100 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73  ameter describes
15110 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
15120 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
15130 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  e IN.** operator
15140 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a   or subquery..**
15150 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
15160 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d   isRowid is non-
15170 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65  zero, then expre
15180 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67  ssion pExpr is g
15190 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
151a0 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  be of the form "
151b0 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f  <rowid> IN (?, ?
151c0 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f  , ?)", where <ro
151d0 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72 65  wid> is a refere
151e0 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69  nce.** to some i
151f0 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d  nteger key colum
15200 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54  n of a table B-T
15210 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
15220 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74  e, use an.** int
15230 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74  key B-Tree to st
15240 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 49  ore the set of I
15250 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e  N(...) values in
15260 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
15270 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76  al.** (slower) v
15280 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b  ariable length k
15290 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a  eys B-Tree..**.*
152a0 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c  * If rMayHaveNul
152b0 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  l is non-zero, t
152c0 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
152d0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
152e0 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20  an IN.** (not a 
152f0 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53  SELECT or EXISTS
15300 29 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 52  ) and that the R
15310 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  HS might contain
15320 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20  s NULLs..** All 
15330 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  this routine doe
15340 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 20  s is initialize 
15350 74 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76  the register giv
15360 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75  en by rMayHaveNu
15370 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20  ll.** to NULL.  
15380 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73  Calling routines
15390 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 20   will take care 
153a0 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73  of changing this
153b0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c   register.** val
153c0 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  ue to non-NULL i
153d0 66 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c  f the RHS is NUL
153e0 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  L-free..**.** Fo
153f0 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  r a SELECT or EX
15400 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72  ISTS operator, r
15410 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
15420 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  er that holds th
15430 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f  e.** result.  Fo
15440 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e  r a multi-column
15450 20 53 45 4c 45 43 54 2c 20 74 68 65 20 72 65 73   SELECT, the res
15460 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ult is stored in
15470 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a   a contiguous.**
15480 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
15490 65 72 73 20 61 6e 64 20 74 68 65 20 72 65 74 75  ers and the retu
154a0 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
154b0 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 20  register of the 
154c0 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 72 65 73  left-most.** res
154d0 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 52 65 74  ult column.  Ret
154e0 75 72 6e 20 30 20 66 6f 72 20 49 4e 20 6f 70 65  urn 0 for IN ope
154f0 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20  rators or if an 
15500 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
15510 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15520 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
15530 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  t sqlite3CodeSub
15540 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  select(.  Parse 
15550 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
15560 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
15570 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
15580 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
15590 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c    /* The IN, SEL
155a0 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f  ECT, or EXISTS o
155b0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
155c0 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20   rHasNullFlag,  
155d0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
155e0 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 77 68   that records wh
155f0 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73  ether NULLs exis
15600 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e  t in RHS */.  in
15610 74 20 69 73 52 6f 77 69 64 20 20 20 20 20 20 20  t isRowid       
15620 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
15630 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72  , LHS of IN oper
15640 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20  ator is a rowid 
15650 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49  */.){.  int jmpI
15660 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20  fDynamic = -1;  
15670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15680 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20      /* One-time 
15690 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a  test address */.
156a0 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20    int rReg = 0; 
156b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
156d0 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65  ister storing re
156e0 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62  sulting */.  Vdb
156f0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
15700 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
15710 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
15720 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
15730 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
15740 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  ush(pParse);..  
15750 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f  /* The evaluatio
15760 6e 20 6f 66 20 74 68 65 20 49 4e 2f 45 58 49 53  n of the IN/EXIS
15770 54 53 2f 53 45 4c 45 43 54 20 6d 75 73 74 20 62  TS/SELECT must b
15780 65 20 72 65 70 65 61 74 65 64 20 65 76 65 72 79  e repeated every
15790 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73   time it.  ** is
157a0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20   encountered if 
157b0 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
157c0 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
157d0 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
157e0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
157f0 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
15800 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
15810 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
15820 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
15830 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
15840 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
15850 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
15860 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
15870 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
15880 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
15890 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
158a0 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e   then we can run
158b0 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20   this code just 
158c0 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74  once.  ** save t
158d0 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  he results, and 
158e0 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  reuse the same r
158f0 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
15900 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e  ent invocations.
15910 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70  .  */.  if( !Exp
15920 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
15930 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
15940 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79  ) ){.    jmpIfDy
15950 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74 65 33 56  namic = sqlite3V
15960 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
15970 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
15980 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66  age(v);.  }..#if
15990 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
159a0 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70  _EXPLAIN.  if( p
159b0 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
159c0 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2 ){.    char *z
159d0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
159e0 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
159f0 20 22 45 58 45 43 55 54 45 20 25 73 25 73 20 53   "EXECUTE %s%s S
15a00 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20  UBQUERY %d",.   
15a10 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69       jmpIfDynami
15a20 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41  c>=0?"":"CORRELA
15a30 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70  TED ",.        p
15a40 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f  Expr->op==TK_IN?
15a50 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c  "LIST":"SCALAR",
15a60 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
15a70 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20  >iNextSelectId. 
15a80 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
15a90 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
15aa0 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
15ab0 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
15ac0 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
15ad0 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  AMIC);.  }.#endi
15ae0 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  f..  switch( pEx
15af0 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
15b00 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
15b10 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
15b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15b30 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
15b40 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
15b50 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  truction */.    
15b60 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
15b70 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a  pExpr->pLeft; /*
15b80 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
15b90 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
15ba0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
15bb0 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
15bc0 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
15bd0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
15be0 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20   nVal;          
15bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
15c00 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74   of vector pLeft
15c10 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20 20 20   */.      .     
15c20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45   nVal = sqlite3E
15c30 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
15c40 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  eft);.      asse
15c50 72 74 28 20 21 69 73 52 6f 77 69 64 20 7c 7c 20  rt( !isRowid || 
15c60 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20  nVal==1 );..    
15c70 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69    /* Whether thi
15c80 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45  s is an 'x IN(SE
15c90 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20  LECT...)' or an 
15ca0 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e  'x IN(<exprlist>
15cb0 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  )'.      ** expr
15cc0 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e  ession it is han
15cd0 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61  dled the same wa
15ce0 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c  y.  An ephemeral
15cf0 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20   table is .     
15d00 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20   ** filled with 
15d10 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65  index keys repre
15d20 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75  senting the resu
15d30 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  lts from the .  
15d40 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72      ** SELECT or
15d50 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e   the <exprlist>.
15d60 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
15d70 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78  ** If the 'x' ex
15d80 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
15d90 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74  lumn value, or t
15da0 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20  he SELECT....   
15db0 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
15dc0 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
15dd0 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
15de0 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
15df0 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
15e00 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  n is used to bui
15e10 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  ld the index key
15e20 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61  s. If both 'x' a
15e30 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
15e40 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
15e50 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
15e60 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
15e70 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20  finity is used. 
15e80 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65       ** if eithe
15e90 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d  r column has NUM
15ea0 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20  ERIC or INTEGER 
15eb0 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69  affinity. If nei
15ec0 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78  ther.      ** 'x
15ed0 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
15ee0 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
15ef0 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
15f00 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
15f10 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65  .      ** is use
15f20 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
15f30 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
15f40 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
15f50 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
15f60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15f70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
15f80 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  eral, .         
15f90 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
15fa0 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29  (isRowid?0:nVal)
15fb0 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  );.      pKeyInf
15fc0 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20  o = isRowid ? 0 
15fd0 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  : sqlite3KeyInfo
15fe0 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
15ff0 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20  , nVal, 1);..   
16000 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
16010 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
16020 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
16030 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31         /* Case 1
16040 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53  :     expr IN (S
16050 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20  ELECT ...).     
16060 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
16070 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
16080 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
16090 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
160a0 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
160b0 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
160c0 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20  table allocated 
160d0 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65  and opened above
160e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
160f0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
16100 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  lect = pExpr->x.
16110 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
16120 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
16130 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
16140 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  ist;..        as
16150 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29  sert( !isRowid )
16160 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;.        /* If 
16170 74 68 65 20 4c 48 53 20 61 6e 64 20 52 48 53 20  the LHS and RHS 
16180 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
16190 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c  or do not match,
161a0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
161b0 20 65 72 72 6f 72 20 77 69 6c 6c 20 68 61 76 65   error will have
161c0 20 62 65 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e   been caught lon
161d0 67 20 62 65 66 6f 72 65 20 77 65 20 72 65 61 63  g before we reac
161e0 68 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f  h this point. */
161f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57  .        if( ALW
16200 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70  AYS(pEList->nExp
16210 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20  r==nVal) ){.    
16220 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
16230 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dest;.         
16240 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
16250 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
16260 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
16270 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69  RT_Set, pExpr->i
16280 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  Table);.        
16290 20 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 20    dest.zAffSdst 
162a0 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79  = exprINAffinity
162b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
162c0 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 65  .          pSele
162d0 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ct->iLimit = 0;.
162e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
162f0 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c  se( pSelect->sel
16300 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
16310 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nct );.         
16320 20 74 65 73 74 63 61 73 65 28 20 70 4b 65 79 49   testcase( pKeyI
16330 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75  nfo==0 ); /* Cau
16340 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71  sed by OOM in sq
16350 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
16360 63 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  c() */.         
16370 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
16380 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
16390 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  ct, &dest) ){.  
163a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
163b0 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
163c0 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73  db, dest.zAffSds
163d0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
163e0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
163f0 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ref(pKeyInfo);. 
16400 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
16410 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n 0;.          }
16420 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16430 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
16440 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64  >db, dest.zAffSd
16450 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  st);.          a
16460 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21  ssert( pKeyInfo!
16470 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c  =0 ); /* OOM wil
16480 6c 20 63 61 75 73 65 20 65 78 69 74 20 61 66 74  l cause exit aft
16490 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  er sqlite3Select
164a0 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  () */.          
164b0 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
164c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
164d0 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e  ssert( pEList->n
164e0 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20  Expr>0 );.      
164f0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
16500 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
16510 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20  eable(pKeyInfo) 
16520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
16530 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b  (i=0; i<nVal; i+
16540 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
16550 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
16560 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
16570 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20  xpr(pLeft, i);. 
16580 20 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49             pKeyI
16590 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  nfo->aColl[i] = 
165a0 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
165b0 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20  pareCollSeq(.   
165c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
165d0 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e  rse, p, pEList->
165e0 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20 20 20 20  a[i].pExpr.     
165f0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
16600 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
16610 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
16620 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e  ALWAYS(pExpr->x.
16630 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  pList!=0) ){.   
16640 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20       /* Case 2: 
16650 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70      expr IN (exp
16660 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a  rlist).        *
16670 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72  *.        ** For
16680 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
16690 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78  , build an index
166a0 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76   key from the ev
166b0 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20  aluation and.   
166c0 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74       ** store it
166d0 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
166e0 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70  y table. If <exp
166f0 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  r> is a column, 
16700 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20  then use.       
16710 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73   ** that columns
16720 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62   affinity when b
16730 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65  uilding index ke
16740 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  ys. If <expr> is
16750 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
16760 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75  a column, use nu
16770 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a  meric affinity..
16780 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16790 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
167a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
167b0 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  Affinity of the 
167c0 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f  LHS of the IN */
167d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
167e0 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
167f0 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
16800 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
16810 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
16820 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
16830 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72         int r1, r
16840 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20  2, r3;..        
16850 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
16860 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
16870 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 69  Left);.        i
16880 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a  f( !affinity ){.
16890 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
168a0 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
168b0 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BLOB;.        }.
168c0 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
168d0 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
168e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
168f0 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
16900 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b  ble(pKeyInfo) );
16910 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49  .          pKeyI
16920 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  nfo->aColl[0] = 
16930 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
16940 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
16950 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
16960 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
16970 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
16980 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
16990 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20  <exprlist>. */. 
169a0 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
169b0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
169c0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  arse);.        r
169d0 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
169e0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
169f0 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
16a00 69 64 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  id ) sqlite3Vdbe
16a10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
16a20 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20  l, 0, r2);.     
16a30 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e     for(i=pList->
16a40 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69  nExpr, pItem=pLi
16a50 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  st->a; i>0; i--,
16a60 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
16a70 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d       Expr *pE2 =
16a80 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
16a90 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61           int iVa
16aa0 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20  lToIns;..       
16ab0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70     /* If the exp
16ac0 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63  ression is not c
16ad0 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20  onstant then we 
16ae0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20  will need to.   
16af0 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c         ** disabl
16b00 65 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20  e the test that 
16b10 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62  was generated ab
16b20 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ove that makes s
16b30 75 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ure.          **
16b40 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20   this code only 
16b50 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20  executes once.  
16b60 42 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f  Because for a no
16b70 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20  n-constant.     
16b80 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
16b90 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  on we need to re
16ba0 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61  run this code ea
16bb0 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20  ch time..       
16bc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
16bd0 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  if( jmpIfDynamic
16be0 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45  >=0 && !sqlite3E
16bf0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
16c00 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
16c10 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
16c20 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70  ngeToNoop(v, jmp
16c30 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20  IfDynamic);.    
16c40 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e          jmpIfDyn
16c50 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20  amic = -1;.     
16c60 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
16c70 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
16c80 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  e expression and
16c90 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
16ca0 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  the temp table *
16cb0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
16cc0 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74  isRowid && sqlit
16cd0 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
16ce0 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29  pE2, &iValToIns)
16cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16d00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16d10 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e  3(v, OP_InsertIn
16d20 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
16d30 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29  , r2, iValToIns)
16d40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
16d50 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
16d60 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  3 = sqlite3ExprC
16d70 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
16d80 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20  , pE2, r1);.    
16d90 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f          if( isRo
16da0 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
16db0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16dc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
16dd0 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20  tBeInt, r3,.    
16de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16df0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16e00 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
16e10 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20  dr(v)+2);.      
16e20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
16e30 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
16e40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16e50 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
16e60 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
16e70 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20  able, r2, r3);. 
16e80 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
16e90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
16ea0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16eb0 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
16ec0 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26  rd, r3, 1, r2, &
16ed0 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
16ee0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16ef0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
16f00 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
16f10 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20  e, r3, 1);.     
16f20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16f30 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
16f40 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
16f50 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
16f60 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r3, 1);.      
16f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16f80 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
16f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
16fa0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
16fb0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
16fc0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
16fd0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16fe0 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
16ff0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
17000 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17010 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
17020 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70   addr, (void *)p
17030 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
17040 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
17050 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17060 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
17070 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
17080 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65  K_SELECT:.    de
17090 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
170a0 2a 20 43 61 73 65 20 33 3a 20 20 20 20 28 53 45  * Case 3:    (SE
170b0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e  LECT ... FROM ..
170c0 2e 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .).      **     
170d0 6f 72 3a 20 20 20 20 45 58 49 53 54 53 28 53 45  or:    EXISTS(SE
170e0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e  LECT ... FROM ..
170f0 2e 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .).      **.    
17100 20 20 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43    ** For a SELEC
17110 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  T, generate code
17120 20 74 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75   to put the valu
17130 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d  es for all colum
17140 6e 73 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ns of.      ** t
17150 68 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e 74  he first row int
17160 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  o an array of re
17170 67 69 73 74 65 72 73 20 61 6e 64 20 72 65 74 75  gisters and retu
17180 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
17190 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72        ** the fir
171a0 73 74 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20  st register..   
171b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
171c0 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49  f this is an EXI
171d0 53 54 53 2c 20 77 72 69 74 65 20 61 6e 20 69 6e  STS, write an in
171e0 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69  teger 0 (not exi
171f0 73 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74  sts) or 1 (exist
17200 73 29 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f  s).      ** into
17210 20 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20   a register and 
17220 72 65 74 75 72 6e 20 74 68 61 74 20 72 65 67 69  return that regi
17230 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20  ster number..   
17240 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
17250 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68  n both cases, th
17260 65 20 71 75 65 72 79 20 69 73 20 61 75 67 6d 65  e query is augme
17270 6e 74 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54  nted with "LIMIT
17280 20 31 22 2e 20 20 41 6e 79 20 0a 20 20 20 20 20   1".  Any .     
17290 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20   ** preexisting 
172a0 6c 69 6d 69 74 20 69 73 20 64 69 73 63 61 72 64  limit is discard
172b0 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ed in place of t
172c0 68 65 20 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a  he new LIMIT 1..
172d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53        */.      S
172e0 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17300 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
17310 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f  tatement to enco
17320 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  de */.      Sele
17330 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
17340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17350 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c    /* How to deal
17360 20 77 69 74 68 20 53 45 4c 45 43 54 20 72 65 73   with SELECT res
17370 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ult */.      int
17380 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   nReg;          
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173a0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
173b0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a  to allocate */..
173c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
173d0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
173e0 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65  ISTS );.      te
173f0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
17400 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
17410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
17420 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
17430 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  TS || pExpr->op=
17440 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
17450 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
17460 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
17470 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
17480 20 29 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20   );..      pSel 
17490 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
174a0 63 74 3b 0a 20 20 20 20 20 20 6e 52 65 67 20 3d  ct;.      nReg =
174b0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
174c0 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45  ELECT ? pSel->pE
174d0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b  List->nExpr : 1;
174e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
174f0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
17500 73 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e  st, 0, pParse->n
17510 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70 50  Mem+1);.      pP
17520 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
17530 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  eg;.      if( pE
17540 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
17550 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65  CT ){.        de
17560 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d  st.eDest = SRT_M
17570 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74  em;.        dest
17580 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53  .iSdst = dest.iS
17590 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 64  DParm;.        d
175a0 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67  est.nSdst = nReg
175b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
175c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
175d0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e  P_Null, 0, dest.
175e0 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53  iSDParm, dest.iS
175f0 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20  DParm+nReg-1);. 
17600 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
17610 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62  nt((v, "Init sub
17620 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b  query result"));
17630 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17640 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
17650 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20   = SRT_Exists;. 
17660 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17670 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
17680 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e  nteger, 0, dest.
17690 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
176a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
176b0 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72  , "Init EXISTS r
176c0 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
176d0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
176e0 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
176f0 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d  ->db, pSel->pLim
17700 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d  it);.      pSel-
17710 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
17720 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
17730 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  e->db, TK_INTEGE
17740 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R,.             
17750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17760 20 20 20 20 20 26 73 71 6c 69 74 65 33 49 6e 74       &sqlite3Int
17770 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20  Tokens[1], 0);. 
17780 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69       pSel->iLimi
17790 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  t = 0;.      pSe
177a0 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  l->selFlags &= ~
177b0 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20  SF_MultiValue;. 
177c0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
177d0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
177e0 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  Sel, &dest) ){. 
177f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
17800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
17810 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Reg = dest.iSDPa
17820 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65  rm;.      ExprSe
17830 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
17840 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
17850 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17860 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
17870 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a  rHasNullFlag ){.
17880 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61      sqlite3SetHa
17890 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78  sNullFlag(v, pEx
178a0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61 73  pr->iTable, rHas
178b0 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a  NullFlag);.  }..
178c0 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d    if( jmpIfDynam
178d0 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ic>=0 ){.    sql
178e0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
178f0 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  (v, jmpIfDynamic
17900 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
17910 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
17920 72 73 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  rse);..  return 
17930 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rReg;.}.#endif /
17940 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
17950 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
17960 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
17970 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45 78  UBQUERY./*.** Ex
17980 70 72 20 70 49 6e 20 69 73 20 61 6e 20 49 4e 28  pr pIn is an IN(
17990 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e  ...) expression.
179a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
179b0 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 0a  hecks that the .
179c0 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 6e  ** sub-select on
179d0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
179e0 49 4e 28 29 20 6f 70 65 72 61 74 6f 72 20 68 61  IN() operator ha
179f0 73 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  s the same numbe
17a00 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 73  r of .** columns
17a10 20 61 73 20 74 68 65 20 76 65 63 74 6f 72 20 6f   as the vector o
17a20 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c 20 69  n the LHS. Or, i
17a30 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
17a40 20 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a 2a 2a   IN() is not .**
17a50 20 61 20 73 75 62 2d 71 75 65 72 79 2c 20 74 68   a sub-query, th
17a60 61 74 20 74 68 65 20 4c 48 53 20 69 73 20 61 20  at the LHS is a 
17a70 76 65 63 74 6f 72 20 6f 66 20 73 69 7a 65 20 31  vector of size 1
17a80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17a90 45 78 70 72 43 68 65 63 6b 49 4e 28 50 61 72 73  ExprCheckIN(Pars
17aa0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
17ab0 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 56 65  *pIn){.  int nVe
17ac0 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78  ctor = sqlite3Ex
17ad0 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 49 6e  prVectorSize(pIn
17ae0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
17af0 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20 45 50  (pIn->flags & EP
17b00 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
17b10 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d     if( nVector!=
17b20 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  pIn->x.pSelect->
17b30 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
17b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75  .      sqlite3Su
17b50 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  bselectError(pPa
17b60 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65 6c  rse, pIn->x.pSel
17b70 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
17b80 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20  pr, nVector);.  
17b90 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
17ba0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
17bb0 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20 20  nVector!=1 ){.  
17bc0 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45    sqlite3VectorE
17bd0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
17be0 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  pIn->pLeft);.   
17bf0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
17c00 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
17c10 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
17c20 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
17c30 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
17c40 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20   code for an IN 
17c50 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
17c60 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  *      x IN (SEL
17c70 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20  ECT ...).**     
17c80 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61   x IN (value, va
17c90 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  lue, ...).**.** 
17ca0 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69  The left-hand si
17cb0 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73 63  de (LHS) is a sc
17cc0 61 6c 61 72 20 6f 72 20 76 65 63 74 6f 72 20 65  alar or vector e
17cd0 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20  xpression.  The 
17ce0 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73  .** right-hand s
17cf0 69 64 65 20 28 52 48 53 29 20 69 73 20 61 6e 20  ide (RHS) is an 
17d00 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72  array of zero or
17d10 20 6d 6f 72 65 20 73 63 61 6c 61 72 20 76 61 6c   more scalar val
17d20 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20 73 75 62  ues, or a.** sub
17d30 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 52  query.  If the R
17d40 48 53 20 69 73 20 61 20 73 75 62 71 75 65 72 79  HS is a subquery
17d50 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  , the number of 
17d60 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
17d70 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68 65  ust.** match the
17d80 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
17d90 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72  ns in the vector
17da0 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 20 49 66   on the LHS.  If
17db0 20 74 68 65 20 52 48 53 20 69 73 0a 2a 2a 20 61   the RHS is.** a
17dc0 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2c   list of values,
17dd0 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62 65   the LHS must be
17de0 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a 2a   a scalar. .**.*
17df0 2a 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  * The IN operato
17e00 72 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  r is true if the
17e10 20 4c 48 53 20 76 61 6c 75 65 20 69 73 20 63 6f   LHS value is co
17e20 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
17e30 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68 65 20 72  he RHS..** The r
17e40 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65 20 69  esult is false i
17e50 66 20 74 68 65 20 4c 48 53 20 69 73 20 64 65 66  f the LHS is def
17e60 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69 6e 20 74  initely not in t
17e70 68 65 20 52 48 53 2e 20 20 54 68 65 20 0a 2a 2a  he RHS.  The .**
17e80 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20   result is NULL 
17e90 69 66 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  if the presence 
17ea0 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 74 68  of the LHS in th
17eb0 65 20 52 48 53 20 63 61 6e 6e 6f 74 20 62 65 20  e RHS cannot be 
17ec0 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 64  .** determined d
17ed0 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a  ue to NULLs..**.
17ee0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17ef0 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
17f00 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73  hat jumps to des
17f10 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65 20  tIfFalse if the 
17f20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63  LHS is not .** c
17f30 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
17f40 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75 65  the RHS.  If due
17f50 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e   to NULLs we can
17f60 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66  not determine if
17f70 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63   the LHS.** is c
17f80 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
17f90 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  RHS then jump to
17fa0 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66   destIfNull.  If
17fb0 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74   the LHS is cont
17fc0 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ained.** within 
17fd0 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c  the RHS then fal
17fe0 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a  l through..**.**
17ff0 20 53 65 65 20 74 68 65 20 73 65 70 61 72 61 74   See the separat
18000 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64  e in-operator.md
18010 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66   documentation f
18020 69 6c 65 20 69 6e 20 74 68 65 20 63 61 6e 6f 6e  ile in the canon
18030 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65 20 73  ical.** SQLite s
18040 6f 75 72 63 65 20 74 72 65 65 20 66 6f 72 20 61  ource tree for a
18050 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
18060 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
18070 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70   void sqlite3Exp
18080 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65  rCodeIN(.  Parse
18090 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
180a0 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
180b0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
180c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
180d0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
180e0 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70     /* The IN exp
180f0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
18100 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20   destIfFalse,   
18110 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
18120 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  if LHS is not co
18130 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
18140 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  HS */.  int dest
18150 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a  IfNull        /*
18160 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
18170 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e  e results are un
18180 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c  known due to NUL
18190 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  Ls */.){.  int r
181a0 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20  RhsHasNull = 0; 
181b0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61   /* Register tha
181c0 74 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53  t is true if RHS
181d0 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76   contains NULL v
181e0 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65  alues */.  int e
181f0 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  Type;           
18200 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20   /* Type of the 
18210 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68  RHS */.  int rLh
18220 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
18230 2a 20 52 65 67 69 73 74 65 72 28 73 29 20 68 6f  * Register(s) ho
18240 6c 64 69 6e 67 20 74 68 65 20 4c 48 53 20 76 61  lding the LHS va
18250 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 4c  lues */.  int rL
18260 68 73 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20  hsOrig;         
18270 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73 20 70 72  /* LHS values pr
18280 69 6f 72 20 74 6f 20 72 65 6f 72 64 65 72 69 6e  ior to reorderin
18290 67 20 62 79 20 61 69 4d 61 70 5b 5d 20 2a 2f 0a  g by aiMap[] */.
182a0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
182b0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
182c0 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
182d0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
182e0 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20 20 20   *aiMap = 0;    
182f0 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 76     /* Map from v
18300 65 63 74 6f 72 20 66 69 65 6c 64 20 74 6f 20 69  ector field to i
18310 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  ndex column */. 
18320 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 30 3b   char *zAff = 0;
18330 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
18340 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 63 6f  ty string for co
18350 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20 69  mparisons */.  i
18360 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20 20 20 20  nt nVector;     
18370 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
18380 76 65 63 74 6f 72 73 20 66 6f 72 20 74 68 69 73  vectors for this
18390 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
183a0 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b 20 20 20    int iDummy;   
183b0 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79          /* Dummy
183c0 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 65 78   parameter to ex
183d0 70 72 43 6f 64 65 56 65 63 74 6f 72 28 29 20 2a  prCodeVector() *
183e0 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b  /.  Expr *pLeft;
183f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18400 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
18410 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
18420 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
18430 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e 74     /* loop count
18440 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  er */.  int dest
18450 53 74 65 70 32 3b 20 20 20 20 20 20 20 20 2f 2a  Step2;        /*
18460 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 77   Where to jump w
18470 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65 6e 20 69  hen NULLs seen i
18480 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20 20 69 6e  n step 2 */.  in
18490 74 20 64 65 73 74 53 74 65 70 36 20 3d 20 30 3b  t destStep6 = 0;
184a0 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
184b0 63 6f 64 65 20 66 6f 72 20 53 74 65 70 20 36 20  code for Step 6 
184c0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 72 75  */.  int addrTru
184d0 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a 20 41 64  thOp;      /* Ad
184e0 64 72 65 73 73 20 6f 66 20 6f 70 63 6f 64 65 20  dress of opcode 
184f0 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20  that determines 
18500 74 68 65 20 49 4e 20 69 73 20 74 72 75 65 20 2a  the IN is true *
18510 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e 6f 74 4e  /.  int destNotN
18520 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ull;      /* Jum
18530 70 20 68 65 72 65 20 69 66 20 61 20 63 6f 6d 70  p here if a comp
18540 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 74 72  arison is not tr
18550 75 65 20 69 6e 20 73 74 65 70 20 36 20 2a 2f 0a  ue in step 6 */.
18560 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
18570 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
18580 66 20 74 68 65 20 73 74 65 70 2d 36 20 6c 6f 6f  f the step-6 loo
18590 70 20 2a 2f 20 0a 0a 20 20 70 4c 65 66 74 20 3d  p */ ..  pLeft =
185a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
185b0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
185c0 43 68 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20  CheckIN(pParse, 
185d0 70 45 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b  pExpr) ) return;
185e0 0a 20 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e  .  zAff = exprIN
185f0 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
18600 20 70 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74   pExpr);.  nVect
18610 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  or = sqlite3Expr
18620 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
18630 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61  ->pLeft);.  aiMa
18640 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  p = (int*)sqlite
18650 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  3DbMallocZero(. 
18660 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c       pParse->db,
18670 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66   nVector*(sizeof
18680 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63  (int) + sizeof(c
18690 68 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20  har)) + 1.  );. 
186a0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
186b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
186c0 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  goto sqlite3Expr
186d0 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72  CodeIN_oom_error
186e0 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  ;..  /* Attempt 
186f0 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52  to compute the R
18700 48 53 2e 20 41 66 74 65 72 20 74 68 69 73 20 73  HS. After this s
18710 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67  tep, if anything
18720 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a   other than.  **
18730 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
18740 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
18750 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 69 74 68  table opened ith
18760 20 63 75 72 73 6f 72 20 70 45 78 70 72 2d 3e 69   cursor pExpr->i
18770 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e 74  Table .  ** cont
18780 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20  ains the values 
18790 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
187a0 20 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44 45   RHS. If IN_INDE
187b0 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e  X_NOOP is return
187c0 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48 53  ed,.  ** the RHS
187d0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
187e0 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20 76  n coded.  */.  v
187f0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
18800 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
18810 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d   );       /* OOM
18820 20 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20   detected prior 
18830 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
18840 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
18850 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20  ment((v, "begin 
18860 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54  IN expr"));.  eT
18870 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
18880 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
18890 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20   pExpr,.        
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188b0 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45       IN_INDEX_ME
188c0 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e  MBERSHIP | IN_IN
188d0 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20  DEX_NOOP_OK,.   
188e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188f0 20 20 20 20 20 20 20 20 20 20 64 65 73 74 49 66            destIf
18900 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c  False==destIfNul
18910 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73  l ? 0 : &rRhsHas
18920 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a 20  Null, aiMap);.. 
18930 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
18940 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72  >nErr || nVector
18950 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e  ==1 || eType==IN
18960 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20  _INDEX_EPH.     
18970 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49    || eType==IN_I
18980 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c  NDEX_INDEX_ASC |
18990 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  | eType==IN_INDE
189a0 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20  X_INDEX_DESC .  
189b0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
189c0 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66  _DEBUG.  /* Conf
189d0 69 72 6d 20 74 68 61 74 20 61 69 4d 61 70 5b 5d  irm that aiMap[]
189e0 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f   contains nVecto
189f0 72 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  r integer values
18a00 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 0a 20   between 0 and. 
18a10 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a   ** nVector-1. *
18a20 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
18a30 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
18a40 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20    int j, cnt;.  
18a50 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a    for(cnt=j=0; j
18a60 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69  <nVector; j++) i
18a70 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29  f( aiMap[j]==i )
18a80 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65   cnt++;.    asse
18a90 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20  rt( cnt==1 );.  
18aa0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
18ab0 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65  ode the LHS, the
18ac0 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65   <expr> from "<e
18ad0 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20  xpr> IN (...)". 
18ae0 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 61 20  If the LHS is a 
18af0 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68  .  ** vector, th
18b00 65 6e 20 69 74 20 69 73 20 73 74 6f 72 65 64 20  en it is stored 
18b10 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e  in an array of n
18b20 56 65 63 74 6f 72 20 72 65 67 69 73 74 65 72 73  Vector registers
18b30 20 73 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20   starting .  ** 
18b40 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  at r1..  **.  **
18b50 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
18b60 64 65 78 28 29 20 6d 69 67 68 74 20 68 61 76 65  dex() might have
18b70 20 72 65 6f 72 64 65 72 65 64 20 74 68 65 20 66   reordered the f
18b80 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4c 48 53  ields of the LHS
18b90 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20   vector.  ** so 
18ba0 74 68 61 74 20 74 68 65 20 66 69 65 6c 64 73 20  that the fields 
18bb0 61 72 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  are in the same 
18bc0 6f 72 64 65 72 20 61 73 20 61 6e 20 65 78 69 73  order as an exis
18bd0 74 69 6e 67 20 69 6e 64 65 78 2e 20 20 20 54 68  ting index.   Th
18be0 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61  e.  ** aiMap[] a
18bf0 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  rray contains a 
18c00 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65  mapping from the
18c10 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20 66 69   original LHS fi
18c20 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a  eld order to.  *
18c30 2a 20 74 68 65 20 66 69 65 6c 64 20 6f 72 64 65  * the field orde
18c40 72 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74  r that matches t
18c50 68 65 20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20  he RHS index..  
18c60 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
18c70 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
18c80 29 3b 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d 20  );.  rLhsOrig = 
18c90 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70  exprCodeVector(p
18ca0 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 69  Parse, pLeft, &i
18cb0 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d  Dummy);.  for(i=
18cc0 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26 26 20  0; i<nVector && 
18cd0 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b  aiMap[i]==i; i++
18ce0 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20 66  ){} /* Are LHS f
18cf0 69 65 6c 64 73 20 72 65 6f 72 64 65 72 65 64 3f  ields reordered?
18d00 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65   */.  if( i==nVe
18d10 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c  ctor ){.    /* L
18d20 48 53 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f  HS fields are no
18d30 74 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20  t reordered */. 
18d40 20 20 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72     rLhs = rLhsOr
18d50 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ig;.  }else{.   
18d60 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f 72   /* Need to reor
18d70 64 65 72 20 74 68 65 20 4c 48 53 20 66 69 65 6c  der the LHS fiel
18d80 64 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ds according to 
18d90 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68  aiMap */.    rLh
18da0 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  s = sqlite3GetTe
18db0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
18dc0 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f  nVector);.    fo
18dd0 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
18de0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
18df0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
18e00 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73  v, OP_Copy, rLhs
18e10 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d  Orig+i, rLhs+aiM
18e20 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  ap[i], 0);.    }
18e30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71  .  }..  /* If sq
18e40 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
18e50 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  () did not find 
18e60 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  or create an ind
18e70 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ex that is.  ** 
18e80 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61  suitable for eva
18e90 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f  luating the IN o
18ea0 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76  perator, then ev
18eb0 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20  aluate using a. 
18ec0 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20   ** sequence of 
18ed0 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a  comparisons..  *
18ee0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73  *.  ** This is s
18ef0 74 65 70 20 28 31 29 20 69 6e 20 74 68 65 20 69  tep (1) in the i
18f00 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70  n-operator.md op
18f10 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74 68  timized algorith
18f20 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  m..  */.  if( eT
18f30 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f  ype==IN_INDEX_NO
18f40 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  OP ){.    ExprLi
18f50 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
18f60 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
18f70 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
18f80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
18f90 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
18fa0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  r->pLeft);.    i
18fb0 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c  nt labelOk = sql
18fc0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18fd0 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32  l(v);.    int r2
18fe0 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20  , regToFree;.   
18ff0 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d   int regCkNull =
19000 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   0;.    int ii;.
19010 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
19020 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
19030 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
19040 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73  ) );.    if( des
19050 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46  tIfNull!=destIfF
19060 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alse ){.      re
19070 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  gCkNull = sqlite
19080 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
19090 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
190a0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
190b0 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73 2c  OP_BitAnd, rLhs,
190c0 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c 6c   rLhs, regCkNull
190d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
190e0 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d  (ii=0; ii<pList-
190f0 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
19100 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
19110 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
19120 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  arse, pList->a[i
19130 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f  i].pExpr, &regTo
19140 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Free);.      if(
19150 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71   regCkNull && sq
19160 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
19170 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  ll(pList->a[ii].
19180 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
19190 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
191a0 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64  Op3(v, OP_BitAnd
191b0 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c  , regCkNull, r2,
191c0 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20   regCkNull);.   
191d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
191e0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
191f0 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d   || destIfNull!=
19200 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
19210 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19220 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
19230 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b  q, rLhs, labelOk
19240 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20  , r2,.          
19250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19260 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34  (void*)pColl, P4
19270 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
19280 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
19290 66 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e  f(v, ii<pList->n
192a0 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20  Expr-1);.       
192b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
192c0 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45  v, ii==pList->nE
192d0 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  xpr-1);.        
192e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
192f0 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b  eP5(v, zAff[0]);
19300 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65        assert( de
19320 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
19330 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20  False );.       
19340 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19350 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68  p4(v, OP_Ne, rLh
19360 73 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  s, destIfFalse, 
19370 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r2,.            
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
19390 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
193a0 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76  OLLSEQ); VdbeCov
193b0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
193c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
193d0 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d  ngeP5(v, zAff[0]
193e0 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   | SQLITE_JUMPIF
193f0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
19400 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
19410 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
19420 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20  e, regToFree);. 
19430 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67     }.    if( reg
19440 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  CkNull ){.      
19450 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19460 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
19470 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49  regCkNull, destI
19480 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65  fNull); VdbeCove
19490 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
194a0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
194b0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
194c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
194d0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
194e0 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20  l(v, labelOk);. 
194f0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19500 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19510 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20   regCkNull);.   
19520 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70   goto sqlite3Exp
19530 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64  rCodeIN_finished
19540 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70  ;.  }..  /* Step
19550 20 32 3a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   2: Check to see
19560 20 69 66 20 74 68 65 20 4c 48 53 20 63 6f 6e 74   if the LHS cont
19570 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63 6f  ains any NULL co
19580 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a 20  lumns.  If the. 
19590 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f 6e   ** LHS does con
195a0 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e 20  tain NULLs then 
195b0 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20  the result must 
195c0 62 65 20 65 69 74 68 65 72 20 46 41 4c 53 45 20  be either FALSE 
195d0 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65  or NULL..  ** We
195e0 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70 20   will then skip 
195f0 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
19600 68 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20  h of the RHS..  
19610 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 4e  */.  if( destIfN
19620 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65  ull==destIfFalse
19630 20 29 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70   ){.    destStep
19640 32 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b  2 = destIfFalse;
19650 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
19660 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 53 74  stStep2 = destSt
19670 65 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ep6 = sqlite3Vdb
19680 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
19690 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
196a0 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
196b0 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
196c0 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
196d0 75 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c  ubexpr(pExpr->pL
196e0 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  eft, i);.    if(
196f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
19700 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20 20  eNull(p) ){.    
19710 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19720 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
19730 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 53 74  , rLhs+i, destSt
19740 65 70 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ep2);.      Vdbe
19750 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19760 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65   }.  }..  /* Ste
19770 70 20 33 2e 20 20 54 68 65 20 4c 48 53 20 69 73  p 3.  The LHS is
19780 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20 62 65   now known to be
19790 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20 74   non-NULL.  Do t
197a0 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  he binary search
197b0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53  .  ** of the RHS
197c0 20 75 73 69 6e 67 20 74 68 65 20 4c 48 53 20 61   using the LHS a
197d0 73 20 61 20 70 72 6f 62 65 2e 20 20 49 66 20 66  s a probe.  If f
197e0 6f 75 6e 64 2c 20 74 68 65 20 72 65 73 75 6c 74  ound, the result
197f0 20 69 73 0a 20 20 2a 2a 20 74 72 75 65 2e 0a 20   is.  ** true.. 
19800 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
19810 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
19820 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
19830 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20  s case, the RHS 
19840 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20  is the ROWID of 
19850 74 61 62 6c 65 20 62 2d 74 72 65 65 20 61 6e 64  table b-tree and
19860 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20 20 20 20   so we also.    
19870 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  ** know that the
19880 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c   RHS is non-NULL
19890 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 63 6f 6d  .  Hence, we com
198a0 62 69 6e 65 20 73 74 65 70 73 20 33 20 61 6e 64  bine steps 3 and
198b0 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61   4.    ** into a
198c0 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
198d0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
198e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
198f0 65 65 6b 52 6f 77 69 64 2c 20 70 45 78 70 72 2d  eekRowid, pExpr-
19900 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
19910 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20  alse, rLhs);.   
19920 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19930 3b 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f  ;.    addrTruthO
19940 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
19950 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
19960 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54 72  );  /* Return Tr
19970 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ue */.  }else{. 
19980 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19990 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp4(v, OP_Affin
199a0 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74  ity, rLhs, nVect
199b0 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65  or, 0, zAff, nVe
199c0 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 64  ctor);.    if( d
199d0 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
199e0 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
199f0 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70 20  /* Combine Step 
19a00 33 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e 74  3 and Step 5 int
19a10 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  o a single opcod
19a20 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
19a30 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
19a40 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
19a50 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
19a60 65 73 74 49 66 46 61 6c 73 65 2c 0a 20 20 20 20  estIfFalse,.    
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a80 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65         rLhs, nVe
19a90 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72  ctor); VdbeCover
19aa0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 67 6f  age(v);.      go
19ab0 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  to sqlite3ExprCo
19ac0 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  deIN_finished;. 
19ad0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72 64 69     }.    /* Ordi
19ae0 6e 61 72 79 20 53 74 65 70 20 33 2c 20 66 6f 72  nary Step 3, for
19af0 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
19b00 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c 20 61  FALSE and NULL a
19b10 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  re distinct */. 
19b20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d     addrTruthOp =
19b30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19b40 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
19b50 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
19b60 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
19b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b80 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c             rLhs,
19b90 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43   nVector); VdbeC
19ba0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
19bb0 0a 20 20 2f 2a 20 53 74 65 70 20 34 2e 20 20 49  .  /* Step 4.  I
19bc0 66 20 74 68 65 20 52 48 53 20 69 73 20 6b 6e 6f  f the RHS is kno
19bd0 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c  wn to be non-NUL
19be0 4c 20 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74  L and we did not
19bf0 20 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61   find.  ** an ma
19c00 74 63 68 20 6f 6e 20 74 68 65 20 73 65 61 72 63  tch on the searc
19c10 68 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  h above, then th
19c20 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65  e result must be
19c30 20 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69   FALSE..  */.  i
19c40 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 26  f( rRhsHasNull &
19c50 26 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a  & nVector==1 ){.
19c60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19c70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp2(v, OP_NotN
19c80 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  ull, rRhsHasNull
19c90 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
19ca0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
19cb0 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  (v);.  }..  /* S
19cc0 74 65 70 20 35 2e 20 20 49 66 20 77 65 20 64 6f  tep 5.  If we do
19cd0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
19ce0 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  the difference b
19cf0 65 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a  etween NULL and.
19d00 20 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e    ** FALSE, then
19d10 20 6a 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c   just return fal
19d20 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  se. .  */.  if( 
19d30 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
19d40 74 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65  tIfNull ) sqlite
19d50 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
19d60 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a  tIfFalse);..  /*
19d70 20 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68   Step 6: Loop th
19d80 72 6f 75 67 68 20 72 6f 77 73 20 6f 66 20 74 68  rough rows of th
19d90 65 20 52 48 53 2e 20 20 43 6f 6d 70 61 72 65 20  e RHS.  Compare 
19da0 65 61 63 68 20 72 6f 77 20 74 6f 20 74 68 65 20  each row to the 
19db0 4c 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79  LHS..  ** If any
19dc0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e   comparison is N
19dd0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ULL, then the re
19de0 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49  sult is NULL.  I
19df0 66 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61  f all.  ** compa
19e00 72 69 73 6f 6e 73 20 61 72 65 20 46 41 4c 53 45  risons are FALSE
19e10 20 74 68 65 6e 20 74 68 65 20 66 69 6e 61 6c 20   then the final 
19e20 72 65 73 75 6c 74 20 69 73 20 46 41 4c 53 45 2e  result is FALSE.
19e30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61  .  **.  ** For a
19e40 20 73 63 61 6c 61 72 20 4c 48 53 2c 20 69 74 20   scalar LHS, it 
19e50 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
19e60 20 63 68 65 63 6b 20 6a 75 73 74 20 74 68 65 20   check just the 
19e70 66 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f  first row.  ** o
19e80 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a  f the RHS..  */.
19e90 20 20 69 66 28 20 64 65 73 74 53 74 65 70 36 20    if( destStep6 
19ea0 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  ) sqlite3VdbeRes
19eb0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
19ec0 74 53 74 65 70 36 29 3b 0a 20 20 61 64 64 72 54  tStep6);.  addrT
19ed0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
19ee0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
19ef0 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ind, pExpr->iTab
19f00 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  le, destIfFalse)
19f10 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
19f20 28 76 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74  (v);.  if( nVect
19f30 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64 65 73 74  or>1 ){.    dest
19f40 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  NotNull = sqlite
19f50 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
19f60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19f70 2f 2a 20 46 6f 72 20 6e 56 65 63 74 6f 72 3d 3d  /* For nVector==
19f80 31 2c 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73  1, combine steps
19f90 20 36 20 61 6e 64 20 37 20 62 79 20 69 6d 6d 65   6 and 7 by imme
19fa0 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 69 6e  diately returnin
19fb0 67 0a 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69  g.    ** FALSE i
19fc0 66 20 74 68 65 20 66 69 72 73 74 20 63 6f 6d 70  f the first comp
19fd0 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 4e 55  arison is not NU
19fe0 4c 4c 20 2a 2f 0a 20 20 20 20 64 65 73 74 4e 6f  LL */.    destNo
19ff0 74 4e 75 6c 6c 20 3d 20 64 65 73 74 49 66 46 61  tNull = destIfFa
1a000 6c 73 65 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  lse;.  }.  for(i
1a010 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
1a020 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1a030 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ;.    CollSeq *p
1a040 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 33  Coll;.    int r3
1a050 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1a060 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1a070 20 20 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63    p = sqlite3Vec
1a080 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
1a090 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 70  pLeft, i);.    p
1a0a0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1a0b0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1a0c0 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
1a0d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1a0e0 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d  P_Column, pExpr-
1a0f0 3e 69 54 61 62 6c 65 2c 20 69 2c 20 72 33 29 3b  >iTable, i, r3);
1a100 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a110 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp4(v, OP_Ne,
1a120 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74   rLhs+i, destNot
1a130 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20  Null, r3,.      
1a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a150 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34  (void*)pColl, P4
1a160 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56  _COLLSEQ);.    V
1a170 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a180 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1a190 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1a1a0 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  , r3);.  }.  sql
1a1b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a1c0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
1a1d0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28  stIfNull);.  if(
1a1e0 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20   nVector>1 ){.  
1a1f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1a200 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
1a210 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  tNotNull);.    s
1a220 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a230 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 45 78  (v, OP_Next, pEx
1a240 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72  pr->iTable, addr
1a250 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64 62 65  Top+1);.    Vdbe
1a260 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1a270 20 20 2f 2a 20 53 74 65 70 20 37 3a 20 20 49 66    /* Step 7:  If
1a280 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1a290 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68  oint, we know th
1a2a0 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  at the result mu
1a2b0 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 66 61 6c  st.    ** be fal
1a2c0 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  se. */.    sqlit
1a2d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a2e0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
1a2f0 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a 20  IfFalse);.  }.. 
1a300 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65 20 69   /* Jumps here i
1a310 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 74 75 72  n order to retur
1a320 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73 71 6c  n true. */.  sql
1a330 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1a340 28 76 2c 20 61 64 64 72 54 72 75 74 68 4f 70 29  (v, addrTruthOp)
1a350 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ;..sqlite3ExprCo
1a360 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a 0a 20  deIN_finished:. 
1a370 20 69 66 28 20 72 4c 68 73 21 3d 72 4c 68 73 4f   if( rLhs!=rLhsO
1a380 72 69 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c  rig ) sqlite3Rel
1a390 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1a3a0 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 73 71 6c  se, rLhs);.  sql
1a3b0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1a3c0 28 70 50 61 72 73 65 29 3b 0a 20 20 56 64 62 65  (pParse);.  Vdbe
1a3d0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
1a3e0 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 73 71 6c   IN expr"));.sql
1a3f0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f  ite3ExprCodeIN_o
1a400 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  om_error:.  sqli
1a410 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1a420 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a 20 20  ->db, aiMap);.  
1a430 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1a440 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b  arse->db, zAff);
1a450 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1a460 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1a470 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
1a480 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1a490 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47  NG_POINT./*.** G
1a4a0 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
1a4b0 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
1a4c0 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e   put the floatin
1a4d0 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65  g point.** value
1a4e0 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b   described by z[
1a4f0 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
1a500 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
1a510 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  * The z[] string
1a520 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e   will probably n
1a530 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69  ot be zero-termi
1a540 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20  nated.  But the 
1a550 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74  .** z[n] charact
1a560 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
1a570 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
1a580 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c   that does not l
1a590 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20  ook.** like the 
1a5a0 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20  continuation of 
1a5b0 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  the number..*/.s
1a5c0 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52  tatic void codeR
1a5d0 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  eal(Vdbe *v, con
1a5e0 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
1a5f0 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20  negateFlag, int 
1a600 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57  iMem){.  if( ALW
1a610 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20  AYS(z!=0) ){.   
1a620 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20   double value;. 
1a630 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a     sqlite3AtoF(z
1a640 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65  , &value, sqlite
1a650 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51  3Strlen30(z), SQ
1a660 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
1a670 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33  assert( !sqlite3
1a680 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20  IsNaN(value) ); 
1a690 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20  /* The new AtoF 
1a6a0 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61  never returns Na
1a6b0 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67  N */.    if( neg
1a6c0 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20  ateFlag ) value 
1a6d0 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73 71  = -value;.    sq
1a6e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
1a6f0 75 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20  up8(v, OP_Real, 
1a700 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a  0, iMem, 0, (u8*
1a710 29 26 76 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c  )&value, P4_REAL
1a720 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
1a730 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1a740 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
1a750 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
1a760 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69  e integer descri
1a770 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b  be by.** text z[
1a780 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
1a790 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
1a7a0 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  * Expr.u.zToken 
1a7b0 69 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61  is always UTF8 a
1a7c0 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  nd zero-terminat
1a7d0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1a7e0 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50  id codeInteger(P
1a7f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1a800 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e  pr *pExpr, int n
1a810 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  egFlag, int iMem
1a820 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1a830 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1a840 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
1a850 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
1a860 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45  {.    int i = pE
1a870 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  xpr->u.iValue;. 
1a880 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
1a890 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c  );.    if( negFl
1a8a0 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20  ag ) i = -i;.   
1a8b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a8c0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1a8d0 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65  , i, iMem);.  }e
1a8e0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a  lse{.    int c;.
1a8f0 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20      i64 value;. 
1a900 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1a910 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
1a920 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
1a930 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20  z!=0 );.    c = 
1a940 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
1a950 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b  oI64(z, &value);
1a960 0a 20 20 20 20 69 66 28 20 63 3d 3d 31 20 7c 7c  .    if( c==1 ||
1a970 20 28 63 3d 3d 32 20 26 26 20 21 6e 65 67 46 6c   (c==2 && !negFl
1a980 61 67 29 20 7c 7c 20 28 6e 65 67 46 6c 61 67 20  ag) || (negFlag 
1a990 26 26 20 76 61 6c 75 65 3d 3d 53 4d 41 4c 4c 45  && value==SMALLE
1a9a0 53 54 5f 49 4e 54 36 34 29 29 7b 0a 23 69 66 64  ST_INT64)){.#ifd
1a9b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1a9c0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
1a9d0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1a9e0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65  Msg(pParse, "ove
1a9f0 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20  rsized integer: 
1aa00 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f  %s%s", negFlag ?
1aa10 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23   "-" : "", z);.#
1aa20 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
1aa30 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54  ITE_OMIT_HEX_INT
1aa40 45 47 45 52 0a 20 20 20 20 20 20 69 66 28 20 73  EGER.      if( s
1aa50 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
1aa60 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a  z,"0x",2)==0 ){.
1aa70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1aa80 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1aa90 22 68 65 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f  "hex literal too
1aaa0 20 62 69 67 3a 20 25 73 25 73 22 2c 20 6e 65 67   big: %s%s", neg
1aab0 46 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a 29 3b 0a  Flag?"-":"",z);.
1aac0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
1aad0 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
1aae0 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a     codeReal(v, z
1aaf0 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29  , negFlag, iMem)
1ab00 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1ab10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ab20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b    if( negFlag ){
1ab30 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20   value = c==2 ? 
1ab40 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a  SMALLEST_INT64 :
1ab50 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20   -value; }.     
1ab60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ab70 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74  p4Dup8(v, OP_Int
1ab80 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20  64, 0, iMem, 0, 
1ab90 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f  (u8*)&value, P4_
1aba0 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 0a 20 20  INT64);.    }.  
1abb0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  }.}../*.** Erase
1abc0 20 63 6f 6c 75 6d 6e 2d 63 61 63 68 65 20 65 6e   column-cache en
1abd0 74 72 79 20 6e 75 6d 62 65 72 20 69 0a 2a 2f 0a  try number i.*/.
1abe0 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 68  static void cach
1abf0 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73  eEntryClear(Pars
1ac00 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1ac10 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
1ac20 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65  >aColCache[i].te
1ac30 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28  mpReg ){.    if(
1ac40 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
1ac50 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
1ac60 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
1ac70 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
1ac80 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
1ac90 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50  nTempReg++] = pP
1aca0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1acb0 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  i].iReg;.    }. 
1acc0 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f   }.  pParse->nCo
1acd0 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 69 66 28 20  lCache--;.  if( 
1ace0 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
1acf0 63 68 65 20 29 7b 0a 20 20 20 20 70 50 61 72 73  che ){.    pPars
1ad00 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20  e->aColCache[i] 
1ad10 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  = pParse->aColCa
1ad20 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  che[pParse->nCol
1ad30 43 61 63 68 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 0a  Cache];.  }.}...
1ad40 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20  /*.** Record in 
1ad50 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1ad60 20 74 68 61 74 20 61 20 70 61 72 74 69 63 75 6c   that a particul
1ad70 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61  ar column from a
1ad80 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74  .** particular t
1ad90 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69  able is stored i
1ada0 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72  n a particular r
1adb0 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64  egister..*/.void
1adc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1add0 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50  eStore(Parse *pP
1ade0 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20  arse, int iTab, 
1adf0 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52  int iCol, int iR
1ae00 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
1ae10 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e  int minLru;.  in
1ae20 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75  t idxLru;.  stru
1ae30 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
1ae40 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e  ..  /* Unless an
1ae50 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
1ae60 72 65 64 2c 20 72 65 67 69 73 74 65 72 20 6e 75  red, register nu
1ae70 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73  mbers are always
1ae80 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20   positive. */.  
1ae90 61 73 73 65 72 74 28 20 69 52 65 67 3e 30 20 7c  assert( iReg>0 |
1aea0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
1aeb0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
1aec0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1aed0 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31  assert( iCol>=-1
1aee0 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29   && iCol<32768 )
1aef0 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c  ;  /* Finite col
1af00 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a  umn numbers */..
1af10 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f    /* The SQLITE_
1af20 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67  ColumnCache flag
1af30 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f   disables the co
1af40 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69  lumn cache.  Thi
1af50 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66  s is used.  ** f
1af60 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20  or testing only 
1af70 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  - to verify that
1af80 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67   SQLite always g
1af90 65 74 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73  ets the same ans
1afa0 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e  wer.  ** with an
1afb0 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f  d without the co
1afc0 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f  lumn cache..  */
1afd0 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
1afe0 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72  ionDisabled(pPar
1aff0 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
1b000 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65  olumnCache) ) re
1b010 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  turn;..  /* Firs
1b020 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78  t replace any ex
1b030 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20  isting entry..  
1b040 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
1b050 2c 20 74 68 65 20 77 61 79 20 74 68 65 20 63 6f  , the way the co
1b060 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75  lumn cache is cu
1b070 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65  rrently used, we
1b080 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a   are guaranteed.
1b090 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62    ** that the ob
1b0a0 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  ject will never 
1b0b0 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20 63 61  already be in ca
1b0c0 63 68 65 2e 20 20 56 65 72 69 66 79 20 74 68 69  che.  Verify thi
1b0d0 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a  s guarantee..  *
1b0e0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1b0f0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
1b100 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1b110 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
1b120 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ache; i++, p++){
1b130 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1b140 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20  iTable!=iTab || 
1b150 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  p->iColumn!=iCol
1b160 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
1b170 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
1b180 65 20 69 73 20 61 6c 72 65 61 64 79 20 66 75 6c  e is already ful
1b190 6c 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65  l, delete the le
1b1a0 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65  ast recently use
1b1b0 64 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 66 28  d entry */.  if(
1b1c0 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
1b1d0 68 65 3e 3d 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  he>=SQLITE_N_COL
1b1e0 43 41 43 48 45 20 29 7b 0a 20 20 20 20 6d 69 6e  CACHE ){.    min
1b1f0 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66 66 66  Lru = 0x7fffffff
1b200 3b 0a 20 20 20 20 69 64 78 4c 72 75 20 3d 20 2d  ;.    idxLru = -
1b210 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  1;.    for(i=0, 
1b220 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1b230 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
1b240 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
1b250 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1b260 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a  ->lru<minLru ){.
1b270 20 20 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d          idxLru =
1b280 20 69 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 4c   i;.        minL
1b290 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20  ru = p->lru;.   
1b2a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1b2b0 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
1b2c0 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20  Cache[idxLru];. 
1b2d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
1b2e0 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  &pParse->aColCac
1b2f0 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43  he[pParse->nColC
1b300 61 63 68 65 2b 2b 5d 3b 0a 20 20 7d 0a 0a 20 20  ache++];.  }..  
1b310 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 65  /* Add the new e
1b320 6e 74 72 79 20 74 6f 20 74 68 65 20 65 6e 64 20  ntry to the end 
1b330 6f 66 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  of the cache */.
1b340 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50    p->iLevel = pP
1b350 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1b360 6c 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  l;.  p->iTable =
1b370 20 69 54 61 62 3b 0a 20 20 70 2d 3e 69 43 6f 6c   iTab;.  p->iCol
1b380 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 70 2d  umn = iCol;.  p-
1b390 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  >iReg = iReg;.  
1b3a0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
1b3b0 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
1b3c0 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
1b3d0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
1b3e0 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72 73  e that registers
1b3f0 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69   between iReg..i
1b400 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62  Reg+nReg-1 are b
1b410 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
1b420 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72  ..** Purge the r
1b430 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
1b440 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  s from the colum
1b450 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64  n cache..*/.void
1b460 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1b470 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70  eRemove(Parse *p
1b480 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
1b490 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
1b4a0 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  t i = 0;.  while
1b4b0 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ( i<pParse->nCol
1b4c0 43 61 63 68 65 20 29 7b 0a 20 20 20 20 73 74 72  Cache ){.    str
1b4d0 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
1b4e0 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
1b4f0 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20 20 69 66  Cache[i];.    if
1b500 28 20 70 2d 3e 69 52 65 67 20 3e 3d 20 69 52 65  ( p->iReg >= iRe
1b510 67 20 26 26 20 70 2d 3e 69 52 65 67 20 3c 20 69  g && p->iReg < i
1b520 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20  Reg+nReg ){.    
1b530 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
1b540 72 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20  r(pParse, i);.  
1b550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1b560 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
1b570 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
1b580 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
1b590 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74  mn cache context
1b5a0 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69  .  Any new entri
1b5b0 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65  es added.** adde
1b5c0 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d to the column 
1b5d0 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
1b5e0 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65   call are remove
1b5f0 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f  d when the.** co
1b600 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20  rresponding pop 
1b610 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
1b620 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1b630 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
1b640 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69  se){.  pParse->i
1b650 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69  CacheLevel++;.#i
1b660 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1b670 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
1b680 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1b690 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1b6a0 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
1b6b0 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20  "PUSH to %d\n", 
1b6c0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1b6d0 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  vel);.  }.#endif
1b6e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
1b6f0 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e   from the column
1b700 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69   cache any entri
1b710 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64 64  es that were add
1b720 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  ed since the.** 
1b730 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 71 6c  the previous sql
1b740 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1b750 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49 6e  h operation.  In
1b760 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
1b770 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61 63  store.** the cac
1b780 68 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  he to the state 
1b790 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f 72 20  it was in prior 
1b7a0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
1b7b0 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  Push..*/.void sq
1b7c0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1b7d0 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  p(Parse *pParse)
1b7e0 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  {.  int i = 0;. 
1b7f0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1b800 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20  >iCacheLevel>=1 
1b810 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61  );.  pParse->iCa
1b820 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64  cheLevel--;.#ifd
1b830 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1b840 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
1b850 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1b860 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
1b870 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50  ){.    printf("P
1b880 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50  OP  to %d\n", pP
1b890 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1b8a0 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  l);.  }.#endif. 
1b8b0 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73 65   while( i<pParse
1b8c0 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20  ->nColCache ){. 
1b8d0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
1b8e0 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 4c 65 76  ColCache[i].iLev
1b8f0 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68  el>pParse->iCach
1b900 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20  eLevel ){.      
1b910 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
1b920 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20  pParse, i);.    
1b930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 2b 2b  }else{.      i++
1b940 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1b950 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68  *.** When a cach
1b960 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75  ed column is reu
1b970 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  sed, make sure t
1b980 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65 72  hat its register
1b990 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
1b9a0 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20   available as a 
1b9b0 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20  temp register.  
1b9c0 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74  ticket #3879:  t
1b9d0 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69  hat same.** regi
1b9e0 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e  ster might be in
1b9f0 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75   the cache in mu
1ba00 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73  ltiple places, s
1ba10 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20  o be sure to.** 
1ba20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f  get them all..*/
1ba30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
1ba40 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
1ba50 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a  Register(Parse *
1ba60 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
1ba70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
1ba80 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1ba90 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
1baa0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1bab0 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  e; i<pParse->nCo
1bac0 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b  lCache; i++, p++
1bad0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
1bae0 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
1baf0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
1bb00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1bb10 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1bb20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69  that will load i
1bb30 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72 65 67  nto register reg
1bb40 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68 61 74  Out a value that
1bb50 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61   is.** appropria
1bb60 74 65 20 66 6f 72 20 74 68 65 20 69 49 64 78 43  te for the iIdxC
1bb70 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol-th column of 
1bb80 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76  index pIdx..*/.v
1bb90 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1bba0 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75  odeLoadIndexColu
1bbb0 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
1bbc0 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61 72  rse,  /* The par
1bbd0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1bbe0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
1bbf0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
1bc00 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74  hose column is t
1bc10 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  o be loaded */. 
1bc20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
1bc30 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1bc40 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 72  ing to a table r
1bc50 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ow */.  int iIdx
1bc60 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20 63  Col,    /* The c
1bc70 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
1bc80 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20  ex to be loaded 
1bc90 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20  */.  int regOut 
1bca0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
1bcb0 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76  e index column v
1bcc0 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
1bcd0 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31  ister */.){.  i1
1bce0 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64 78  6 iTabCol = pIdx
1bcf0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43  ->aiColumn[iIdxC
1bd00 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62 43  ol];.  if( iTabC
1bd10 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20  ol==XN_EXPR ){. 
1bd20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1bd30 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20  >aColExpr );.   
1bd40 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
1bd50 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69  ColExpr->nExpr>i
1bd60 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50  IdxCol );.    pP
1bd70 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d  arse->iSelfTab =
1bd80 20 69 54 61 62 43 75 72 3b 0a 20 20 20 20 73 71   iTabCur;.    sq
1bd90 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
1bda0 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  y(pParse, pIdx->
1bdb0 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78  aColExpr->a[iIdx
1bdc0 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f  Col].pExpr, regO
1bdd0 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
1bde0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1bdf0 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1be00 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
1be10 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69   pIdx->pTable, i
1be20 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20  TabCur,.        
1be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be40 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
1be50 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1be60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1be70 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72  ate code to extr
1be80 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  act the value of
1be90 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
1bea0 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a  umn of a table..
1beb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1bec0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1bed0 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20  OfTable(.  Vdbe 
1bee0 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *v,        /* Th
1bef0 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  e VDBE under con
1bf00 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  struction */.  T
1bf10 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f  able *pTab,    /
1bf20 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  * The table cont
1bf30 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
1bf40 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
1bf50 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  r,    /* The tab
1bf60 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74  le cursor.  Or t
1bf70 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72  he PK cursor for
1bf80 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a   WITHOUT ROWID *
1bf90 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
1bfa0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1bfb0 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78  the column to ex
1bfc0 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  tract */.  int r
1bfd0 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78  egOut      /* Ex
1bfe0 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
1bff0 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74  into this regist
1c000 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  er */.){.  if( p
1c010 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Tab==0 ){.    sq
1c020 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1c030 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
1c040 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67  abCur, iCol, reg
1c050 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
1c060 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
1c070 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62  <0 || iCol==pTab
1c080 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73  ->iPKey ){.    s
1c090 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c0a0 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
1c0b0 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a  abCur, regOut);.
1c0c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1c0d0 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28   op = IsVirtual(
1c0e0 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75  pTab) ? OP_VColu
1c0f0 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a  mn : OP_Column;.
1c100 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c      int x = iCol
1c110 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f  ;.    if( !HasRo
1c120 77 69 64 28 70 54 61 62 29 20 26 26 20 21 49 73  wid(pTab) && !Is
1c130 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
1c140 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74  .      x = sqlit
1c150 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1c160 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
1c170 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43  yIndex(pTab), iC
1c180 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ol);.    }.    s
1c190 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1c1a0 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c  (v, op, iTabCur,
1c1b0 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d   x, regOut);.  }
1c1c0 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29  .  if( iCol>=0 )
1c1d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  {.    sqlite3Col
1c1e0 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
1c1f0 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74  ab, iCol, regOut
1c200 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1c210 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1c220 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
1c230 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
1c240 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61  olumn from.** ta
1c250 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f  ble pTab and sto
1c260 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
1c270 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65  lue in a registe
1c280 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 66 66  r. .**.** An eff
1c290 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 73  ort is made to s
1c2a0 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
1c2b0 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
1c2c0 72 20 69 52 65 67 2e 20 20 54 68 69 73 0a 2a 2a  r iReg.  This.**
1c2d0 20 69 73 20 6e 6f 74 20 67 61 72 61 6e 74 65 65   is not garantee
1c2e0 65 64 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e  ed for GetColumn
1c2f0 28 29 20 2d 20 74 68 65 20 72 65 73 75 6c 74 20  () - the result 
1c300 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e  can be stored in
1c310 0a 2a 2a 20 61 6e 79 20 72 65 67 69 73 74 65 72  .** any register
1c320 2e 20 20 42 75 74 20 74 68 65 20 72 65 73 75 6c  .  But the resul
1c330 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
1c340 74 6f 20 6c 61 6e 64 20 69 6e 20 72 65 67 69 73  to land in regis
1c350 74 65 72 20 69 52 65 67 0a 2a 2a 20 66 6f 72 20  ter iReg.** for 
1c360 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 29  GetColumnToReg()
1c370 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
1c380 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75  st be an open cu
1c390 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20  rsor to pTab in 
1c3a0 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73  iTable when this
1c3b0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
1c3c0 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75  alled.  If iColu
1c3d0 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69  mn<0 then code i
1c3e0 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74  s generated that
1c3f0 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f   extracts the ro
1c400 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  wid..*/.int sqli
1c410 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1c420 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
1c430 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
1c440 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
1c450 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
1c460 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1c470 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70  ,     /* Descrip
1c480 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  tion of the tabl
1c490 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  e we are reading
1c4a0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
1c4b0 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49  Column,     /* I
1c4c0 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
1c4d0 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  e column */.  in
1c4e0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f  t iTable,      /
1c4f0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69  * The cursor poi
1c500 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62  nting to the tab
1c510 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
1c520 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ,        /* Stor
1c530 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
1c540 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20  /.  u8 p5       
1c550 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65       /* P5 value
1c560 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b   for OP_Column +
1c570 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56   FLAGS */.){.  V
1c580 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1c590 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
1c5a0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1c5b0 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69  che *p;..  for(i
1c5c0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
1c5d0 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73  olCache; i<pPars
1c5e0 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
1c5f0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
1c600 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62   p->iTable==iTab
1c610 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  le && p->iColumn
1c620 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ==iColumn ){.   
1c630 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
1c640 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
1c650 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1c660 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
1c670 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52  er(pParse, p->iR
1c680 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  eg);.      retur
1c690 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d  n p->iReg;.    }
1c6a0 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28  .  }  .  assert(
1c6b0 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
1c6c0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1c6d0 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
1c6e0 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  ab, iTable, iCol
1c6f0 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66  umn, iReg);.  if
1c700 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( p5 ){.    sqli
1c710 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1c720 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b  v, p5);.  }else{
1c730 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45     .    sqlite3E
1c740 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
1c750 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43  arse, iTable, iC
1c760 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
1c770 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  }.  return iReg;
1c780 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  .}.void sqlite3E
1c790 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1c7a0 54 6f 52 65 67 28 0a 20 20 50 61 72 73 65 20 2a  ToReg(.  Parse *
1c7b0 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
1c7c0 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1c7d0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1c7e0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1c7f0 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
1c800 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
1c810 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
1c820 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
1c830 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
1c840 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
1c850 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
1c860 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1c870 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
1c880 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
1c890 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
1c8a0 67 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g         /* Sto
1c8b0 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
1c8c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d  */.){.  int r1 =
1c8d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c8e0 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
1c8f0 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 2c  , pTab, iColumn,
1c900 20 69 54 61 62 6c 65 2c 20 69 52 65 67 2c 20 30   iTable, iReg, 0
1c910 29 3b 0a 20 20 69 66 28 20 72 31 21 3d 69 52 65  );.  if( r1!=iRe
1c920 67 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  g ) sqlite3VdbeA
1c930 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
1c940 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  dbe, OP_SCopy, r
1c950 31 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a  1, iReg);.}.../*
1c960 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f  .** Clear all co
1c970 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69  lumn cache entri
1c980 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1c990 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
1c9a0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  r(Parse *pParse)
1c9b0 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64  {.  int i;..#ifd
1c9c0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c9d0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
1c9e0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1c9f0 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
1ca00 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43  ){.    printf("C
1ca10 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65  LEAR\n");.  }.#e
1ca20 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ndif.  for(i=0; 
1ca30 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
1ca40 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  che; i++){.    i
1ca50 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  f( pParse->aColC
1ca60 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52 65 67 0a  ache[i].tempReg.
1ca70 20 20 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e       && pParse->
1ca80 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
1ca90 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
1caa0 52 65 67 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  Reg).    ){.    
1cab0 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70     pParse->aTemp
1cac0 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d  Reg[pParse->nTem
1cad0 70 52 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73 65  pReg++] = pParse
1cae0 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69  ->aColCache[i].i
1caf0 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Reg;.    }.  }. 
1cb00 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
1cb10 68 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  he = 0;.}../*.**
1cb20 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   Record the fact
1cb30 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74   that an affinit
1cb40 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63  y change has occ
1cb50 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a  urred on iCount.
1cb60 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61  ** registers sta
1cb70 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72  rting with iStar
1cb80 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1cb90 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1cba0 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20  ityChange(Parse 
1cbb0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74  *pParse, int iSt
1cbc0 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29  art, int iCount)
1cbd0 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  {.  sqlite3ExprC
1cbe0 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
1cbf0 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e  e, iStart, iCoun
1cc00 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  t);.}../*.** Gen
1cc10 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  erate code to mo
1cc20 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ve content from 
1cc30 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e  registers iFrom.
1cc40 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a  ..iFrom+nReg-1.*
1cc50 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69  * over to iTo..i
1cc60 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20  To+nReg-1. Keep 
1cc70 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1cc80 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a   up-to-date..*/.
1cc90 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1cca0 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a  CodeMove(Parse *
1ccb0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
1ccc0 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20  m, int iTo, int 
1ccd0 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28  nReg){.  assert(
1cce0 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67   iFrom>=iTo+nReg
1ccf0 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d   || iFrom+nReg<=
1cd00 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  iTo );.  sqlite3
1cd10 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73  VdbeAddOp3(pPars
1cd20 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76  e->pVdbe, OP_Mov
1cd30 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e  e, iFrom, iTo, n
1cd40 52 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Reg);.  sqlite3E
1cd50 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
1cd60 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52  Parse, iFrom, nR
1cd70 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  eg);.}..#if defi
1cd80 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1cd90 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1cda0 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
1cdb0 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
1cdc0 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69  true if any regi
1cdd0 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67  ster in the rang
1cde0 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e  e iFrom..iTo (in
1cdf0 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75  clusive).** is u
1ce00 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
1ce10 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
1ce20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1ce30 69 6e 65 20 69 73 20 75 73 65 64 20 77 69 74 68  ine is used with
1ce40 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20  in assert() and 
1ce50 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f  testcase() macro
1ce60 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f  s only.** and do
1ce70 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e  es not appear in
1ce80 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e   a normal build.
1ce90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1cea0 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
1ceb0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1cec0 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
1ced0 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  To){.  int i;.  
1cee0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1cef0 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
1cf00 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1cf10 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  che; i<pParse->n
1cf20 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70  ColCache; i++, p
1cf30 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d  ++){.    int r =
1cf40 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66   p->iReg;.    if
1cf50 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c  ( r>=iFrom && r<
1cf60 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b  =iTo ) return 1;
1cf70 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
1cf80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1cf90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1cfa0 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49  TE_DEBUG || SQLI
1cfb0 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
1cfc0 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76   */.../*.** Conv
1cfd0 65 72 74 20 61 20 73 63 61 6c 61 72 20 65 78 70  ert a scalar exp
1cfe0 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20  ression node to 
1cff0 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20 72 65  a TK_REGISTER re
1d000 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67  ferencing.** reg
1d010 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 65  ister iReg.  The
1d020 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
1d030 75 72 65 20 74 68 61 74 20 69 52 65 67 20 61 6c  ure that iReg al
1d040 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a  ready contains.*
1d050 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  * the correct va
1d060 6c 75 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  lue for the expr
1d070 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ession..*/.stati
1d080 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67  c void exprToReg
1d090 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69  ister(Expr *p, i
1d0a0 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f  nt iReg){.  p->o
1d0b0 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d  p2 = p->op;.  p-
1d0c0 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  >op = TK_REGISTE
1d0d0 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  R;.  p->iTable =
1d0e0 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65   iReg;.  ExprCle
1d0f0 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  arProperty(p, EP
1d100 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _Skip);.}../*.**
1d110 20 45 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   Evaluate an exp
1d120 72 65 73 73 69 6f 6e 20 28 65 69 74 68 65 72 20  ression (either 
1d130 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
1d140 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 29  alar expression)
1d150 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68   and store.** th
1d160 65 20 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74  e result in cont
1d170 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72 61 72  inguous temporar
1d180 79 20 72 65 67 69 73 74 65 72 73 2e 20 20 52 65  y registers.  Re
1d190 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1d1a0 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72  f.** the first r
1d1b0 65 67 69 73 74 65 72 20 75 73 65 64 20 74 6f 20  egister used to 
1d1c0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1d1d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
1d1e0 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72  eturned result r
1d1f0 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d  egister is a tem
1d200 70 6f 72 61 72 79 20 73 63 61 6c 61 72 2c 20 74  porary scalar, t
1d210 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a  hen also write.*
1d220 2a 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  * that register 
1d230 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69 46  number into *piF
1d240 72 65 65 61 62 6c 65 2e 20 20 49 66 20 74 68 65  reeable.  If the
1d250 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74   returned result
1d260 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 69 73 20   register.** is 
1d270 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
1d280 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73  or if the expres
1d290 73 69 6f 6e 20 69 73 20 61 20 76 65 63 74 6f 72  sion is a vector
1d2a0 20 73 65 74 20 2a 70 69 46 72 65 65 61 62 6c 65   set *piFreeable
1d2b0 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61  .** to 0..*/.sta
1d2c0 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65  tic int exprCode
1d2d0 56 65 63 74 6f 72 28 50 61 72 73 65 20 2a 70 50  Vector(Parse *pP
1d2e0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 69  arse, Expr *p, i
1d2f0 6e 74 20 2a 70 69 46 72 65 65 61 62 6c 65 29 7b  nt *piFreeable){
1d300 0a 20 20 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a  .  int iResult;.
1d310 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20    int nResult = 
1d320 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
1d330 72 53 69 7a 65 28 70 29 3b 0a 20 20 69 66 28 20  rSize(p);.  if( 
1d340 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20  nResult==1 ){.  
1d350 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69    iResult = sqli
1d360 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1d370 70 50 61 72 73 65 2c 20 70 2c 20 70 69 46 72 65  pParse, p, piFre
1d380 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  eable);.  }else{
1d390 0a 20 20 20 20 2a 70 69 46 72 65 65 61 62 6c 65  .    *piFreeable
1d3a0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
1d3b0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
1d3c0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  {.#if SQLITE_OMI
1d3d0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20  T_SUBQUERY.     
1d3e0 20 69 52 65 73 75 6c 74 20 3d 20 30 3b 0a 23 65   iResult = 0;.#e
1d3f0 6c 73 65 0a 20 20 20 20 20 20 69 52 65 73 75 6c  lse.      iResul
1d400 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  t = sqlite3CodeS
1d410 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
1d420 20 70 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   p, 0, 0);.#endi
1d430 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
1d440 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1d450 69 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73 65  iResult = pParse
1d460 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
1d470 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1d480 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66  nResult;.      f
1d490 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c  or(i=0; i<nResul
1d4a0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; i++){.       
1d4b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d4c0 46 61 63 74 6f 72 61 62 6c 65 28 70 50 61 72 73  Factorable(pPars
1d4d0 65 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  e, p->x.pList->a
1d4e0 5b 69 5d 2e 70 45 78 70 72 2c 20 69 2b 69 52 65  [i].pExpr, i+iRe
1d4f0 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  sult);.      }. 
1d500 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1d510 6e 20 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f  n iResult;.}.../
1d520 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1d530 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  de into the curr
1d540 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c  ent Vdbe to eval
1d550 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a  uate the given.*
1d560 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41  * expression.  A
1d570 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20  ttempt to store 
1d580 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72  the results in r
1d590 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22  egister "target"
1d5a0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
1d5b0 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72  register where r
1d5c0 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
1d5d0 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68  d..**.** With th
1d5e0 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72  is routine, ther
1d5f0 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65  e is no guarante
1d600 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77  e that results w
1d610 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64  ill.** be stored
1d620 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65   in target.  The
1d630 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65   result might be
1d640 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20   stored in some 
1d650 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65  other.** registe
1d660 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65  r if it is conve
1d670 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20  nient to do so. 
1d680 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
1d690 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68  ction.** must ch
1d6a0 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63  eck the return c
1d6b0 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65  ode and move the
1d6c0 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20   results to the 
1d6d0 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73  desired.** regis
1d6e0 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
1d6f0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1d700 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
1d710 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1d720 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
1d730 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1d740 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d  Vdbe;  /* The VM
1d750 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1d760 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ion */.  int op;
1d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d780 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
1d790 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
1d7a0 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61    int inReg = ta
1d7b0 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  rget;       /* R
1d7c0 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e  esults stored in
1d7d0 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20   register inReg 
1d7e0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1d7f0 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  1 = 0;         /
1d800 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1d810 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1d820 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1d830 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
1d840 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
1d850 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
1d860 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
1d870 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
1d880 31 2c 20 72 32 3b 20 20 20 20 20 20 20 20 20 20  1, r2;          
1d890 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
1d8a0 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
1d8b0 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58   */.  Expr tempX
1d8c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d8d0 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70  /* Temporary exp
1d8e0 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a  ression node */.
1d8f0 20 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20    int p5 = 0;.. 
1d900 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
1d910 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
1d920 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
1d930 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61  f( v==0 ){.    a
1d940 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
1d950 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1d960 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1d970 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70  .  }..  if( pExp
1d980 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d  r==0 ){.    op =
1d990 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73   TK_NULL;.  }els
1d9a0 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70  e{.    op = pExp
1d9b0 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69  r->op;.  }.  swi
1d9c0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
1d9d0 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
1d9e0 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
1d9f0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
1da00 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
1da10 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
1da20 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
1da30 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
1da40 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20  [pExpr->iAgg];. 
1da50 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e       if( !pAggIn
1da60 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29  fo->directMode )
1da70 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1da80 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29  ( pCol->iMem>0 )
1da90 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1daa0 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20   pCol->iMem;.   
1dab0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67     }else if( pAg
1dac0 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e  gInfo->useSortin
1dad0 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  gIdx ){.        
1dae0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1daf0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
1db00 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e  pAggInfo->sortin
1db10 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20  gIdxPTab,.      
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db30 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
1db40 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72  orterColumn, tar
1db50 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  get);.        re
1db60 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1db70 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74     }.      /* Ot
1db80 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68  herwise, fall th
1db90 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43  ru into the TK_C
1dba0 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20  OLUMN case */.  
1dbb0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1dbc0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1dbd0 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70 72  int iTab = pExpr
1dbe0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
1dbf0 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20  if( iTab<0 ){.  
1dc00 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
1dc10 2d 3e 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20  ->ckBase>0 ){.  
1dc20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
1dc30 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73  ating CHECK cons
1dc40 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72  traints or inser
1dc50 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61  ting into partia
1dc60 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  l index */.     
1dc70 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70       return pExp
1dc80 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61  r->iColumn + pPa
1dc90 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20  rse->ckBase;.   
1dca0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1dcb0 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20        /* Coding 
1dcc0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
1dcd0 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
1dce0 20 69 6e 64 65 78 20 77 68 65 72 65 20 63 6f 6c   index where col
1dcf0 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20 20  umn names.      
1dd00 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
1dd10 64 65 78 20 72 65 66 65 72 20 74 6f 20 74 68 65  dex refer to the
1dd20 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68 20   table to which 
1dd30 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67  the index belong
1dd40 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  s */.          i
1dd50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  Tab = pParse->iS
1dd60 65 6c 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20  elfTab;.        
1dd70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1dd80 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
1dd90 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1dda0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ddb0 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddd0 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
1dde0 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74  mn, iTab, target
1ddf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de10 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20   pExpr->op2);.  
1de20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1de30 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
1de40 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
1de50 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  rse, pExpr, 0, t
1de60 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65  arget);.      re
1de70 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1de80 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1de90 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1dea0 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54  POINT.    case T
1deb0 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
1dec0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1ded0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1dee0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1def0 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28  .      codeReal(
1df00 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  v, pExpr->u.zTok
1df10 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  en, 0, target);.
1df20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1df30 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  get;.    }.#endi
1df40 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  f.    case TK_ST
1df50 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73  RING: {.      as
1df60 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1df70 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1df80 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1df90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
1dfa0 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72  oadString(v, tar
1dfb0 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  get, pExpr->u.zT
1dfc0 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72 65 74  oken);.      ret
1dfd0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1dfe0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  }.    case TK_NU
1dff0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
1e000 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e010 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
1e020 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  get);.      retu
1e030 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1e040 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e050 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
1e060 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
1e070 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OB: {.      int 
1e080 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  n;.      const c
1e090 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68  har *z;.      ch
1e0a0 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20  ar *zBlob;.     
1e0b0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1e0c0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1e0d0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1e0e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e0f0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1e100 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d  ]=='x' || pExpr-
1e110 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58  >u.zToken[0]=='X
1e120 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ' );.      asser
1e130 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1e140 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20  en[1]=='\'' );. 
1e150 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d       z = &pExpr-
1e160 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20  >u.zToken[2];.  
1e170 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
1e180 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a  trlen30(z) - 1;.
1e190 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b        assert( z[
1e1a0 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  n]=='\'' );.    
1e1b0 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    zBlob = sqlite
1e1c0 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74  3HexToBlob(sqlit
1e1d0 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20  e3VdbeDb(v), z, 
1e1e0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
1e1f0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1e200 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72  P_Blob, n/2, tar
1e210 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50  get, 0, zBlob, P
1e220 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
1e230 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1e240 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1e250 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
1e260 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  LE: {.      asse
1e270 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1e280 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1e290 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1e2a0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1e2b0 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a  >u.zToken!=0 );.
1e2c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1e2d0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
1e2e0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
1e2f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e300 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70  , OP_Variable, p
1e310 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74  Expr->iColumn, t
1e320 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66  arget);.      if
1e330 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1e340 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20  n[1]!=0 ){.     
1e350 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1e360 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e   = sqlite3VListN
1e370 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d  umToName(pParse-
1e380 3e 70 56 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e  >pVList, pExpr->
1e390 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1e3a0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1e3b0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f  >u.zToken[0]=='?
1e3c0 27 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70  ' || strcmp(pExp
1e3d0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d  r->u.zToken, z)=
1e3e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
1e3f0 61 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30 5d 20  arse->pVList[0] 
1e400 3d 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61 74 65  = 0; /* Indicate
1e410 20 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20 6c 6f   VList may no lo
1e420 6e 67 65 72 20 62 65 20 65 6e 6c 61 72 67 65 64  nger be enlarged
1e430 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
1e440 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
1e450 76 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50 34 5f  v, (char*)z, P4_
1e460 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
1e470 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1e480 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rget;.    }.    
1e490 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
1e4a0 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
1e4b0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
1e4c0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1e4d0 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
1e4e0 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
1e4f0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
1e500 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
1e510 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
1e520 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
1e530 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
1e540 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1e550 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
1e560 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
1e570 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65  ;.      if( inRe
1e580 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20  g!=target ){.   
1e590 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e5a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
1e5b0 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
1e5c0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  t);.        inRe
1e5d0 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
1e5e0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1e5f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e600 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a  P_Cast, target,.
1e610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e620 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
1e630 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
1e640 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29  r->u.zToken, 0))
1e650 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e660 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  ( usedAsColumnCa
1e670 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  che(pParse, inRe
1e680 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20  g, inReg) );.   
1e690 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e6a0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1e6b0 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c  e(pParse, inReg,
1e6c0 20 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   1);.      retur
1e6d0 6e 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23  n inReg;.    }.#
1e6e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1e6f0 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
1e700 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
1e710 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a   case TK_ISNOT:.
1e720 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
1e730 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
1e740 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35   TK_NE;.      p5
1e750 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
1e760 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d  ;.      /* fall-
1e770 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63  through */.    c
1e780 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
1e790 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
1e7a0 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
1e7b0 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
1e7c0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
1e7d0 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
1e7e0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
1e7f0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
1e800 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1e810 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 4c 65  ExprIsVector(pLe
1e820 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ft) ){.        c
1e830 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65  odeVectorCompare
1e840 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1e850 74 61 72 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b  target, op, p5);
1e860 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e870 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1e880 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e890 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72  Parse, pLeft, &r
1e8a0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1e8b0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1e8c0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1e8d0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1e8e0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1e8f0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1e900 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
1e910 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1e920 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
1e930 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
1e940 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20  QLITE_STOREP2 | 
1e950 70 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  p5);.        ass
1e960 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
1e970 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1e980 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
1e990 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1e9a0 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Lt);.        ass
1e9b0 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
1e9c0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1e9d0 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
1e9e0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1e9f0 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Le);.        ass
1ea00 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
1ea10 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1ea20 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
1ea30 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1ea40 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Gt);.        ass
1ea50 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
1ea60 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1ea70 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
1ea80 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1ea90 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Ge);.        ass
1eaa0 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
1eab0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1eac0 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65  OP_Eq); VdbeCove
1ead0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1eae0 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Eq);.        ass
1eaf0 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  ert(TK_NE==OP_Ne
1eb00 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1eb10 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ne); VdbeCove
1eb20 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1eb30 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  Ne);.        tes
1eb40 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1eb50 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
1eb60 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1eb70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
1eb80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1eb90 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  }.    case TK_AN
1eba0 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  D:.    case TK_O
1ebb0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  R:.    case TK_P
1ebc0 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  LUS:.    case TK
1ebd0 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20  _STAR:.    case 
1ebe0 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61  TK_MINUS:.    ca
1ebf0 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63  se TK_REM:.    c
1ec00 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20  ase TK_BITAND:. 
1ec10 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52     case TK_BITOR
1ec20 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  :.    case TK_SL
1ec30 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ASH:.    case TK
1ec40 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73  _LSHIFT:.    cas
1ec50 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20  e TK_RSHIFT: .  
1ec60 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54    case TK_CONCAT
1ec70 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1ec80 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64  ( TK_AND==OP_And
1ec90 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74   );            t
1eca0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1ecb0 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AND );.      ass
1ecc0 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f  ert( TK_OR==OP_O
1ecd0 72 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  r );            
1ece0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ecf0 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61  TK_OR );.      a
1ed00 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d  ssert( TK_PLUS==
1ed10 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20  OP_Add );       
1ed20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1ed30 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20  ==TK_PLUS );.   
1ed40 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49     assert( TK_MI
1ed50 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74  NUS==OP_Subtract
1ed60 20 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65   );     testcase
1ed70 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29  ( op==TK_MINUS )
1ed80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ed90 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69  TK_REM==OP_Remai
1eda0 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73  nder );      tes
1edb0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45  tcase( op==TK_RE
1edc0 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  M );.      asser
1edd0 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50  t( TK_BITAND==OP
1ede0 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20  _BitAnd );      
1edf0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ee00 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20  _BITAND );.     
1ee10 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f   assert( TK_BITO
1ee20 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20  R==OP_BitOr );  
1ee30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ee40 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a  op==TK_BITOR );.
1ee50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1ee60 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64  _SLASH==OP_Divid
1ee70 65 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63  e );       testc
1ee80 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53  ase( op==TK_SLAS
1ee90 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  H );.      asser
1eea0 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50  t( TK_LSHIFT==OP
1eeb0 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20  _ShiftLeft );   
1eec0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1eed0 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _LSHIFT );.     
1eee0 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49   assert( TK_RSHI
1eef0 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68  FT==OP_ShiftRigh
1ef00 74 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  t );  testcase( 
1ef10 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b  op==TK_RSHIFT );
1ef20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1ef30 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e  K_CONCAT==OP_Con
1ef40 63 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74  cat );      test
1ef50 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e  case( op==TK_CON
1ef60 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  CAT );.      r1 
1ef70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1ef80 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1ef90 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1efa0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1efb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1efc0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1efd0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1efe0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1eff0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f000 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c  3(v, op, r2, r1,
1f010 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1f020 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f030 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1f040 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f050 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1f060 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f070 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
1f080 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
1f090 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
1f0a0 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1f0b0 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20   pLeft );.      
1f0c0 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
1f0d0 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
1f0e0 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
1f0f0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1f100 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1f110 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1f120 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  t;.#ifndef SQLIT
1f130 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1f140 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73  POINT.      }els
1f150 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d  e if( pLeft->op=
1f160 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
1f170 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1f180 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1f190 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1f1a0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  ) );.        cod
1f1b0 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e  eReal(v, pLeft->
1f1c0 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72  u.zToken, 1, tar
1f1d0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  get);.        re
1f1e0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e  turn target;.#en
1f1f0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dif.      }else{
1f200 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f  .        tempX.o
1f210 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a  p = TK_INTEGER;.
1f220 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c          tempX.fl
1f230 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75  ags = EP_IntValu
1f240 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  e|EP_TokenOnly;.
1f250 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e          tempX.u.
1f260 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  iValue = 0;.    
1f270 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f280 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f290 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65  rse, &tempX, &re
1f2a0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
1f2b0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1f2c0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f2d0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f2e0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1f2f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f300 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74  ddOp3(v, OP_Subt
1f310 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61  ract, r2, r1, ta
1f320 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74  rget);.        t
1f330 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f340 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  2==0 );.      }.
1f350 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f360 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
1f370 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
1f380 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
1f390 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f  assert( TK_BITNO
1f3a0 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20  T==OP_BitNot ); 
1f3b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f3c0 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20  TK_BITNOT );.   
1f3d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1f3e0 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20  T==OP_Not );    
1f3f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f400 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
1f410 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1f420 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f430 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f440 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1f450 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f460 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1f470 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f480 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
1f490 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
1f4a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f4b0 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
1f4c0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1f4d0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
1f4e0 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  addr;.      asse
1f4f0 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
1f500 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65  P_IsNull );   te
1f510 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1f520 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61  SNULL );.      a
1f530 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
1f540 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
1f550 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f560 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
1f570 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f580 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1f590 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
1f5a0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f5b0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f5c0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f5d0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1f5e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f5f0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1f600 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
1f610 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1f620 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  , op, r1);.     
1f630 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f640 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
1f650 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1f660 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1f670 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
1f680 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f690 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1f6a0 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
1f6b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f6c0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1f6d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f6e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f6f0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
1f700 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
1f710 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  *pInfo = pExpr->
1f720 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1f730 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a  if( pInfo==0 ){.
1f740 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f750 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1f760 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1f770 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
1f780 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1f790 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
1f7a0 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73  of aggregate: %s
1f7b0 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ()", pExpr->u.zT
1f7c0 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
1f7d0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
1f7e0 72 6e 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  rn pInfo->aFunc[
1f7f0 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
1f800 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
1f810 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f820 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
1f830 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
1f840 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20  List *pFarg;    
1f850 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75     /* List of fu
1f860 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1f870 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   */.      int nF
1f880 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  arg;            
1f890 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
1f8a0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1f8b0 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65   */.      FuncDe
1f8c0 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20  f *pDef;        
1f8d0 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
1f8e0 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65   definition obje
1f8f0 63 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  ct */.      cons
1f900 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
1f910 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
1f920 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  on name */.     
1f930 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d   u32 constMask =
1f940 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20   0;     /* Mask 
1f950 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
1f960 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63  ments that are c
1f970 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20  onstant */.     
1f980 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1f990 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1f9a0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
1f9b0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1f9c0 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54  Parse->db;  /* T
1f9d0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1f9e0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ection */.      
1f9f0 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
1fa00 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65  ;      /* The te
1fa10 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64  xt encoding used
1fa20 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
1fa30 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53  e */.      CollS
1fa40 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20  eq *pColl = 0;  
1fa50 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67    /* A collating
1fa60 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20   sequence */..  
1fa70 20 20 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63      if( ConstFac
1fa80 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 26 26  torOk(pParse) &&
1fa90 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
1faa0 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45  nstantNotJoin(pE
1fab0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
1fac0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  /* SQL functions
1fad0 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76   can be expensiv
1fae0 65 2e 20 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76  e. So try to mov
1faf0 65 20 63 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74  e constant funct
1fb00 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ions.        ** 
1fb10 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
1fb20 20 6c 6f 6f 70 2c 20 65 76 65 6e 20 69 66 20 74   loop, even if t
1fb30 68 61 74 20 6d 65 61 6e 73 20 61 6e 20 65 78 74  hat means an ext
1fb40 72 61 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20  ra OP_Copy. */. 
1fb50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
1fb60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
1fb70 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
1fb80 72 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  r, -1);.      }.
1fb90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1fba0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1fbb0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1fbc0 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
1fbd0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1fbe0 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
1fbf0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
1fc00 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20   pFarg = 0;.    
1fc10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1fc20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e   pFarg = pExpr->
1fc30 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d  x.pList;.      }
1fc40 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70  .      nFarg = p
1fc50 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45  Farg ? pFarg->nE
1fc60 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61  xpr : 0;.      a
1fc70 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1fc80 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1fc90 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1fca0 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72       zId = pExpr
1fcb0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1fcc0 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
1fcd0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
1fce0 20 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63   zId, nFarg, enc
1fcf0 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  , 0);.#ifdef SQL
1fd00 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f  ITE_ENABLE_UNKNO
1fd10 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a  WN_SQL_FUNCTION.
1fd20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
1fd30 30 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70  0 && pParse->exp
1fd40 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lain ){.        
1fd50 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
1fd60 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  ndFunction(db, "
1fd70 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c  unknown", nFarg,
1fd80 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
1fd90 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
1fda0 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44  f( pDef==0 || pD
1fdb0 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30  ef->xFinalize!=0
1fdc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1fdd0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1fde0 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e  se, "unknown fun
1fdf0 63 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49  ction: %s()", zI
1fe00 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
1fe10 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1fe20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64    /* Attempt a d
1fe30 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61  irect implementa
1fe40 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
1fe50 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20  t-in COALESCE() 
1fe60 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e  and.      ** IFN
1fe70 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  ULL() functions.
1fe80 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e    This avoids un
1fe90 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 75 61  necessary evalua
1fea0 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tion of.      **
1feb0 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20   arguments past 
1fec0 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55  the first non-NU
1fed0 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  LL argument..   
1fee0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1fef0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
1ff00 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  & SQLITE_FUNC_CO
1ff10 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20  ALESCE ){.      
1ff20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63    int endCoalesc
1ff30 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
1ff40 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1ff50 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
1ff60 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20  rg>=2 );.       
1ff70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ff80 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
1ff90 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
1ffa0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  et);.        for
1ffb0 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=1; i<nFarg; i
1ffc0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
1ffd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ffe0 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
1fff0 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65  target, endCoale
20000 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sce);.          
20010 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
20020 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20030 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
20040 65 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74  e(pParse, target
20050 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
20060 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
20070 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
20080 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20090 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
200a0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
200b0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
200c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
200d0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
200e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
200f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20100 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
20110 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20  endCoalesce);.  
20120 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20130 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
20140 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75  he UNLIKELY() fu
20150 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
20160 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69  p.  The result i
20170 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  s the value.    
20180 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
20190 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  t argument..    
201a0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
201b0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
201c0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c   SQLITE_FUNC_UNL
201d0 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  IKELY ){.       
201e0 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
201f0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  1 );.        ret
20200 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
20210 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
20220 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
20230 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
20240 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
20250 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
20260 20 2f 2a 20 54 68 65 20 41 46 46 49 4e 49 54 59   /* The AFFINITY
20270 28 29 20 66 75 6e 63 74 69 6f 6e 20 65 76 61 6c  () function eval
20280 75 61 74 65 73 20 74 6f 20 61 20 73 74 72 69 6e  uates to a strin
20290 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
202a0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 79  .      ** the ty
202b0 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  pe affinity of t
202c0 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  he argument.  Th
202d0 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
202e0 65 73 74 69 6e 67 20 6f 66 0a 20 20 20 20 20 20  esting of.      
202f0 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 74 79  ** the SQLite ty
20300 70 65 20 6c 6f 67 69 63 2e 0a 20 20 20 20 20 20  pe logic..      
20310 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
20320 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
20330 51 4c 49 54 45 5f 46 55 4e 43 5f 41 46 46 49 4e  QLITE_FUNC_AFFIN
20340 49 54 59 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ITY ){.        c
20350 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 66 66  onst char *azAff
20360 5b 5d 20 3d 20 7b 20 22 62 6c 6f 62 22 2c 20 22  [] = { "blob", "
20370 74 65 78 74 22 2c 20 22 6e 75 6d 65 72 69 63 22  text", "numeric"
20380 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 22 72 65  , "integer", "re
20390 61 6c 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 63  al" };.        c
203a0 68 61 72 20 61 66 66 3b 0a 20 20 20 20 20 20 20  har aff;.       
203b0 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d   assert( nFarg==
203c0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 66 66  1 );.        aff
203d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
203e0 66 69 6e 69 74 79 28 70 46 61 72 67 2d 3e 61 5b  finity(pFarg->a[
203f0 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
20400 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
20410 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67  adString(v, targ
20420 65 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  et, .           
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 20 20 20 61 66 66 20 3f 20 61 7a 41 66 66 5b 61     aff ? azAff[a
20450 66 66 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  ff-SQLITE_AFF_BL
20460 4f 42 5d 20 3a 20 22 6e 6f 6e 65 22 29 3b 0a 20  OB] : "none");. 
20470 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61         return ta
20480 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65  rget;.      }.#e
20490 6e 64 69 66 0a 0a 20 20 20 20 20 20 66 6f 72 28  ndif..      for(
204a0 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b  i=0; i<nFarg; i+
204b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
204c0 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45  i<32 && sqlite3E
204d0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46  xprIsConstant(pF
204e0 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
204f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
20500 73 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b  stcase( i==31 );
20510 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
20520 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33  Mask |= MASKBIT3
20530 32 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  2(i);.        }.
20540 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
20550 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
20560 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
20570 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c  OLL)!=0 && !pCol
20580 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
20590 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
205a0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
205b0 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  , pFarg->a[i].pE
205c0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
205d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
205e0 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20  ( pFarg ){.     
205f0 20 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b     if( constMask
20600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31   ){.          r1
20610 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
20620 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  1;.          pPa
20630 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61  rse->nMem += nFa
20640 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rg;.        }els
20650 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20  e{.          r1 
20660 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
20670 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46  Range(pParse, nF
20680 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  arg);.        }.
20690 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
206a0 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70  length() and typ
206b0 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  eof() functions 
206c0 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72  with a column ar
206d0 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20  gument,.        
206e0 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20 70 61  ** set the P5 pa
206f0 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f  rameter to the O
20700 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20  P_Column opcode 
20710 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  to OPFLAG_LENGTH
20720 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ARG.        ** o
20730 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  r OPFLAG_TYPEOFA
20740 52 47 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  RG respectively,
20750 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65   to avoid unnece
20760 73 73 61 72 79 20 64 61 74 61 0a 20 20 20 20 20  ssary data.     
20770 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20     ** loading.. 
20780 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
20790 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e    if( (pDef->fun
207a0 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45  cFlags & (SQLITE
207b0 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c  _FUNC_LENGTH|SQL
207c0 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29  ITE_FUNC_TYPEOF)
207d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
207e0 20 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20    u8 exprOp;.   
207f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
20800 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Farg==1 );.     
20810 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 61       assert( pFa
20820 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  rg->a[0].pExpr!=
20830 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65  0 );.          e
20840 78 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61  xprOp = pFarg->a
20850 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  [0].pExpr->op;. 
20860 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70           if( exp
20870 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  rOp==TK_COLUMN |
20880 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47  | exprOp==TK_AGG
20890 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
208a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53         assert( S
208b0 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54  QLITE_FUNC_LENGT
208c0 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  H==OPFLAG_LENGTH
208d0 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
208e0 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
208f0 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f  E_FUNC_TYPEOF==O
20900 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
20910 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
20920 65 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66  estcase( pDef->f
20930 75 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41  uncFlags & OPFLA
20940 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20  G_LENGTHARG );. 
20950 20 20 20 20 20 20 20 20 20 20 20 70 46 61 72 67             pFarg
20960 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
20970 32 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20  2 = .           
20980 20 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e         pDef->fun
20990 63 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47  cFlags & (OPFLAG
209a0 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41  _LENGTHARG|OPFLA
209b0 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20  G_TYPEOFARG);.  
209c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
209d0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c    }..        sql
209e0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
209f0 68 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f  h(pParse);     /
20a00 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35  * Ticket 2ea2425
20a10 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20  d34be */.       
20a20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20a30 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
20a40 20 70 46 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20   pFarg, r1, 0,. 
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
20a70 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53  QLITE_ECEL_DUP|S
20a80 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
20a90 52 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  R);.        sqli
20aa0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
20ab0 70 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a  pParse);      /*
20ac0 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
20ad0 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65  34be */.      }e
20ae0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
20af0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
20b00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20b10 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
20b20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
20b30 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e  overload the fun
20b40 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72  ction if the fir
20b50 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20  st argument is. 
20b60 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61       ** a virtua
20b70 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a  l table column..
20b80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
20b90 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63  * For infix func
20ba0 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f  tions (LIKE, GLO
20bb0 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d  B, REGEXP, and M
20bc0 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20  ATCH) use the.  
20bd0 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72      ** second ar
20be0 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20  gument, not the 
20bf0 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72  first, as the ar
20c00 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74  gument to test t
20c10 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
20c20 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  f it is a column
20c30 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   in a virtual ta
20c40 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f  ble.  This is do
20c50 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ne because.     
20c60 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65   ** the left ope
20c70 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75  rand of infix fu
20c80 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65  nctions (the ope
20c90 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a  rand we want to.
20ca0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c        ** control
20cb0 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e   overloading) en
20cc0 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63  ds up as the sec
20cd0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
20ce0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  the.      ** fun
20cf0 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72  ction.  The expr
20d00 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42  ession "A glob B
20d10 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  " is equivalent 
20d20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c  to .      ** "gl
20d30 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e  ob(B,A).  We wan
20d40 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69  t to use the A i
20d50 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20  n "A glob B" to 
20d60 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  test.      ** fo
20d70 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c  r function overl
20d80 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20  oading.  But we 
20d90 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69  use the B term i
20da0 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20  n "glob(B,A)".. 
20db0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
20dc0 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70  ( nFarg>=2 && (p
20dd0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
20de0 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
20df0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
20e00 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
20e10 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
20e20 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
20e30 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
20e40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
20e50 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  Farg>0 ){.      
20e60 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
20e70 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
20e80 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
20e90 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30  Farg, pFarg->a[0
20ea0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
20eb0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
20ec0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
20ed0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
20ee0 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
20ef0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
20f00 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
20f10 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20  fltColl; .      
20f20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20f30 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
20f40 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
20f50 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
20f60 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
20f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20f80 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75  eAddOp4(v, OP_Fu
20f90 6e 63 74 69 6f 6e 30 2c 20 63 6f 6e 73 74 4d 61  nction0, constMa
20fa0 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a  sk, r1, target,.
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fc0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
20fd0 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  Def, P4_FUNCDEF)
20fe0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20ff0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
21000 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  u8)nFarg);.     
21010 20 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f   if( nFarg && co
21020 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20  nstMask==0 ){.  
21030 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
21040 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
21050 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29  arse, r1, nFarg)
21060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21070 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
21080 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
21090 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
210a0 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
210b0 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
210c0 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
210d0 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
210e0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
210f0 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20  TK_EXISTS );.   
21100 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
21110 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
21120 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53      if( op==TK_S
21130 45 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d  ELECT && (nCol =
21140 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
21150 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
21160 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=1 ){.        
21170 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
21180 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43  Error(pParse, nC
21190 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  ol, 1);.      }e
211a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
211b0 75 72 6e 20 73 71 6c 69 74 65 33 43 6f 64 65 53  urn sqlite3CodeS
211c0 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
211d0 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20   pExpr, 0, 0);. 
211e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
211f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
21200 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  se TK_SELECT_COL
21210 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
21220 20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   n;.      if( pE
21230 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62  xpr->pLeft->iTab
21240 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
21250 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
21260 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 43  Table = sqlite3C
21270 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
21280 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
21290 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
212a0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
212b0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30  pExpr->iTable==0
212c0 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   || pExpr->pLeft
212d0 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
212e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
212f0 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20  pr->iTable.     
21300 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62    && pExpr->iTab
21310 6c 65 21 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33  le!=(n = sqlite3
21320 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
21330 45 78 70 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20  Expr->pLeft)) . 
21340 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
21350 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
21360 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75  pParse, "%d colu
21370 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20  mns assigned %d 
21380 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20  values",.       
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213a0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
213b0 69 54 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20  iTable, n);.    
213c0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
213d0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
213e0 54 61 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69  Table + pExpr->i
213f0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20  Column;.    }.  
21400 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
21410 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
21420 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
21430 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
21440 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
21450 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  fNull = sqlite3V
21460 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
21470 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21480 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
21490 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
214a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
214b0 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
214c0 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
214d0 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
214e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
214f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21500 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
21510 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
21520 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
21530 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
21540 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
21550 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21560 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74  P_AddImm, target
21570 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
21580 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
21590 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
215a0 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
215b0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
215c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
215d0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
215e0 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
215f0 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
21600 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20  AND z.    **.   
21610 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69   ** This is equi
21620 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a  valent to.    **
21630 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20  .    **    x>=y 
21640 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a  AND x<=z.    **.
21650 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72      ** X is stor
21660 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  ed in pExpr->pLe
21670 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
21680 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
21690 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
216a0 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20  pr..    ** Z is 
216b0 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
216c0 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
216d0 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  pr..    */.    c
216e0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
216f0 7b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  {.      exprCode
21700 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
21710 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30  pExpr, target, 0
21720 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
21730 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
21740 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41  .    case TK_SPA
21750 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
21760 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73  OLLATE: .    cas
21770 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
21780 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
21790 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
217a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
217b0 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
217c0 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
217d0 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20  TK_TRIGGER: {.  
217e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
217f0 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47  code is TK_TRIGG
21800 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ER, then the exp
21810 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66  ression is a ref
21820 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20  erence.      ** 
21830 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  to a column in t
21840 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e  he new.* or old.
21850 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20  * pseudo-tables 
21860 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20  available to.   
21870 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72     ** trigger pr
21880 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20  ograms. In this 
21890 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65  case Expr.iTable
218a0 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72   is set to 1 for
218b0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
218c0 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
218d0 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f  , or 0 for the o
218e0 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
218f0 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a  e. Expr.iColumn.
21900 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
21910 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  to the column of
21920 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c   the pseudo-tabl
21930 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f  e to read, or to
21940 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   -1 to.      ** 
21950 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66  read the rowid f
21960 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ield..      **. 
21970 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72       ** The expr
21980 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  ession is implem
21990 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f  ented using an O
219a0 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20  P_Param opcode. 
219b0 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  The p1.      ** 
219c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
219d0 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64   to 0 for an old
219e0 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  .rowid reference
219f0 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20  , or to (i+1).  
21a00 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65      ** to refere
21a10 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75  nce another colu
21a20 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20  mn of the old.* 
21a30 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68  pseudo-table, wh
21a40 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20  ere .      ** i 
21a50 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
21a60 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20  the column. For 
21a70 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65  a new.rowid refe
21a80 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20  rence, p1 is.   
21a90 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b     ** set to (n+
21aa0 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74  1), where n is t
21ab0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
21ac0 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65  umns in each pse
21ad0 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20  udo-table..     
21ae0 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65   ** For a refere
21af0 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72  nce to any other
21b00 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
21b10 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
21b20 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69  e, p1.      ** i
21b30 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29  s set to (n+2+i)
21b40 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20  , where n and i 
21b50 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70  are as defined p
21b60 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20  reviously. For. 
21b70 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c       ** example,
21b80 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e   if the table on
21b90 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20   which triggers 
21ba0 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20  are being fired 
21bb0 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c  is.      ** decl
21bc0 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a  ared as:.      *
21bd0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45  *.      **   CRE
21be0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
21bf0 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  b);.      **.   
21c00 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73     ** Then p1 is
21c10 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
21c20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a  follows:.      *
21c30 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  *.      **   p1=
21c40 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72  =0   ->    old.r
21c50 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20  owid     p1==3  
21c60 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64   ->    new.rowid
21c70 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
21c80 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20  1   ->    old.a 
21c90 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20          p1==4   
21ca0 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20  ->    new.a.    
21cb0 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d    **   p1==2   -
21cc0 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20  >    old.b      
21cd0 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20     p1==5   ->   
21ce0 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20   new.b       .  
21cf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
21d00 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72  le *pTab = pExpr
21d10 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e  ->pTab;.      in
21d20 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54  t p1 = pExpr->iT
21d30 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43  able * (pTab->nC
21d40 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70  ol+1) + 1 + pExp
21d50 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20  r->iColumn;..   
21d60 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
21d70 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70  ->iTable==0 || p
21d80 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20  Expr->iTable==1 
21d90 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21da0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
21db0 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43  =-1 && pExpr->iC
21dc0 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c  olumn<pTab->nCol
21dd0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
21de0 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  ( pTab->iPKey<0 
21df0 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  || pExpr->iColum
21e00 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  n!=pTab->iPKey )
21e10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
21e20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61  p1>=0 && p1<(pTa
21e30 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a  b->nCol*2+2) );.
21e40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21e50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50  beAddOp2(v, OP_P
21e60 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74  aram, p1, target
21e70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
21e80 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20  ment((v, "%s.%s 
21e90 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20  -> $%d",.       
21ea0 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20   (pExpr->iTable 
21eb0 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29  ? "new" : "old")
21ec0 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
21ed0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72  ->iColumn<0 ? "r
21ee0 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70  owid" : pExpr->p
21ef0 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
21f00 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29  >iColumn].zName)
21f10 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67 65 74  ,.        target
21f20 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e  .      ));..#ifn
21f30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21f40 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
21f50 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
21f60 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61  olumn has REAL a
21f70 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20  ffinity, it may 
21f80 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f  currently be sto
21f90 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20  red as an.      
21fa0 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20  ** integer. Use 
21fb0 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20  OP_RealAffinity 
21fc0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20  to make sure it 
21fd0 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a  is really real..
21fe0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21ff0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
22000 2d 36 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c  -60985-57662 SQL
22010 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74  ite will convert
22020 20 74 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20   the value back 
22030 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61  to.      ** floa
22040 74 69 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20  ting point when 
22050 65 78 74 72 61 63 74 69 6e 67 20 69 74 20 66 72  extracting it fr
22060 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20  om the record.  
22070 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  */.      if( pEx
22080 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a  pr->iColumn>=0 .
22090 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e         && pTab->
220a0 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
220b0 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53  umn].affinity==S
220c0 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20  QLITE_AFF_REAL. 
220d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
220e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
220f0 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69  1(v, OP_RealAffi
22100 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20  nity, target);. 
22110 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
22120 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
22130 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45  ..    case TK_VE
22140 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  CTOR: {.      sq
22150 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
22160 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65  arse, "row value
22170 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20   misused");.    
22180 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
22190 20 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e      case TK_IF_N
221a0 55 4c 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20  ULL_ROW: {.     
221b0 20 69 6e 74 20 61 64 64 72 49 4e 52 3b 0a 20 20   int addrINR;.  
221c0 20 20 20 20 61 64 64 72 49 4e 52 20 3d 20 73 71      addrINR = sq
221d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
221e0 76 2c 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c  v, OP_IfNullRow,
221f0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
22200 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
22210 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
22220 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  se);.      inReg
22230 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
22240 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
22250 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
22260 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
22270 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
22280 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
22290 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
222a0 48 65 72 65 28 76 2c 20 61 64 64 72 49 4e 52 29  Here(v, addrINR)
222b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
222c0 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
222d0 64 64 72 49 4e 52 2c 20 69 6e 52 65 67 29 3b 0a  ddrINR, inReg);.
222e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
222f0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
22300 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a  * Form A:.    **
22310 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65     CASE x WHEN e
22320 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
22330 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
22340 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
22350 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
22360 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20      ** Form B:. 
22370 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
22380 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
22390 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
223a0 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
223b0 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
223c0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  **.    ** Form A
223d0 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73   is can be trans
223e0 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20  formed into the 
223f0 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20  equivalent form 
22400 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  B as follows:.  
22410 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
22420 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48   x=e1 THEN r1 WH
22430 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20  EN x=e2 THEN r2 
22440 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ....    **      
22450 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e    WHEN x=eN THEN
22460 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
22470 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28     **.    ** X (
22480 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
22490 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
224a0 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e  ..    ** Y is in
224b0 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e   the last elemen
224c0 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t of pExpr->x.pL
224d0 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e  ist if pExpr->x.
224e0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a  pList->nExpr is.
224f0 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65      ** odd.  The
22500 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f   Y is also optio
22510 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d  nal.  If the num
22520 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
22530 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a  in x.pList.    *
22540 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20  * is even, then 
22550 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64  Y is omitted and
22560 20 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22   the "otherwise"
22570 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
22580 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e  .    ** Ei is in
22590 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
225a0 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20  [i*2] and Ri is 
225b0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
225c0 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20  i*2+1]..    **. 
225d0 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74     ** The result
225e0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
225f0 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72  on is the Ri for
22600 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
22610 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f  ing Ei,.    ** o
22620 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  r if there is no
22630 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68   matching Ei, th
22640 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f  e ELSE term Y, o
22650 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  r if there is.  
22660 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72    ** no ELSE ter
22670 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  m, NULL..    */.
22680 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
22690 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45  ert( op==TK_CASE
226a0 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
226b0 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  endLabel;       
226c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
226d0 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
226e0 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74  end of CASE stmt
226f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65   */.      int ne
22700 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  xtCase;         
22710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
22720 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65  OTO label for ne
22730 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  xt WHEN clause *
22740 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  /.      int nExp
22750 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
22760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20            /* 2x 
22770 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74  number of WHEN t
22780 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
22790 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
227c0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
227d0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
227e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
227f0 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  st of WHEN terms
22800 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
22810 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
22820 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41  aListelem;  /* A
22830 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72  rray of WHEN ter
22840 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ms */.      Expr
22850 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20   opCompare;     
22860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22870 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65   The X==Ei expre
22880 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
22890 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228b0 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73   /* The X expres
228c0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
228d0 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20  pr *pTest = 0;  
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228f0 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41  /* X==Ei (form A
22900 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f  ) or just Ei (fo
22910 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56  rm B) */.      V
22920 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61  VA_ONLY( int iCa
22930 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  cheLevel = pPars
22940 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20  e->iCacheLevel; 
22950 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  )..      assert(
22960 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
22970 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
22980 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d  elect) && pExpr-
22990 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20  >x.pList );.    
229a0 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
229b0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e  x.pList->nExpr >
229c0 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73   0);.      pELis
229d0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
229e0 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65  st;.      aListe
229f0 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b  lem = pEList->a;
22a00 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70  .      nExpr = p
22a10 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
22a20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73      endLabel = s
22a30 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
22a40 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66  bel(v);.      if
22a50 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70  ( (pX = pExpr->p
22a60 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Left)!=0 ){.    
22a70 20 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b      tempX = *pX;
22a80 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
22a90 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  e( pX->op==TK_CO
22aa0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
22ab0 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26  exprToRegister(&
22ac0 74 65 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56  tempX, exprCodeV
22ad0 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74  ector(pParse, &t
22ae0 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  empX, &regFree1)
22af0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
22b00 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
22b10 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   );.        mems
22b20 65 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30  et(&opCompare, 0
22b30 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61  , sizeof(opCompa
22b40 72 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  re));.        op
22b50 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f  Compare.op = TK_
22b60 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f  EQ;.        opCo
22b70 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74  mpare.pLeft = &t
22b80 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54  empX;.        pT
22b90 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65  est = &opCompare
22ba0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63  ;.        /* Tic
22bb0 6b 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35  ket b351d95f9cd5
22bc0 65 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35  ef17e9d9dbae18f5
22bd0 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20  ca8611190001:.  
22be0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c        ** The val
22bf0 75 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d  ue in regFree1 m
22c00 69 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65  ight get SCopy-e
22c10 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20  d into the file 
22c20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20  result..        
22c30 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20  ** So make sure 
22c40 74 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65  that the regFree
22c50 31 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f  1 register is no
22c60 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68  t reused for oth
22c70 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75  er.        ** pu
22c80 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69  rposes and possi
22c90 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  bly overwritten.
22ca0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67    */.        reg
22cb0 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20  Free1 = 0;.     
22cc0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
22cd0 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69  ; i<nExpr-1; i=i
22ce0 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2){.        sql
22cf0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
22d00 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
22d10 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20     if( pX ){.   
22d20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
22d30 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Test!=0 );.     
22d40 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
22d50 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65  Right = aListele
22d60 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  m[i].pExpr;.    
22d70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22d80 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69       pTest = aLi
22d90 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
22da0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22db0 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71     nextCase = sq
22dc0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
22dd0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  el(v);.        t
22de0 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e  estcase( pTest->
22df0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
22e00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22e10 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
22e20 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43  se, pTest, nextC
22e30 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ase, SQLITE_JUMP
22e40 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  IFNULL);.       
22e50 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74   testcase( aList
22e60 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d  elem[i+1].pExpr-
22e70 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
22e80 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
22e90 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
22ea0 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  , aListelem[i+1]
22eb0 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
22ec0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22ed0 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c  VdbeGoto(v, endL
22ee0 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  abel);.        s
22ef0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
22f00 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
22f10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
22f20 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e  esolveLabel(v, n
22f30 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20  extCase);.      
22f40 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78  }.      if( (nEx
22f50 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  pr&1)!=0 ){.    
22f60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
22f70 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
22f80 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
22f90 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
22fa0 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70  , pEList->a[nExp
22fb0 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  r-1].pExpr, targ
22fc0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
22fd0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
22fe0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
22ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
23000 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23010 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
23020 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
23030 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23040 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
23050 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
23060 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20  e->nErr>0 .     
23070 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
23080 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43  >iCacheLevel==iC
23090 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20  acheLevel );.   
230a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
230b0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
230c0 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62  dLabel);.      b
230d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
230e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
230f0 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65  TRIGGER.    case
23100 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
23110 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
23120 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52  ->affinity==OE_R
23130 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20  ollback .       
23140 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
23150 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
23160 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
23170 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
23180 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20  OE_Fail.        
23190 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
231a0 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
231b0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
231c0 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72  if( !pParse->pTr
231d0 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20  iggerTab ){.    
231e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
231f0 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
23200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23210 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
23220 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
23230 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
23240 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20  ogram");.       
23250 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
23260 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
23270 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
23280 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
23290 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
232a0 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  t(pParse);.     
232b0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
232c0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
232d0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
232e0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69  alue) );.      i
232f0 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
23300 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b  ty==OE_Ignore ){
23310 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23320 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20  VdbeAddOp4(.    
23330 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61          v, OP_Ha
23340 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f  lt, SQLITE_OK, O
23350 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78  E_Ignore, 0, pEx
23360 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b  pr->u.zToken,0);
23370 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
23380 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
23390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
233a0 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
233b0 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c  aint(pParse, SQL
233c0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54  ITE_CONSTRAINT_T
233d0 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20  RIGGER,.        
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233f0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
23400 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e  inity, pExpr->u.
23410 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20  zToken, 0, 0);. 
23420 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72       }..      br
23430 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
23440 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  f.  }.  sqlite3R
23450 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
23460 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
23470 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
23480 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
23490 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65   regFree2);.  re
234a0 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f  turn inReg;.}../
234b0 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20  *.** Factor out 
234c0 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20  the code of the 
234d0 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
234e0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69   to initializati
234f0 6f 6e 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  on time..**.** I
23500 66 20 72 65 67 44 65 73 74 3e 3d 30 20 74 68 65  f regDest>=0 the
23510 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
23520 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20 69 6e  always stored in
23530 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20 61   that register a
23540 6e 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  nd the.** result
23550 20 69 73 20 6e 6f 74 20 72 65 75 73 61 62 6c 65   is not reusable
23560 2e 20 20 49 66 20 72 65 67 44 65 73 74 3c 30 20  .  If regDest<0 
23570 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
23580 65 20 69 73 20 66 72 65 65 20 74 6f 20 0a 2a 2a  e is free to .**
23590 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   store the value
235a0 20 77 68 65 72 65 65 76 65 72 20 69 74 20 77 61   whereever it wa
235b0 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69 73 74  nts.  The regist
235c0 65 72 20 77 68 65 72 65 20 74 68 65 20 65 78 70  er where the exp
235d0 72 65 73 73 69 6f 6e 20 0a 2a 2a 20 69 73 20 73  ression .** is s
235e0 74 6f 72 65 64 20 69 73 20 72 65 74 75 72 6e 65  tored is returne
235f0 64 2e 20 20 57 68 65 6e 20 72 65 67 44 65 73 74  d.  When regDest
23600 3c 30 2c 20 74 77 6f 20 69 64 65 6e 74 69 63 61  <0, two identica
23610 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69  l expressions wi
23620 6c 6c 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 74 68  ll.** code to th
23630 65 20 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e  e same register.
23640 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
23650 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20  xprCodeAtInit(. 
23660 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
23670 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
23680 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
23690 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
236a0 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
236b0 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20  o code when the 
236c0 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73  VDBE initializes
236d0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73   */.  int regDes
236e0 74 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  t       /* Store
236f0 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
23700 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
23710 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b  {.  ExprList *p;
23720 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74  .  assert( Const
23730 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29  FactorOk(pParse)
23740 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65   );.  p = pParse
23750 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20  ->pConstExpr;.  
23760 69 66 28 20 72 65 67 44 65 73 74 3c 30 20 26 26  if( regDest<0 &&
23770 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   p ){.    struct
23780 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
23790 70 49 74 65 6d 3b 0a 20 20 20 20 69 6e 74 20 69  pItem;.    int i
237a0 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  ;.    for(pItem=
237b0 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72  p->a, i=p->nExpr
237c0 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20  ; i>0; pItem++, 
237d0 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i--){.      if( 
237e0 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20  pItem->reusable 
237f0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
23800 6d 70 61 72 65 28 30 2c 70 49 74 65 6d 2d 3e 70  mpare(0,pItem->p
23810 45 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d  Expr,pExpr,-1)==
23820 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
23830 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f  urn pItem->u.iCo
23840 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20  nstExprReg;.    
23850 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
23860 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
23870 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
23880 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
23890 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  p = sqlite3ExprL
238a0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
238b0 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69  , p, pExpr);.  i
238c0 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72  f( p ){.     str
238d0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
238e0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  m *pItem = &p->a
238f0 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  [p->nExpr-1];.  
23900 20 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62     pItem->reusab
23910 6c 65 20 3d 20 72 65 67 44 65 73 74 3c 30 3b 0a  le = regDest<0;.
23920 20 20 20 20 20 69 66 28 20 72 65 67 44 65 73 74       if( regDest
23930 3c 30 20 29 20 72 65 67 44 65 73 74 20 3d 20 2b  <0 ) regDest = +
23940 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
23950 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f      pItem->u.iCo
23960 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72 65 67  nstExprReg = reg
23970 44 65 73 74 3b 0a 20 20 7d 0a 20 20 70 50 61 72  Dest;.  }.  pPar
23980 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d  se->pConstExpr =
23990 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67   p;.  return reg
239a0 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Dest;.}../*.** G
239b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
239c0 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72  evaluate an expr
239d0 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  ession and store
239e0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
239f0 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e  into a register.
23a00 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67    Return the reg
23a10 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65  ister number whe
23a20 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
23a30 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  * are stored..**
23a40 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73  .** If the regis
23a50 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ter is a tempora
23a60 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74  ry register that
23a70 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61   can be dealloca
23a80 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69  ted,.** then wri
23a90 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e  te its number in
23aa0 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68  to *pReg.  If th
23ab0 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  e result registe
23ac0 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65  r is not.** a te
23ad0 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65  mporary, then se
23ae0 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e  t *pReg to zero.
23af0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
23b00 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74  is a constant, t
23b10 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
23b20 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65 20   might generate 
23b30 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  this.** code to 
23b40 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65  fill the registe
23b50 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c  r in the initial
23b60 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20  ization section 
23b70 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70  of the.** VDBE p
23b80 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72  rogram, in order
23b90 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75   to factor it ou
23ba0 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74  t of the evaluat
23bb0 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74  ion loop..*/.int
23bc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23bd0 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72  Temp(Parse *pPar
23be0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
23bf0 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69   int *pReg){.  i
23c00 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d  nt r2;.  pExpr =
23c10 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
23c20 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a  Collate(pExpr);.
23c30 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f    if( ConstFacto
23c40 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26  rOk(pParse).   &
23c50 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
23c60 52 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73  REGISTER.   && s
23c70 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
23c80 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
23c90 72 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 52 65  r).  ){.    *pRe
23ca0 67 20 20 3d 20 30 3b 0a 20 20 20 20 72 32 20 3d  g  = 0;.    r2 =
23cb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23cc0 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
23cd0 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c  Expr, -1);.  }el
23ce0 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d  se{.    int r1 =
23cf0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
23d00 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
23d10 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
23d20 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
23d30 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20  e, pExpr, r1);. 
23d40 20 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b     if( r2==r1 ){
23d50 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72  .      *pReg = r
23d60 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
23d70 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
23d80 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
23d90 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52  , r1);.      *pR
23da0 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
23db0 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d  }.  return r2;.}
23dc0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
23dd0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
23de0 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
23df0 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
23e00 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
23e10 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
23e20 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
23e30 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
23e40 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
23e50 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
23e60 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
23e70 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73  te3ExprCode(Pars
23e80 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
23e90 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
23ea0 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67  et){.  int inReg
23eb0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
23ec0 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
23ed0 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
23ee0 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20  .  if( pExpr && 
23ef0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  pExpr->op==TK_RE
23f00 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71  GISTER ){.    sq
23f10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23f20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
23f30 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69  P_Copy, pExpr->i
23f40 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a  Table, target);.
23f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52    }else{.    inR
23f60 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
23f70 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
23f80 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
23f90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
23fa0 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20  Parse->pVdbe!=0 
23fb0 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
23fc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
23fd0 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
23fe0 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e  rget && pParse->
23ff0 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73  pVdbe ){.      s
24000 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24010 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
24020 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
24030 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a   target);.    }.
24040 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
24050 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 63 6f  e a transient co
24060 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  py of expression
24070 20 70 45 78 70 72 20 61 6e 64 20 74 68 65 6e 20   pExpr and then 
24080 63 6f 64 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a  code it using.**
24090 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
240a0 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ().  This routin
240b0 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  e works just lik
240c0 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  e sqlite3ExprCod
240d0 65 28 29 0a 2a 2a 20 65 78 63 65 70 74 20 74 68  e().** except th
240e0 61 74 20 74 68 65 20 69 6e 70 75 74 20 65 78 70  at the input exp
240f0 72 65 73 73 69 6f 6e 20 69 73 20 67 75 61 72 61  ression is guara
24100 6e 74 65 65 64 20 74 6f 20 62 65 20 75 6e 63 68  nteed to be unch
24110 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  anged..*/.void s
24120 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
24130 70 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  py(Parse *pParse
24140 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
24150 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 73 71  nt target){.  sq
24160 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
24170 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70 72 20  se->db;.  pExpr 
24180 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
24190 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
241a0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
241b0 63 46 61 69 6c 65 64 20 29 20 73 71 6c 69 74 65  cFailed ) sqlite
241c0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
241d0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
241e0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
241f0 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
24200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
24210 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
24220 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
24230 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
24240 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
24250 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
24260 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
24270 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
24280 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
24290 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
242a0 61 72 67 65 74 2e 20 20 49 66 20 74 68 65 20 65  arget.  If the e
242b0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
242c0 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  stant, then this
242d0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68   routine.** migh
242e0 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65  t choose to code
242f0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24300 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  at initializatio
24310 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n time..*/.void 
24320 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46  sqlite3ExprCodeF
24330 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20  actorable(Parse 
24340 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
24350 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
24360 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
24370 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26  >okConstFactor &
24380 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
24390 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29  onstant(pExpr) )
243a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
243b0 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
243c0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
243d0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
243e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
243f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
24400 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  target);.  }.}..
24410 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
24420 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61 74  ode that evaluat
24430 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  es the given exp
24440 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73  ression and puts
24450 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
24460 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
24470 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61  t..**.** Also ma
24480 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
24490 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75   expression resu
244a0 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72  lts into another
244b0 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65   "cache" registe
244c0 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20  r.** and modify 
244d0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
244e0 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
244f0 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75  time it is evalu
24500 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73  ated,.** the res
24510 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ult is a copy of
24520 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73   the cache regis
24530 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
24540 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
24550 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  for expressions 
24560 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75  that are used mu
24570 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73  ltiple .** times
24580 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c  .  They are eval
24590 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74  uated once and t
245a0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
245b0 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
245c0 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76  are reused..*/.v
245d0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
245e0 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73  odeAndCache(Pars
245f0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
24600 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
24610 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
24620 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
24630 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61    int iMem;..  a
24640 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
24650 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
24660 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
24670 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  TER );.  sqlite3
24680 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
24690 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
246a0 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  .  iMem = ++pPar
246b0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
246c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
246d0 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74   OP_Copy, target
246e0 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54  , iMem);.  exprT
246f0 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c  oRegister(pExpr,
24700 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iMem);.}../*.**
24710 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
24720 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76  hat pushes the v
24730 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c  alue of every el
24740 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76  ement of the giv
24750 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
24760 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71   list into a seq
24770 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
24780 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  rs beginning at 
24790 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  target..**.** Re
247a0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
247b0 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c  of elements eval
247c0 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uated..**.** The
247d0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
247e0 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74   flag prevents t
247f0 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f  he arguments fro
24800 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65  m being.** fille
24810 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79  d using OP_SCopy
24820 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20  .  OP_Copy must 
24830 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  be used instead.
24840 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
24850 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72  E_ECEL_FACTOR ar
24860 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f  gument allows co
24870 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
24880 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72   to be.** factor
24890 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74  ed out into init
248a0 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e  ialization code.
248b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
248c0 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20  E_ECEL_REF flag 
248d0 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70 72 65  means that expre
248e0 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69  ssions in the li
248f0 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c  st with.** ExprL
24900 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64  ist.a[].u.x.iOrd
24910 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61  erByCol>0 have a
24920 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c  lready been eval
24930 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64  uated and stored
24940 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73  .** in registers
24950 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20   at srcReg, and 
24960 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e  so the value can
24970 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20   be copied from 
24980 74 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  there..*/.int sq
24990 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
249a0 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
249b0 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
249c0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
249d0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
249e0 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78  ist,   /* The ex
249f0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
24a00 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
24a10 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20  nt target,      
24a20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
24a30 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ite results */. 
24a40 20 69 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20   int srcReg,    
24a50 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65      /* Source re
24a60 67 69 73 74 65 72 73 20 69 66 20 53 51 4c 49 54  gisters if SQLIT
24a70 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20  E_ECEL_REF */.  
24a80 75 38 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  u8 flags        
24a90 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45     /* SQLITE_ECE
24aa0 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  L_* flags */.){.
24ab0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
24ac0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
24ad0 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20   int i, j, n;.  
24ae0 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61  u8 copyOp = (fla
24af0 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
24b00 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20  _DUP) ? OP_Copy 
24b10 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64  : OP_SCopy;.  Vd
24b20 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
24b30 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
24b40 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61   pList!=0 );.  a
24b50 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
24b60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
24b70 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b  rse->pVdbe!=0 );
24b80 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20    /* Never gets 
24b90 74 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69  this far otherwi
24ba0 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73  se */.  n = pLis
24bb0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
24bc0 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70  !ConstFactorOk(p
24bd0 50 61 72 73 65 29 20 29 20 66 6c 61 67 73 20 26  Parse) ) flags &
24be0 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  = ~SQLITE_ECEL_F
24bf0 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74  ACTOR;.  for(pIt
24c00 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
24c10 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
24c20 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
24c30 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70  pExpr = pItem->p
24c40 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66  Expr;.    if( (f
24c50 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
24c60 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a  EL_REF)!=0 && (j
24c70 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
24c80 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a  rderByCol)>0 ){.
24c90 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20        if( flags 
24ca0 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d  & SQLITE_ECEL_OM
24cb0 49 54 52 45 46 20 29 7b 0a 20 20 20 20 20 20 20  ITREF ){.       
24cc0 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d   i--;.        n-
24cd0 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
24ce0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24cf0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70  dbeAddOp2(v, cop
24d00 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c  yOp, j+srcReg-1,
24d10 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
24d20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
24d30 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( (flags & SQLIT
24d40 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d  E_ECEL_FACTOR)!=
24d50 30 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  0 && sqlite3Expr
24d60 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
24d70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
24d80 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
24d90 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
24da0 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d  target+i);.    }
24db0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
24dc0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
24dd0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
24de0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
24df0 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66  get+i);.      if
24e00 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b  ( inReg!=target+
24e10 69 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  i ){.        Vdb
24e20 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20  eOp *pOp;.      
24e30 20 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50    if( copyOp==OP
24e40 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26  _Copy.         &
24e50 26 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64  & (pOp=sqlite3Vd
24e60 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d  beGetOp(v, -1))-
24e70 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79  >opcode==OP_Copy
24e80 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70  .         && pOp
24e90 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d  ->p1+pOp->p3+1==
24ea0 69 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  inReg.         &
24eb0 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70  & pOp->p2+pOp->p
24ec0 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20  3+1==target+i.  
24ed0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
24ee0 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20     pOp->p3++;.  
24ef0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24f00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
24f10 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79  beAddOp2(v, copy
24f20 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  Op, inReg, targe
24f30 74 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t+i);.        }.
24f40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24f50 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
24f60 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
24f70 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45  code for a BETWE
24f80 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  EN operator..**.
24f90 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  **    x BETWEEN 
24fa0 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68  y AND z.**.** Th
24fb0 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76  e above is equiv
24fc0 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20  alent to .**.** 
24fd0 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
24fe0 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61  .**.** Code it a
24ff0 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63  s such, taking c
25000 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f  are to do the co
25010 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69  mmon subexpressi
25020 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f  on.** eliminatio
25030 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68  n of x..**.** Th
25040 65 20 78 4a 75 6d 70 49 66 20 70 61 72 61 6d 65  e xJumpIf parame
25050 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 64  ter determines d
25060 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  etails:.**.**   
25070 20 4e 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20   NULL:          
25080 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 74           Store t
25090 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
250a0 74 20 69 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a  t in reg[dest].*
250b0 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  *    sqlite3Expr
250c0 49 66 54 72 75 65 3a 20 20 20 20 20 20 4a 75 6d  IfTrue:      Jum
250d0 70 20 74 6f 20 64 65 73 74 20 69 66 20 74 72 75  p to dest if tru
250e0 65 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45  e.**    sqlite3E
250f0 78 70 72 49 66 46 61 6c 73 65 3a 20 20 20 20 20  xprIfFalse:     
25100 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20  Jump to dest if 
25110 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  false.**.** The 
25120 6a 75 6d 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d  jumpIfNull param
25130 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20  eter is ignored 
25140 69 66 20 78 4a 75 6d 70 49 66 20 69 73 20 4e 55  if xJumpIf is NU
25150 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  LL..*/.static vo
25160 69 64 20 65 78 70 72 43 6f 64 65 42 65 74 77 65  id exprCodeBetwe
25170 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
25180 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
25190 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
251a0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
251b0 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
251c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54        /* The BET
251d0 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  WEEN expression 
251e0 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
251f0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64         /* Jump d
25200 65 73 74 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74  estination or st
25210 6f 72 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a  orage location *
25220 2f 0a 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70  /.  void (*xJump
25230 29 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69  )(Parse*,Expr*,i
25240 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69  nt,int), /* Acti
25250 6f 6e 20 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20  on to take */.  
25260 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20  int jumpIfNull  
25270 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75    /* Take the ju
25280 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45  mp if the BETWEE
25290 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  N is NULL */.){.
252a0 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20   Expr exprAnd;  
252b0 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70     /* The AND op
252c0 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20  erator in  x>=y 
252d0 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45  AND x<=z  */.  E
252e0 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20  xpr compLeft;   
252f0 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74   /* The  x>=y  t
25300 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f  erm */.  Expr co
25310 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68  mpRight;   /* Th
25320 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f  e  x<=z  term */
25330 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20  .  Expr exprX;  
25340 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20       /* The  x  
25350 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
25360 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
25370 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72  = 0; /* Temporar
25380 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a  y use register *
25390 2f 0a 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f  /...  memset(&co
253a0 6d 70 4c 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f  mpLeft, 0, sizeo
253b0 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73  f(Expr));.  mems
253c0 65 74 28 26 63 6f 6d 70 52 69 67 68 74 2c 20 30  et(&compRight, 0
253d0 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
253e0 0a 20 20 6d 65 6d 73 65 74 28 26 65 78 70 72 41  .  memset(&exprA
253f0 6e 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  nd, 0, sizeof(Ex
25400 70 72 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  pr));..  assert(
25410 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
25420 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
25430 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72  elect) );.  expr
25440 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66  X = *pExpr->pLef
25450 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20  t;.  exprAnd.op 
25460 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72  = TK_AND;.  expr
25470 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d  And.pLeft = &com
25480 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
25490 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52  .pRight = &compR
254a0 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  ight;.  compLeft
254b0 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63  .op = TK_GE;.  c
254c0 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20  ompLeft.pLeft = 
254d0 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65  &exprX;.  compLe
254e0 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ft.pRight = pExp
254f0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
25500 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69  .pExpr;.  compRi
25510 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a  ght.op = TK_LE;.
25520 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66    compRight.pLef
25530 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
25540 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d  mpRight.pRight =
25550 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
25560 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65  >a[1].pExpr;.  e
25570 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 65  xprToRegister(&e
25580 78 70 72 58 2c 20 65 78 70 72 43 6f 64 65 56 65  xprX, exprCodeVe
25590 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 65 78  ctor(pParse, &ex
255a0 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 29  prX, &regFree1))
255b0 3b 0a 20 20 69 66 28 20 78 4a 75 6d 70 20 29 7b  ;.  if( xJump ){
255c0 0a 20 20 20 20 78 4a 75 6d 70 28 70 50 61 72 73  .    xJump(pPars
255d0 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
255e0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
255f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
25600 4d 61 72 6b 20 74 68 65 20 65 78 70 72 65 73 73  Mark the express
25610 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 66 72 6f  ion is being fro
25620 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  m the ON or USIN
25630 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
25640 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61  in.    ** so tha
25650 74 20 74 68 65 20 73 71 6c 69 74 65 33 45 78 70  t the sqlite3Exp
25660 72 43 6f 64 65 54 61 72 67 65 74 28 29 20 72 6f  rCodeTarget() ro
25670 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61  utine will not a
25680 74 74 65 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20  ttempt to move. 
25690 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68     ** it into th
256a0 65 20 50 61 72 73 65 2e 70 43 6f 6e 73 74 45 78  e Parse.pConstEx
256b0 70 72 20 6c 69 73 74 2e 20 20 57 65 20 73 68 6f  pr list.  We sho
256c0 75 6c 64 20 75 73 65 20 61 20 6e 65 77 20 62 69  uld use a new bi
256d0 74 20 66 6f 72 20 74 68 69 73 2c 0a 20 20 20 20  t for this,.    
256e0 2a 2a 20 66 6f 72 20 63 6c 61 72 69 74 79 2c 20  ** for clarity, 
256f0 62 75 74 20 77 65 20 61 72 65 20 6f 75 74 20 6f  but we are out o
25700 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 45 78  f bits in the Ex
25710 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 20 73  pr.flags field s
25720 6f 20 77 65 0a 20 20 20 20 2a 2a 20 68 61 76 65  o we.    ** have
25730 20 74 6f 20 72 65 75 73 65 20 74 68 65 20 45 50   to reuse the EP
25740 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20  _FromJoin bit.  
25750 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 65  Bummer. */.    e
25760 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50  xprX.flags |= EP
25770 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73  _FromJoin;.    s
25780 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
25790 72 67 65 74 28 70 50 61 72 73 65 2c 20 26 65 78  rget(pParse, &ex
257a0 70 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20  prAnd, dest);.  
257b0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
257c0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
257d0 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20  , regFree1);..  
257e0 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75 61  /* Ensure adequa
257f0 74 65 20 74 65 73 74 20 63 6f 76 65 72 61 67 65  te test coverage
25800 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
25810 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
25820 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
25830 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
25840 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
25850 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
25860 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
25870 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
25880 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
25890 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
258a0 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
258b0 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
258c0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
258d0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
258e0 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
258f0 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  ==sqlite3ExprIfT
25900 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75  rue  && jumpIfNu
25910 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
25920 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
25930 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
25940 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
25950 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
25960 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
25970 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
25980 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
25990 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
259a0 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
259b0 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
259c0 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
259d0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
259e0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
259f0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
25a00 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
25a10 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
25a20 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70  rIfFalse && jump
25a30 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
25a40 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
25a50 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30  stcase( xJump==0
25a60 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   );.}../*.** Gen
25a70 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
25a80 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
25a90 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
25aa0 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
25ab0 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
25ac0 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
25ad0 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
25ae0 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
25af0 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
25b00 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
25b10 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
25b20 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
25b30 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
25b40 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
25b50 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
25b60 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  alse), then.** t
25b70 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
25b80 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66  the jumpIfNull f
25b90 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  lag is SQLITE_JU
25ba0 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  MPIFNULL..**.** 
25bb0 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
25bc0 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
25bd0 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e  at certain token
25be0 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f   values (ex: TK_
25bf0 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  EQ).** are the s
25c00 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61  ame as opcode va
25c10 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29  lues (ex: OP_Eq)
25c20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20   that implement 
25c30 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
25c40 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20  g.** operation. 
25c50 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74   Special comment
25c60 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20  s in vdbe.c and 
25c70 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
25c80 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74  k script in.** t
25c90 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20  he make process 
25ca0 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75  cause these valu
25cb0 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73  es to align.  As
25cc0 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63  sert()s in the c
25cd0 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72  ode.** below ver
25ce0 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
25cf0 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64  bers are aligned
25d00 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76   correctly..*/.v
25d10 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
25d20 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61  fTrue(Parse *pPa
25d30 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
25d40 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
25d50 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
25d60 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
25d70 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
25d80 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
25d90 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
25da0 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
25db0 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
25dc0 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
25dd0 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
25de0 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
25df0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
25e00 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20  EVER(v==0) )    
25e10 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69   return;  /* Exi
25e20 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63  stence of VDBE c
25e30 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72  hecked by caller
25e40 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
25e50 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75  pExpr==0) ) retu
25e60 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74  rn;  /* No way t
25e70 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a  his can happen *
25e80 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  /.  op = pExpr->
25e90 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  op;.  switch( op
25ea0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
25eb0 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AND: {.      int
25ec0 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
25ed0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
25ee0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
25ef0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
25f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25f10 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
25f20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
25f30 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  2,jumpIfNull^SQL
25f40 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
25f50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25f60 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
25f70 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
25f80 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
25f90 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
25fa0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
25fb0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
25fc0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
25fd0 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
25fe0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
25ff0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
26000 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26010 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
26020 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  R: {.      testc
26030 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
26040 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
26050 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
26060 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26070 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
26080 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
26090 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
260a0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
260b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
260c0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
260d0 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
260e0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
260f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
26100 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
26110 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26120 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
26130 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
26140 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
26150 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
26160 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
26170 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
26180 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
26190 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
261a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
261b0 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
261c0 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
261d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
261e0 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
261f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
26200 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
26210 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
26220 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
26230 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66  NE;.      jumpIf
26240 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55  Null = SQLITE_NU
26250 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46  LLEQ;.      /* F
26260 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20  all thru */.    
26270 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
26280 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
26290 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
262a0 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
262b0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
262c0 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
262d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
262e0 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70  xprIsVector(pExp
262f0 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f  r->pLeft) ) goto
26300 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20   default_expr;. 
26310 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
26320 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26330 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
26340 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
26350 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
26360 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
26370 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
26380 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
26390 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
263a0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
263b0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
263c0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
263d0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
263e0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
263f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26400 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
26410 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
26420 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
26430 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
26440 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
26450 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
26460 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
26470 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
26480 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
26490 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
264a0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
264b0 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
264c0 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
264d0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
264e0 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
264f0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
26500 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
26510 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
26520 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
26530 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
26540 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
26550 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26560 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
26570 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
26580 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  q);.      VdbeCo
26590 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
265a0 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
265b0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
265c0 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
265d0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
265e0 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
265f0 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
26600 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LEQ);.      asse
26610 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
26620 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
26630 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Ne);.      Vdb
26640 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
26650 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
26660 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
26670 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
26680 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
26690 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
266a0 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
266b0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74  NULLEQ);.      t
266c0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
266d0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
266e0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
266f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
26700 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
26710 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
26720 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
26730 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  L: {.      asser
26740 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
26750 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73  _IsNull );   tes
26760 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
26770 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73  NULL );.      as
26780 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
26790 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20  ==OP_NotNull ); 
267a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
267b0 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
267c0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
267d0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
267e0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
267f0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
26800 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26810 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
26820 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62  dest);.      Vdb
26830 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
26840 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
26850 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
26860 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
26870 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  TNULL);.      te
26880 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
26890 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
268a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
268b0 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
268c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
268d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
268e0 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  ;.      exprCode
268f0 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
26900 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c  pExpr, dest, sql
26910 69 74 65 33 45 78 70 72 49 66 54 72 75 65 2c 20  ite3ExprIfTrue, 
26920 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
26930 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
26940 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26950 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
26960 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
26970 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
26980 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
26990 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
269a0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
269b0 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c  Null = jumpIfNul
269c0 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49  l ? dest : destI
269d0 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71  fFalse;.      sq
269e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
269f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
26a00 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74  estIfFalse, dest
26a10 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
26a20 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
26a30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
26a40 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
26a50 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
26a60 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72  False);.      br
26a70 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
26a80 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
26a90 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70  .    default_exp
26aa0 72 3a 0a 20 20 20 20 20 20 69 66 28 20 65 78 70  r:.      if( exp
26ab0 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70  rAlwaysTrue(pExp
26ac0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
26ad0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
26ae0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
26af0 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61  lse if( exprAlwa
26b00 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29  ysFalse(pExpr) )
26b10 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d  {.        /* No-
26b20 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
26b30 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
26b40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
26b50 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
26b60 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
26b70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
26b80 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
26b90 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  f, r1, dest, jum
26ba0 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
26bb0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
26bc0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e(v);.        te
26bd0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
26be0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
26bf0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
26c00 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
26c10 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
26c20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
26c30 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
26c40 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
26c50 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
26c60 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
26c70 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20  se, regFree2);  
26c80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
26c90 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
26ca0 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
26cb0 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
26cc0 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
26cd0 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
26ce0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
26cf0 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20  on is false but 
26d00 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
26d10 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
26d20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
26d30 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a  ession is true..
26d40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
26d50 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
26d60 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
26d70 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
26d80 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20  e) then.** jump 
26d90 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73  if jumpIfNull is
26da0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
26db0 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75  LL or fall throu
26dc0 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  gh if jumpIfNull
26dd0 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69  .** is 0..*/.voi
26de0 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
26df0 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  alse(Parse *pPar
26e00 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
26e10 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
26e20 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
26e30 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
26e40 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
26e50 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
26e60 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee1 = 0;.  int r
26e70 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69  egFree2 = 0;.  i
26e80 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73  nt r1, r2;..  as
26e90 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  sert( jumpIfNull
26ea0 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ==SQLITE_JUMPIFN
26eb0 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c  ULL || jumpIfNul
26ec0 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  l==0 );.  if( NE
26ed0 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
26ee0 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65  rn; /* Existence
26ef0 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64   of VDBE checked
26f00 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20   by caller */.  
26f10 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20  if( pExpr==0 )  
26f20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
26f30 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78  The value of pEx
26f40 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72  pr->op and op ar
26f50 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c  e related as fol
26f60 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
26f70 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
26f80 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20             op.  
26f90 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  **       -------
26fa0 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  --          ----
26fb0 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20  ------.  **     
26fc0 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20    TK_ISNULL     
26fd0 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a       OP_NotNull.
26fe0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f    **       TK_NO
26ff0 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50  TNULL         OP
27000 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  _IsNull.  **    
27010 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20     TK_NE        
27020 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a        OP_Eq.  **
27030 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20         TK_EQ    
27040 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a            OP_Ne.
27050 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54    **       TK_GT
27060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
27070 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Le.  **       T
27080 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  K_LE            
27090 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20    OP_Gt.  **    
270a0 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20     TK_GE        
270b0 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a        OP_Lt.  **
270c0 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20         TK_LT    
270d0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a            OP_Ge.
270e0 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74    **.  ** For ot
270f0 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45  her values of pE
27100 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75  xpr->op, op is u
27110 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75  ndefined and unu
27120 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  sed..  ** The va
27130 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  lue of TK_ and O
27140 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65  P_ constants are
27150 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74   arranged such t
27160 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20  hat we.  ** can 
27170 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70  compute the mapp
27180 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20  ing above using 
27190 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
271a0 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41  pression..  ** A
271b0 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20  ssert()s verify 
271c0 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61  that the computa
271d0 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e  tion is correct.
271e0 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70  .  */.  op = ((p
271f0 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e  Expr->op+(TK_ISN
27200 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49  ULL&1))^1)-(TK_I
27210 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20  SNULL&1);..  /* 
27220 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61  Verify correct a
27230 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20  lignment of TK_ 
27240 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
27250 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
27260 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
27270 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  SNULL || op==OP_
27280 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  NotNull );.  ass
27290 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
272a0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70  TK_NOTNULL || op
272b0 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
272c0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
272d0 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d  op!=TK_NE || op=
272e0 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65  =OP_Eq );.  asse
272f0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
27300 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  K_EQ || op==OP_N
27310 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
27320 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20  Expr->op!=TK_LT 
27330 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a  || op==OP_Ge );.
27340 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
27350 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70  >op!=TK_LE || op
27360 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73  ==OP_Gt );.  ass
27370 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
27380 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GT || op==OP_
27390 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Le );.  assert( 
273a0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45  pExpr->op!=TK_GE
273b0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b   || op==OP_Lt );
273c0 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
273d0 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
273e0 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
273f0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
27400 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
27410 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27420 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
27430 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
27440 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27450 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27460 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
27470 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27480 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
27490 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
274a0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
274b0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
274c0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
274d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
274e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
274f0 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
27500 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
27510 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
27520 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
27530 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
27540 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
27550 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
27560 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27570 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e  eft, d2, jumpIfN
27580 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
27590 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
275a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
275b0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
275c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
275d0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
275e0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
275f0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27600 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27610 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
27620 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d2);.      sqlit
27630 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
27640 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
27650 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
27660 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
27670 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
27680 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
27690 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
276a0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
276b0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
276c0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
276d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
276e0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
276f0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
27700 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
27710 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
27720 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
27730 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
27740 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
27750 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78  .      op = (pEx
27760 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f  pr->op==TK_IS) ?
27770 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a   TK_NE : TK_EQ;.
27780 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c        jumpIfNull
27790 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
277a0 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
277b0 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65  thru */.    case
277c0 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
277d0 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
277e0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
277f0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
27800 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
27810 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
27820 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
27830 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70  sVector(pExpr->p
27840 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66  Left) ) goto def
27850 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20  ault_expr;.     
27860 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
27870 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
27880 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
27890 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
278a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
278b0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
278c0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
278d0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
278e0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
278f0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
27900 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
27910 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
27920 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
27930 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
27940 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
27950 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
27960 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
27970 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
27980 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
27990 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
279a0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
279b0 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Lt);.      asser
279c0 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
279d0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
279e0 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
279f0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
27a00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27a10 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
27a20 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
27a30 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
27a40 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
27a50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
27a60 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
27a70 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
27a80 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
27a90 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
27aa0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
27ab0 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
27ac0 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  ase(op==OP_Eq);.
27ad0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27ae0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
27af0 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  q && jumpIfNull!
27b00 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
27b10 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27b20 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
27b30 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
27b40 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
27b50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
27b60 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
27b70 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
27b80 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27b90 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
27ba0 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
27bb0 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
27bc0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
27bd0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
27be0 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
27bf0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
27c00 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
27c10 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
27c20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
27c30 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
27c40 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
27c50 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
27c60 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
27c70 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
27c80 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
27c90 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
27ca0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27cb0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
27cc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27cd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
27ce0 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
27cf0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
27d00 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56  TK_ISNULL );   V
27d10 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27d20 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
27d30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27d40 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
27d50 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
27d60 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
27d70 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
27d80 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
27d90 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
27da0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
27db0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
27dc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27dd0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
27de0 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
27df0 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
27e00 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69  Expr, dest, sqli
27e10 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c 20  te3ExprIfFalse, 
27e20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
27e30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27e40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27e50 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
27e60 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
27e70 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e       if( jumpIfN
27e80 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
27e90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
27ea0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
27eb0 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  dest, dest);.   
27ec0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27ed0 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
27ee0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
27ef0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
27f00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
27f10 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
27f20 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49  xpr, dest, destI
27f30 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
27f40 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
27f50 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
27f60 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  fNull);.      }.
27f70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27f80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
27f90 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66  fault: {.    def
27fa0 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20 20  ault_expr: .    
27fb0 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73    if( exprAlways
27fc0 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
27fd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27fe0 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
27ff0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
28000 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65  ( exprAlwaysTrue
28010 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
28020 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
28030 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28040 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
28050 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
28060 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
28070 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
28080 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28090 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  3(v, OP_IfNot, r
280a0 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
280b0 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  ull!=0);.       
280c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
280d0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
280e0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
280f0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
28100 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
28110 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
28120 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
28130 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
28140 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
28150 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
28160 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
28170 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
28180 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a  regFree2);.}../*
28190 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33  .** Like sqlite3
281a0 45 78 70 72 49 66 46 61 6c 73 65 28 29 20 65 78  ExprIfFalse() ex
281b0 63 65 70 74 20 74 68 61 74 20 61 20 63 6f 70 79  cept that a copy
281c0 20 69 73 20 6d 61 64 65 20 6f 66 20 70 45 78 70   is made of pExp
281d0 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65  r before.** code
281e0 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64   generation, and
281f0 20 74 68 61 74 20 63 6f 70 79 20 69 73 20 64 65   that copy is de
28200 6c 65 74 65 64 20 61 66 74 65 72 20 63 6f 64 65  leted after code
28210 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69   generation. Thi
28220 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 61  s.** ensures tha
28230 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
28240 45 78 70 72 20 69 73 20 75 6e 63 68 61 6e 67 65  Expr is unchange
28250 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
28260 65 33 45 78 70 72 49 66 46 61 6c 73 65 44 75 70  e3ExprIfFalseDup
28270 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
28280 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
28290 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66   dest,int jumpIf
282a0 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  Null){.  sqlite3
282b0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
282c0 62 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 70 79  b;.  Expr *pCopy
282d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
282e0 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
282f0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
28300 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
28310 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
28320 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f  alse(pParse, pCo
28330 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  py, dest, jumpIf
28340 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Null);.  }.  sql
28350 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
28360 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a  b, pCopy);.}../*
28370 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70  .** Expression p
28380 56 61 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  Var is guarantee
28390 64 20 74 6f 20 62 65 20 61 6e 20 53 51 4c 20 76  d to be an SQL v
283a0 61 72 69 61 62 6c 65 2e 20 70 45 78 70 72 20 6d  ariable. pExpr m
283b0 61 79 20 62 65 20 61 6e 79 0a 2a 2a 20 74 79 70  ay be any.** typ
283c0 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2e  e of expression.
283d0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
283e0 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20  is a simple SQL 
283f0 76 61 6c 75 65 20 2d 20 61 6e 20 69 6e 74 65 67  value - an integ
28400 65 72 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67  er, real, string
28410 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72 20 4e 55 4c  , blob.** or NUL
28420 4c 20 76 61 6c 75 65 20 2d 20 74 68 65 6e 20 74  L value - then t
28430 68 65 20 56 44 42 45 20 63 75 72 72 65 6e 74 6c  he VDBE currentl
28440 79 20 62 65 69 6e 67 20 70 72 65 70 61 72 65 64  y being prepared
28450 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a   is configured.*
28460 2a 20 74 6f 20 72 65 2d 70 72 65 70 61 72 65 20  * to re-prepare 
28470 65 61 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20  each time a new 
28480 76 61 6c 75 65 20 69 73 20 62 6f 75 6e 64 20 74  value is bound t
28490 6f 20 76 61 72 69 61 62 6c 65 20 70 56 61 72 2e  o variable pVar.
284a0 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61  .**.** Additiona
284b0 6c 6c 79 2c 20 69 66 20 70 45 78 70 72 20 69 73  lly, if pExpr is
284c0 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61   a simple SQL va
284d0 6c 75 65 20 61 6e 64 20 74 68 65 20 76 61 6c 75  lue and the valu
284e0 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65  e is the.** same
284f0 20 61 73 20 74 68 61 74 20 63 75 72 72 65 6e 74   as that current
28500 6c 79 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69  ly bound to vari
28510 61 62 6c 65 20 70 56 61 72 2c 20 6e 6f 6e 2d 7a  able pVar, non-z
28520 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
28530 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
28540 66 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  f the values are
28550 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 6f 72   not the same or
28560 20 69 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74   if pExpr is not
28570 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 53 51 4c   a simple.** SQL
28580 20 76 61 6c 75 65 2c 20 7a 65 72 6f 20 69 73 20   value, zero is 
28590 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
285a0 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 6d 70  tic int exprComp
285b0 61 72 65 56 61 72 69 61 62 6c 65 28 50 61 72 73  areVariable(Pars
285c0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
285d0 2a 70 56 61 72 2c 20 45 78 70 72 20 2a 70 45 78  *pVar, Expr *pEx
285e0 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d  pr){.  int res =
285f0 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 72 20 3d   0;.  int iVar =
28600 20 70 56 61 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a   pVar->iColumn;.
28610 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
28620 72 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  r;..  while( p->
28630 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 20  op==TK_UMINUS ) 
28640 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
28650 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55  if( p->op==TK_NU
28660 4c 4c 20 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  LL  || p->op==TK
28670 5f 49 4e 54 45 47 45 52 20 0a 20 20 20 7c 7c 20  _INTEGER .   || 
28680 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  p->op==TK_FLOAT 
28690 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  || p->op==TK_STR
286a0 49 4e 47 20 0a 20 20 20 7c 7c 20 70 2d 3e 6f 70  ING .   || p->op
286b0 3d 3d 54 4b 5f 42 4c 4f 42 20 0a 20 20 29 7b 0a  ==TK_BLOB .  ){.
286c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
286d0 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65  etVarmask(pParse
286e0 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a  ->pVdbe, iVar);.
286f0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
28700 65 20 2a 70 4c 3b 0a 20 20 20 20 70 4c 20 3d 20  e *pL;.    pL = 
28710 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f  sqlite3VdbeGetBo
28720 75 6e 64 56 61 6c 75 65 28 70 50 61 72 73 65 2d  undValue(pParse-
28730 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69 56 61  >pReprepare, iVa
28740 72 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  r, SQLITE_AFF_BL
28750 4f 42 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 20  OB);.    if( pL 
28760 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28770 5f 76 61 6c 75 65 20 2a 70 52 20 3d 20 30 3b 0a  _value *pR = 0;.
28780 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
28790 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
287a0 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51  e->db, pExpr, SQ
287b0 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
287c0 45 5f 41 46 46 5f 42 4c 4f 42 2c 26 70 52 29 3b  E_AFF_BLOB,&pR);
287d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
287e0 52 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  R || pParse->db-
287f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
28800 0a 20 20 20 20 20 20 69 66 28 20 70 52 20 26 26  .      if( pR &&
28810 20 30 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 43 6f   0==sqlite3MemCo
28820 6d 70 61 72 65 28 70 4c 2c 20 70 52 2c 20 30 29  mpare(pL, pR, 0)
28830 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
28840 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
28850 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
28860 72 65 65 28 70 52 29 3b 0a 20 20 20 20 20 20 73  ree(pR);.      s
28870 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
28880 70 4c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  pL);.    }else i
28890 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c  f( p->op==TK_NUL
288a0 4c 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  L ){.      res =
288b0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
288c0 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
288d0 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20  /*.** Do a deep 
288e0 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77  comparison of tw
288f0 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  o expression tre
28900 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  es.  Return 0 if
28910 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
28920 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70  essions are comp
28930 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c  letely identical
28940 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
28950 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a  hey differ only.
28960 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20  ** by a COLLATE 
28970 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68 65 20  operator at the 
28980 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75  top level.  Retu
28990 72 6e 20 32 20 69 66 20 74 68 65 72 65 20 61 72  rn 2 if there ar
289a0 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a  e differences.**
289b0 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
289c0 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54  top-level COLLAT
289d0 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  E operator..**.*
289e0 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d  * If any subelem
289f0 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78  ent of pB has Ex
28a00 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20  pr.iTable==(-1) 
28a10 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77  then it is allow
28a20 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65  ed.** to compare
28a30 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75   equal to an equ
28a40 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20  ivalent element 
28a50 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e  in pA with Expr.
28a60 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a  iTable==iTab..**
28a70 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65 20  .** The pA side 
28a80 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67 20 54  might be using T
28a90 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66 20  K_REGISTER.  If 
28aa0 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
28ab0 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f   and pB is.** no
28ac0 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53  t using TK_REGIS
28ad0 54 45 52 20 62 75 74 20 69 73 20 6f 74 68 65 72  TER but is other
28ae0 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74 2c  wise equivalent,
28af0 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75   then still retu
28b00 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  rn 0..**.** Some
28b10 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69  times this routi
28b20 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32  ne will return 2
28b30 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f   even if the two
28b40 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
28b50 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76  really are equiv
28b60 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61  alent.  If we ca
28b70 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20  nnot prove that 
28b80 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
28b90 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c  are.** identical
28ba0 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75  , we return 2 ju
28bb0 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20  st to be safe.  
28bc0 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
28bd0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c  ne.** returns 2,
28be0 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74   then you do not
28bf0 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72   really know for
28c00 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65 20   certain if the 
28c10 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
28c20 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
28c30 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65 74    But if you get
28c40 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e   a 0 or 1 return
28c50 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61  , then you.** ca
28c60 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78  n be sure the ex
28c70 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
28c80 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20  e same.  In the 
28c90 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20  places where.** 
28ca0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
28cb0 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f  used, it does no
28cc0 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e  t hurt to get an
28cd0 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a   extra 2 - that.
28ce0 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65  ** just might re
28cf0 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69  sult in some sli
28d00 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64  ghtly slower cod
28d10 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e  e.  But returnin
28d20 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63  g.** an incorrec
28d30 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c  t 0 or 1 could l
28d40 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63  ead to a malfunc
28d50 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  tion..**.** Argu
28d60 6d 65 6e 74 20 70 50 61 72 73 65 20 73 68 6f 75  ment pParse shou
28d70 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 4e  ld normally be N
28d80 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ULL. If it is no
28d90 74 20 4e 55 4c 4c 20 61 6e 64 20 0a 2a 2a 20 65  t NULL and .** e
28da0 78 70 72 65 73 73 69 6f 6e 20 70 41 20 63 6f 6e  xpression pA con
28db0 74 61 69 6e 73 20 53 51 4c 20 76 61 72 69 61 62  tains SQL variab
28dc0 6c 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74  le references, t
28dd0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 0a 2a  hen the values.*
28de0 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 6f 75 6e  * currently boun
28df0 64 20 74 6f 20 74 68 6f 73 65 20 76 61 72 69 61  d to those varia
28e00 62 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 6d  ble references m
28e10 61 79 20 62 65 20 63 6f 6d 70 61 72 65 64 20 74  ay be compared t
28e20 6f 0a 2a 2a 20 73 69 6d 70 6c 65 20 53 51 4c 20  o.** simple SQL 
28e30 76 61 6c 75 65 73 20 69 6e 20 70 42 2e 20 53 65  values in pB. Se
28e40 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
28e50 20 66 75 6e 63 74 69 6f 6e 20 65 78 70 72 43 6f   function exprCo
28e60 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 29 0a  mpareVariable().
28e70 2a 2a 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  ** for details..
28e80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
28e90 70 72 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20  prCompare(Parse 
28ea0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
28eb0 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74  A, Expr *pB, int
28ec0 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f   iTab){.  u32 co
28ed0 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69  mbinedFlags;.  i
28ee0 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
28ef0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
28f00 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a  pB==pA ? 0 : 2;.
28f10 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
28f20 20 26 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56   && pA->op==TK_V
28f30 41 52 49 41 42 4c 45 20 26 26 20 65 78 70 72 43  ARIABLE && exprC
28f40 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 70  ompareVariable(p
28f50 50 61 72 73 65 2c 20 70 41 2c 20 70 42 29 20 29  Parse, pA, pB) )
28f60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
28f70 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c    }.  combinedFl
28f80 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20  ags = pA->flags 
28f90 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  | pB->flags;.  i
28fa0 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
28fb0 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
28fc0 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66  {.    if( (pA->f
28fd0 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45  lags&pB->flags&E
28fe0 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26  P_IntValue)!=0 &
28ff0 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d  & pA->u.iValue==
29000 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a  pB->u.iValue ){.
29010 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
29020 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
29030 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   2;.  }.  if( pA
29040 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a  ->op!=pB->op ){.
29050 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d      if( pA->op==
29060 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
29070 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
29080 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65  (pParse, pA->pLe
29090 66 74 2c 70 42 2c 69 54 61 62 29 3c 32 20 29 7b  ft,pB,iTab)<2 ){
290a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
290b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
290c0 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  B->op==TK_COLLAT
290d0 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  E && sqlite3Expr
290e0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
290f0 70 41 2c 70 42 2d 3e 70 4c 65 66 74 2c 69 54 61  pA,pB->pLeft,iTa
29100 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65  b)<2 ){.      re
29110 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
29120 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a    return 2;.  }.
29130 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b    if( pA->op!=TK
29140 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f  _COLUMN && pA->o
29150 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p!=TK_AGG_COLUMN
29160 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e   && pA->u.zToken
29170 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
29180 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
29190 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
291a0 69 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e  ite3StrICmp(pA->
291b0 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
291c0 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75  Token)!=0 ) retu
291d0 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 2;.    }else 
291e0 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75  if( strcmp(pA->u
291f0 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
29200 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  oken)!=0 ){.    
29210 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d    return pA->op=
29220 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20  =TK_COLLATE ? 1 
29230 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  : 2;.    }.  }. 
29240 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20   if( (pA->flags 
29250 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d  & EP_Distinct)!=
29260 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pB->flags & EP_
29270 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75  Distinct) ) retu
29280 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57 41  rn 2;.  if( ALWA
29290 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67  YS((combinedFlag
292a0 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  s & EP_TokenOnly
292b0 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )==0) ){.    if(
292c0 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26   combinedFlags &
292d0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20   EP_xIsSelect ) 
292e0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
292f0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
29300 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d  pare(pParse, pA-
29310 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66  >pLeft, pB->pLef
29320 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
29330 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
29340 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
29350 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 52 69 67  pParse, pA->pRig
29360 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20  ht, pB->pRight, 
29370 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
29380 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
29390 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
293a0 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42  (pA->x.pList, pB
293b0 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29  ->x.pList, iTab)
293c0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
293d0 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d   if( ALWAYS((com
293e0 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
293f0 52 65 64 75 63 65 64 29 3d 3d 30 29 20 26 26 20  Reduced)==0) && 
29400 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e  pA->op!=TK_STRIN
29410 47 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  G ){.      if( p
29420 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
29430 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
29440 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41   2;.      if( pA
29450 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
29460 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20  able .       && 
29470 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61  (pA->iTable!=iTa
29480 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69  b || NEVER(pB->i
29490 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74  Table>=0)) ) ret
294a0 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 2;.    }.  }
294b0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
294c0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
294d0 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
294e0 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ts.  Return 0 if
294f0 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
29500 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d  cal and .** non-
29510 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66  zero if they dif
29520 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
29530 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62  **.** If any sub
29540 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61  element of pB ha
29550 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28  s Expr.iTable==(
29560 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61  -1) then it is a
29570 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d  llowed.** to com
29580 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e  pare equal to an
29590 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d   equivalent elem
295a0 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45  ent in pA with E
295b0 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62  xpr.iTable==iTab
295c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
295d0 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72  tine might retur
295e0 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65  n non-zero for e
295f0 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69  quivalent ExprLi
29600 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c  sts.  The.** onl
29610 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69  y consequence wi
29620 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f  ll be disabled o
29630 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42  ptimizations.  B
29640 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ut this routine.
29650 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65  ** must never re
29660 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
29670 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
29680 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
29690 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e  , or.** a malfun
296a0 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ction will resul
296b0 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  t..**.** Two NUL
296c0 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63  L pointers are c
296d0 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
296e0 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61  the same.  But a
296f0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a   NULL pointer.**
29700 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20   always differs 
29710 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  from a non-NULL 
29720 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
29730 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
29740 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20  ompare(ExprList 
29750 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *pA, ExprList *p
29760 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
29770 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
29780 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65  =0 && pB==0 ) re
29790 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
297a0 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72  ==0 || pB==0 ) r
297b0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
297c0 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45  A->nExpr!=pB->nE
297d0 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  xpr ) return 1;.
297e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
297f0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
29800 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d    Expr *pExprA =
29810 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pA->a[i].pExpr;
29820 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
29830 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78  B = pB->a[i].pEx
29840 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e  pr;.    if( pA->
29850 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d  a[i].sortOrder!=
29860 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  pB->a[i].sortOrd
29870 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  er ) return 1;. 
29880 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
29890 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78  prCompare(0, pEx
298a0 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61  prA, pExprB, iTa
298b0 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
298c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
298d0 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c  ../*.** Like sql
298e0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
298f0 29 20 65 78 63 65 70 74 20 43 4f 4c 4c 41 54 45  ) except COLLATE
29900 20 6f 70 65 72 61 74 6f 72 73 20 61 74 20 74 68   operators at th
29910 65 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61  e top-level.** a
29920 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69  re ignored..*/.i
29930 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
29940 6d 70 61 72 65 53 6b 69 70 28 45 78 70 72 20 2a  mpareSkip(Expr *
29950 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e  pA, Expr *pB, in
29960 74 20 69 54 61 62 29 7b 0a 20 20 72 65 74 75 72  t iTab){.  retur
29970 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  n sqlite3ExprCom
29980 70 61 72 65 28 30 2c 0a 20 20 20 20 20 20 20 20  pare(0,.        
29990 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
299a0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c  SkipCollate(pA),
299b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
299c0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
299d0 6c 61 74 65 28 70 42 29 2c 0a 20 20 20 20 20 20  late(pB),.      
299e0 20 20 20 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a         iTab);.}.
299f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
29a00 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f  ue if we can pro
29a10 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20  ve the pE2 will 
29a20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69  always be true i
29a30 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65  f pE1 is.** true
29a40 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
29a50 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d  if we cannot com
29a60 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20  plete the proof 
29a70 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a  or if pE2 might.
29a80 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78  ** be false.  Ex
29a90 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
29aa0 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20    pE1: x==5     
29ab0 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20    pE2: x==5     
29ac0 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20          Result: 
29ad0 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
29ae0 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a   x>0        pE2:
29af0 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20   x==5           
29b00 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a    Result: false.
29b10 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31  **     pE1: x=21
29b20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31         pE2: x=21
29b30 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73   OR y=43     Res
29b40 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
29b50 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20   pE1: x!=123    
29b60 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
29b70 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74  ULL    Result: t
29b80 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
29b90 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20  x!=?1      pE2: 
29ba0 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
29bb0 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
29bc0 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e       pE1: x IS N
29bd0 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e  ULL  pE2: x IS N
29be0 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
29bf0 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
29c00 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20  pE1: x IS ?2    
29c10 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
29c20 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61  LL    Reuslt: fa
29c30 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63  lse.**.** When c
29c40 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55  omparing TK_COLU
29c50 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e  MN nodes between
29c60 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66   pE1 and pE2, if
29c70 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72   pE2 has.** Expr
29c80 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61  .iTable<0 then a
29c90 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75  ssume a table nu
29ca0 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54  mber given by iT
29cb0 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69  ab..**.** When i
29cc0 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20  n doubt, return 
29cd0 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e  false.  Returnin
29ce0 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69 76  g true might giv
29cf0 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  e a performance.
29d00 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20  ** improvement. 
29d10 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65   Returning false
29d20 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 70   might cause a p
29d30 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
29d40 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20  tion, but.** it 
29d50 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65  will always give
29d60 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
29d70 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65  wer and is hence
29d80 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f   always safe..*/
29d90 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
29da0 49 6d 70 6c 69 65 73 45 78 70 72 28 50 61 72 73  ImpliesExpr(Pars
29db0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
29dc0 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c  *pE1, Expr *pE2,
29dd0 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66   int iTab){.  if
29de0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
29df0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 31  pare(pParse, pE1
29e00 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30 20  , pE2, iTab)==0 
29e10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
29e20 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e  .  }.  if( pE2->
29e30 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20  op==TK_OR.   && 
29e40 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c  (sqlite3ExprImpl
29e50 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c 20  iesExpr(pParse, 
29e60 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c  pE1, pE2->pLeft,
29e70 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20 20   iTab).         
29e80 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78      || sqlite3Ex
29e90 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 50  prImpliesExpr(pP
29ea0 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e  arse, pE1, pE2->
29eb0 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 0a  pRight, iTab) ).
29ec0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
29ed0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32  1;.  }.  if( pE2
29ee0 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op==TK_NOTNULL
29ef0 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f   && pE1->op!=TK_
29f00 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f  ISNULL && pE1->o
29f10 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20 20  p!=TK_IS ){.    
29f20 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c 69 74  Expr *pX = sqlit
29f30 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
29f40 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b 0a 20  e(pE1->pLeft);. 
29f50 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 21     testcase( pX!
29f60 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  =pE1->pLeft );. 
29f70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
29f80 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
29f90 2c 20 70 58 2c 20 70 45 32 2d 3e 70 4c 65 66 74  , pX, pE2->pLeft
29fa0 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72 65 74  , iTab)==0 ) ret
29fb0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
29fc0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
29fd0 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
29fe0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
29ff0 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62  ucture is used b
2a000 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65  y the tree walke
2a010 72 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  r.** to determin
2a020 65 20 69 66 20 61 6e 20 65 78 70 72 65 73 73 69  e if an expressi
2a030 6f 6e 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61  on can be evalua
2a040 74 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 65  ted by reference
2a050 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78   to the.** index
2a060 20 6f 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20 68   only, without h
2a070 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 20 73 65  aving to do a se
2a080 61 72 63 68 20 66 6f 72 20 74 68 65 20 63 6f 72  arch for the cor
2a090 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61  responding.** ta
2a0a0 62 6c 65 20 65 6e 74 72 79 2e 20 20 54 68 65 20  ble entry.  The 
2a0b0 49 64 78 43 6f 76 65 72 2e 70 49 64 78 20 66 69  IdxCover.pIdx fi
2a0c0 65 6c 64 20 69 73 20 74 68 65 20 69 6e 64 65 78  eld is the index
2a0d0 2e 20 20 49 64 78 43 6f 76 65 72 2e 69 43 75 72  .  IdxCover.iCur
2a0e0 0a 2a 2a 20 69 73 20 74 68 65 20 63 75 72 73 6f  .** is the curso
2a0f0 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  r for the table.
2a100 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78 43 6f  .*/.struct IdxCo
2a110 76 65 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ver {.  Index *p
2a120 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  Idx;     /* The 
2a130 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74  index to be test
2a140 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20  ed for coverage 
2a150 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
2a160 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
2a170 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
2a180 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  able correspondi
2a190 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ng to the index 
2a1a0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  */.};../*.** Che
2a1b0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
2a1c0 72 65 20 61 72 65 20 72 65 66 65 72 65 6e 63 65  re are reference
2a1d0 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
2a1e0 74 61 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65  table .** pWalke
2a1f0 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e  r->u.pIdxCover->
2a200 69 43 75 72 20 63 61 6e 20 62 65 20 73 61 74 69  iCur can be sati
2a210 73 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20  sfied using the 
2a220 69 6e 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72  index.** pWalker
2a230 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70  ->u.pIdxCover->p
2a240 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Idx..*/.static i
2a250 6e 74 20 65 78 70 72 49 64 78 43 6f 76 65 72 28  nt exprIdxCover(
2a260 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2a270 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2a280 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
2a290 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20  TK_COLUMN.   && 
2a2a0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
2a2b0 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f  Walker->u.pIdxCo
2a2c0 76 65 72 2d 3e 69 43 75 72 0a 20 20 20 26 26 20  ver->iCur.   && 
2a2d0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
2a2e0 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e  ndex(pWalker->u.
2a2f0 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c  pIdxCover->pIdx,
2a300 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
2a310 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70 57 61 6c  <0.  ){.    pWal
2a320 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a  ker->eCode = 1;.
2a330 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
2a340 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  bort;.  }.  retu
2a350 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2a360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
2a370 69 6e 65 20 69 66 20 61 6e 20 69 6e 64 65 78 20  ine if an index 
2a380 70 49 64 78 20 6f 6e 20 74 61 62 6c 65 20 77 69  pIdx on table wi
2a390 74 68 20 63 75 72 73 6f 72 20 69 43 75 72 20 63  th cursor iCur c
2a3a0 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20  ontains will.** 
2a3b0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
2a3c0 45 78 70 72 2e 20 20 52 65 74 75 72 6e 20 74 72  Expr.  Return tr
2a3d0 75 65 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ue if the index 
2a3e0 64 6f 65 73 20 63 6f 76 65 72 20 74 68 65 0a 2a  does cover the.*
2a3f0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
2a400 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 70 45   false if the pE
2a410 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 72  xpr expression r
2a420 65 66 65 72 65 6e 63 65 73 20 74 61 62 6c 65 20  eferences table 
2a430 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20  columns.** that 
2a440 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e  are not found in
2a450 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 2e   the index pIdx.
2a460 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20  .**.** An index 
2a470 63 6f 76 65 72 69 6e 67 20 61 6e 20 65 78 70 72  covering an expr
2a480 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  ession means tha
2a490 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
2a4a0 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75   can be.** evalu
2a4b0 61 74 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20  ated using only 
2a4c0 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 77 69  the index and wi
2a4d0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
2a4e0 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f  lookup the.** co
2a4f0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
2a500 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20  e entry..*/.int 
2a510 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72  sqlite3ExprCover
2a520 65 64 42 79 49 6e 64 65 78 28 0a 20 20 45 78 70  edByIndex(.  Exp
2a530 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
2a540 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
2a550 20 62 65 20 74 65 73 74 65 64 20 2a 2f 0a 20 20   be tested */.  
2a560 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
2a570 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
2a580 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
2a590 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2a5a0 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  able */.  Index 
2a5b0 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a  *pIdx         /*
2a5c0 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   The index that 
2a5d0 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 66 6f  might be used fo
2a5e0 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b  r coverage */.){
2a5f0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
2a600 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20 78  truct IdxCover x
2a610 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  cov;.  memset(&w
2a620 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
2a630 0a 20 20 78 63 6f 76 2e 69 43 75 72 20 3d 20 69  .  xcov.iCur = i
2a640 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78  Cur;.  xcov.pIdx
2a650 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e 78 45 78   = pIdx;.  w.xEx
2a660 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
2a670 72 49 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75  rIdxCover;.  w.u
2a680 2e 70 49 64 78 43 6f 76 65 72 20 3d 20 26 78 63  .pIdxCover = &xc
2a690 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  ov;.  sqlite3Wal
2a6a0 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
2a6b0 3b 0a 20 20 72 65 74 75 72 6e 20 21 77 2e 65 43  ;.  return !w.eC
2a6c0 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  ode;.}.../*.** A
2a6d0 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2a6e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2a6f0 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79  cture is used by
2a700 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72   the tree walker
2a710 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66  .** to count ref
2a720 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65  erences to table
2a730 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2a740 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20  arguments of an 
2a750 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66 75  .** aggregate fu
2a760 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72  nction, in order
2a770 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
2a780 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63  e.** sqlite3Func
2a790 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f  tionThisSrc() ro
2a7a0 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  utine..*/.struct
2a7b0 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72   SrcCount {.  Sr
2a7c0 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f  cList *pSrc;   /
2a7d0 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72  * One particular
2a7e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20   FROM clause in 
2a7f0 61 20 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a  a nested query *
2a800 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20  /.  int nThis;  
2a810 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2a820 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
2a830 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c  columns in pSrcL
2a840 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74  ist */.  int nOt
2a850 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  her;      /* Num
2a860 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2a870 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
2a880 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73  other FROM claus
2a890 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  es */.};../*.** 
2a8a0 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
2a8b0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
2a8c0 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74  o columns..*/.st
2a8d0 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 72 63  atic int exprSrc
2a8e0 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  Count(Walker *pW
2a8f0 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
2a900 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45  pr){.  /* The NE
2a910 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63  VER() on the sec
2a920 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63 61  ond term is beca
2a930 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74  use sqlite3Funct
2a940 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29  ionUsesThisSrc()
2a950 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  .  ** is always 
2a960 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71  called before sq
2a970 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2a980 41 67 67 72 65 67 61 74 65 73 28 29 20 61 6e 64  Aggregates() and
2a990 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f   so the.  ** TK_
2a9a0 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74  COLUMNs have not
2a9b0 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72   yet been conver
2a9c0 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f  ted into TK_AGG_
2a9d0 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a  COLUMN.  If.  **
2a9e0 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
2a9f0 55 73 65 73 54 68 69 73 53 72 63 28 29 20 69 73  UsesThisSrc() is
2aa00 20 75 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c   used differentl
2aa10 79 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  y in the future,
2aa20 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28   the.  ** NEVER(
2aa30 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  ) will need to b
2aa40 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20  e removed. */.  
2aa50 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
2aa60 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45  K_COLUMN || NEVE
2aa70 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  R(pExpr->op==TK_
2aa80 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20  AGG_COLUMN) ){. 
2aa90 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
2aaa0 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70  ruct SrcCount *p
2aab0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53   = pWalker->u.pS
2aac0 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63  rcCount;.    Src
2aad0 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e  List *pSrc = p->
2aae0 70 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53  pSrc;.    int nS
2aaf0 72 63 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63  rc = pSrc ? pSrc
2ab00 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20  ->nSrc : 0;.    
2ab10 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b  for(i=0; i<nSrc;
2ab20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
2ab30 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
2ab40 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  pSrc->a[i].iCurs
2ab50 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  or ) break;.    
2ab60 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63  }.    if( i<nSrc
2ab70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68   ){.      p->nTh
2ab80 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  is++;.    }else{
2ab90 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72  .      p->nOther
2aba0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
2abb0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2abc0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  nue;.}../*.** De
2abd0 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f  termine if any o
2abe0 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  f the arguments 
2abf0 74 6f 20 74 68 65 20 70 45 78 70 72 20 46 75 6e  to the pExpr Fun
2ac00 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a  ction reference.
2ac10 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65  ** pSrcList.  Re
2ac20 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
2ac30 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75  y do.  Also retu
2ac40 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 66  rn true if the f
2ac50 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e  unction.** has n
2ac60 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68  o arguments or h
2ac70 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74  as only constant
2ac80 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
2ac90 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78  urn false if pEx
2aca0 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  pr.** references
2acb0 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74   columns but not
2acc0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c   columns of tabl
2acd0 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63  es found in pSrc
2ace0 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  List..*/.int sql
2acf0 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
2ad00 54 68 69 73 53 72 63 28 45 78 70 72 20 2a 70 45  ThisSrc(Expr *pE
2ad10 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53  xpr, SrcList *pS
2ad20 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65  rcList){.  Walke
2ad30 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72  r w;.  struct Sr
2ad40 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73  cCount cnt;.  as
2ad50 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
2ad60 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
2ad70 20 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   );.  w.xExprCal
2ad80 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43  lback = exprSrcC
2ad90 6f 75 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63  ount;.  w.xSelec
2ada0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  tCallback = 0;. 
2adb0 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d   w.u.pSrcCount =
2adc0 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72   &cnt;.  cnt.pSr
2add0 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20  c = pSrcList;.  
2ade0 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20  cnt.nThis = 0;. 
2adf0 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b   cnt.nOther = 0;
2ae00 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2ae10 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72  prList(&w, pExpr
2ae20 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65  ->x.pList);.  re
2ae30 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30  turn cnt.nThis>0
2ae40 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d   || cnt.nOther==
2ae50 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
2ae60 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
2ae70 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
2ae80 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  Col[] array.  Re
2ae90 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
2aea0 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
2aeb0 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
2aec0 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
2aed0 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
2aee0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2aef0 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
2af00 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
2af10 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
2af20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
2af30 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72  aCol = sqlite3Ar
2af40 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
2af50 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70      db,.       p
2af60 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20  Info->aCol,.    
2af70 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
2af80 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20  >aCol[0]),.     
2af90 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d    &pInfo->nColum
2afa0 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  n,.       &i.  )
2afb0 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
2afc0 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61     ../*.** Add a
2afd0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
2afe0 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  the pAggInfo->aF
2aff0 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  unc[] array.  Re
2b000 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
2b010 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
2b020 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
2b030 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
2b040 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
2b050 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2b060 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71  ddAggInfoFunc(sq
2b070 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
2b080 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
2b090 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46  t i;.  pInfo->aF
2b0a0 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72  unc = sqlite3Arr
2b0b0 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
2b0c0 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70     db, .       p
2b0d0 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20  Info->aFunc,.   
2b0e0 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
2b0f0 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20  ->aFunc[0]),.   
2b100 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e      &pInfo->nFun
2b110 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  c,.       &i.  )
2b120 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
2b130 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20     ../*.** This 
2b140 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c  is the xExprCall
2b150 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20  back for a tree 
2b160 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75  walker.  It is u
2b170 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  sed to.** implem
2b180 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41  ent sqlite3ExprA
2b190 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2b1a0 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ().  See sqlite3
2b1b0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2b1c0 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64  gates.** for add
2b1d0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
2b1e0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
2b1f0 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
2b200 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ate(Walker *pWal
2b210 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
2b220 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  ){.  int i;.  Na
2b230 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
2b240 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b   pWalker->u.pNC;
2b250 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2b260 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
2b270 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
2b280 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
2b290 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a  ist;.  AggInfo *
2b2a0 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e  pAggInfo = pNC->
2b2b0 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69  pAggInfo;..  swi
2b2c0 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
2b2d0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
2b2e0 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
2b2f0 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
2b300 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b310 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
2b320 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
2b330 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2b340 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2b350 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65   );.      /* Che
2b360 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
2b370 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e   column is in on
2b380 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
2b390 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20  in the FROM.    
2b3a0 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
2b3b0 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
2b3c0 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ry */.      if( 
2b3d0 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21  ALWAYS(pSrcList!
2b3e0 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =0) ){.        s
2b3f0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2b400 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
2b410 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
2b420 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
2b430 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
2b440 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2b450 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2b460 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
2b470 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2b480 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2b490 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
2b4a0 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
2b4b0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
2b4c0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
2b4d0 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
2b4e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b4f0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
2b500 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
2b510 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
2b520 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
2b530 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2b540 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
2b550 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
2b560 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
2b570 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
2b580 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
2b590 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
2b5a0 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
2b5b0 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
2b5c0 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
2b5d0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
2b5e0 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
2b5f0 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
2b600 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2b610 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
2b620 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
2b630 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
2b640 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2b650 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
2b660 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
2b670 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
2b680 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
2b690 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
2b6a0 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
2b6b0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2b6c0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
2b6d0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
2b6e0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2b6f0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2b700 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2b710 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b720 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e   (k>=pAggInfo->n
2b730 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20  Column).        
2b740 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64       && (k = add
2b750 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50  AggInfoColumn(pP
2b760 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
2b770 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  fo))>=0 .       
2b780 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2b790 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41        pCol = &pA
2b7a0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b  ggInfo->aCol[k];
2b7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2b7c0 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70  Col->pTab = pExp
2b7d0 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
2b7e0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61         pCol->iTa
2b7f0 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
2b800 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
2b810 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
2b820 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
2b830 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
2b840 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b   pCol->iMem = ++
2b850 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2b860 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2b870 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
2b880 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
2b890 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20      pCol->pExpr 
2b8a0 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
2b8b0 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49         if( pAggI
2b8c0 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  nfo->pGroupBy ){
2b8d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b8e0 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20   int j, n;.     
2b8f0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c             ExprL
2b900 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49  ist *pGB = pAggI
2b910 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  nfo->pGroupBy;. 
2b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2b930 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2b940 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42  tem *pTerm = pGB
2b950 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->a;.           
2b960 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45       n = pGB->nE
2b970 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
2b980 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2b990 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  n; j++, pTerm++)
2b9a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b9b0 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
2b9c0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
2b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2b9e0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pE->op==TK_CO
2b9f0 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62  LUMN && pE->iTab
2ba00 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
2ba10 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
2ba20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69             pE->i
2ba30 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
2ba40 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
2ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2ba60 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2ba70 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
2ba80 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2ba90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2baa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2bab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bad0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
2bae0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20  iSorterColumn<0 
2baf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2bb00 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
2bb10 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66  Column = pAggInf
2bb20 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  o->nSortingColum
2bb30 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n++;.           
2bb40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2bb50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
2bb60 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61  * There is now a
2bb70 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70  n entry for pExp
2bb80 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  r in pAggInfo->a
2bb90 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20  Col[] (either.  
2bba0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
2bbb0 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72  ause it was ther
2bbc0 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61  e before or beca
2bbd0 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61  use we just crea
2bbe0 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20  ted it)..       
2bbf0 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20       ** Convert 
2bc00 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20  the pExpr to be 
2bc10 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  a TK_AGG_COLUMN 
2bc20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61  referring to tha
2bc30 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
2bc40 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2bc50 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20  ] entry..       
2bc60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2bc70 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
2bc80 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2bc90 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
2bca0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
2bcb0 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
2bcc0 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo;.            
2bcd0 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
2bce0 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  GG_COLUMN;.     
2bcf0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
2bd00 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20  gg = (i16)k;.   
2bd10 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2bd20 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65            } /* e
2bd30 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62  ndif pExpr->iTab
2bd40 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
2bd50 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20  or */.        } 
2bd60 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* end loop over
2bd70 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20   pSrcList */.   
2bd80 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
2bd90 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
2bda0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
2bdb0 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
2bdc0 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e       if( (pNC->n
2bdd0 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67  cFlags & NC_InAg
2bde0 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20  gFunc)==0.      
2bdf0 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c   && pWalker->wal
2be00 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d  kerDepth==pExpr-
2be10 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20  >op2.      ){.  
2be20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
2be30 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69  o see if pExpr i
2be40 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
2be50 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61   another aggrega
2be60 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  te .        ** f
2be70 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
2be80 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
2be90 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
2bea0 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
2beb0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2bec0 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20  nfo_func *pItem 
2bed0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
2bee0 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  c;.        for(i
2bef0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
2bf00 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65  nFunc; i++, pIte
2bf10 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
2bf20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
2bf30 6f 6d 70 61 72 65 28 30 2c 20 70 49 74 65 6d 2d  ompare(0, pItem-
2bf40 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d  >pExpr, pExpr, -
2bf50 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
2bf60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2bf70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bf80 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  }.        if( i>
2bf90 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  =pAggInfo->nFunc
2bfa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2bfb0 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e   pExpr is origin
2bfc0 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20  al.  Make a new 
2bfd0 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66  entry in pAggInf
2bfe0 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20  o->aFunc[].     
2bff0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2c000 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70    u8 enc = ENC(p
2c010 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
2c020 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67        i = addAgg
2c030 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d  InfoFunc(pParse-
2c040 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a  >db, pAggInfo);.
2c050 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
2c060 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c070 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2c080 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2c090 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2c0a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2c0b0 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f  Item = &pAggInfo
2c0c0 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20  ->aFunc[i];.    
2c0d0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
2c0e0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
2c0f0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2c100 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
2c110 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
2c120 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2c130 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2c140 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
2c150 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2c160 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73  pItem->pFunc = s
2c170 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
2c180 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  on(pParse->db,. 
2c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c1a0 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65    pExpr->u.zToke
2c1b0 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  n, .            
2c1c0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e         pExpr->x.
2c1d0 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78  pList ? pExpr->x
2c1e0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  .pList->nExpr : 
2c1f0 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  0, enc, 0);.    
2c200 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
2c210 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  r->flags & EP_Di
2c220 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
2c230 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
2c240 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  Distinct = pPars
2c250 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
2c260 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c270 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2c280 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  m->iDistinct = -
2c290 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
2c2a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c2b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
2c2c0 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69  * Make pExpr poi
2c2d0 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  nt to the approp
2c2e0 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e  riate pAggInfo->
2c2f0 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20  aFunc[] entry.  
2c300 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2c310 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2c320 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
2c330 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
2c340 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
2c350 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
2c360 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2c370 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
2c380 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
2c390 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20   = (i16)i;.     
2c3a0 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
2c3b0 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
2c3c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2c3d0 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
2c3e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
2c3f0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2c400 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
2c410 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2c420 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74  C_Continue;.}.st
2c430 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
2c440 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
2c450 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ct(Walker *pWalk
2c460 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  er, Select *pSel
2c470 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ect){.  UNUSED_P
2c480 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74  ARAMETER(pSelect
2c490 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61  );.  pWalker->wa
2c4a0 6c 6b 65 72 44 65 70 74 68 2b 2b 3b 0a 20 20 72  lkerDepth++;.  r
2c4b0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2c4c0 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ue;.}.static voi
2c4d0 64 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  d analyzeAggrega
2c4e0 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 28 57  tesInSelectEnd(W
2c4f0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2c500 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
2c510 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2c520 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20  ETER(pSelect);. 
2c530 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72   pWalker->walker
2c540 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a  Depth--;.}../*.*
2c550 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45  * Analyze the pE
2c560 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  xpr expression l
2c570 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
2c580 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
2c590 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
2c5a0 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
2c5b0 20 62 65 20 61 64 64 65 64 20 74 6f 20 41 67 67   be added to Agg
2c5c0 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  Info object that
2c5d0 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a   pNC->pAggInfo.*
2c5e0 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64  * points to.  Ad
2c5f0 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73  ditional entries
2c600 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65   are made on the
2c610 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20   AggInfo object 
2c620 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e  as.** necessary.
2c630 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2c640 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
2c650 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
2c660 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
2c670 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79  as been.** analy
2c680 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52 65  zed by sqlite3Re
2c690 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
2c6a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2c6b0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2c6c0 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65  egates(NameConte
2c6d0 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70  xt *pNC, Expr *p
2c6e0 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Expr){.  Walker 
2c6f0 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  w;.  w.xExprCall
2c700 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
2c710 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65  gregate;.  w.xSe
2c720 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61  lectCallback = a
2c730 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2c740 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 78 53  InSelect;.  w.xS
2c750 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
2c760 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2c770 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 3b 0a 20  esInSelectEnd;. 
2c780 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68 20 3d   w.walkerDepth =
2c790 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20   0;.  w.u.pNC = 
2c7a0 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pNC;.  assert( p
2c7b0 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20  NC->pSrcList!=0 
2c7c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  );.  sqlite3Walk
2c7d0 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b  Expr(&w, pExpr);
2c7e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73  .}../*.** Call s
2c7f0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2c800 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f  eAggregates() fo
2c810 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
2c820 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72  on in an.** expr
2c830 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65  ession list.  Re
2c840 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
2c850 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
2c860 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
2c870 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79  found, the analy
2c880 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74  sis is cut short
2c890 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2c8a0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2c8b0 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ist(NameContext 
2c8c0 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a  *pNC, ExprList *
2c8d0 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74  pList){.  struct
2c8e0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2c8f0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
2c900 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
2c910 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69     for(pItem=pLi
2c920 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
2c930 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
2c940 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2c950 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2c960 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e  yzeAggregates(pN
2c970 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  C, pItem->pExpr)
2c980 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2c990 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
2c9a0 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73  single new regis
2c9b0 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68  ter for use to h
2c9c0 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65  old some interme
2c9d0 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f  diate result..*/
2c9e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54  .int sqlite3GetT
2c9f0 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
2ca00 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61  arse){.  if( pPa
2ca10 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30  rse->nTempReg==0
2ca20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b   ){.    return +
2ca30 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2ca40 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72   }.  return pPar
2ca50 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70  se->aTempReg[--p
2ca60 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d  Parse->nTempReg]
2ca70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
2ca80 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65 72  ocate a register
2ca90 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62  , making availab
2caa0 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72  le for reuse for
2cab0 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
2cac0 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  urpose..**.** If
2cad0 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 63   a register is c
2cae0 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75  urrently being u
2caf0 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d  sed by the colum
2cb00 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a  n cache, then.**
2cb10 20 74 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f   the deallocatio
2cb20 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  n is deferred un
2cb30 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  til the column c
2cb40 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75  ache line that u
2cb50 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  ses.** the regis
2cb60 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c  ter becomes stal
2cb70 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
2cb80 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
2cb90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2cba0 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28  int iReg){.  if(
2cbb0 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d   iReg && pParse-
2cbc0 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
2cbd0 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
2cbe0 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74  pReg) ){.    int
2cbf0 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79   i;.    struct y
2cc00 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20  ColCache *p;.   
2cc10 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
2cc20 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
2cc30 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
2cc40 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  he; i++, p++){. 
2cc50 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67       if( p->iReg
2cc60 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ==iReg ){.      
2cc70 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31    p->tempReg = 1
2cc80 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2cc90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2cca0 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
2ccb0 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
2ccc0 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
2ccd0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
2cce0 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
2ccf0 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
2cd00 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
2cd10 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69   registers..*/.i
2cd20 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
2cd30 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
2cd40 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
2cd50 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
2cd60 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74  f( nReg==1 ) ret
2cd70 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65  urn sqlite3GetTe
2cd80 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
2cd90 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61   i = pParse->iRa
2cda0 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50  ngeReg;.  n = pP
2cdb0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b  arse->nRangeReg;
2cdc0 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29  .  if( nReg<=n )
2cdd0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 75  {.    assert( !u
2cde0 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
2cdf0 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d  (pParse, i, i+n-
2ce00 31 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  1) );.    pParse
2ce10 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e  ->iRangeReg += n
2ce20 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
2ce30 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52  >nRangeReg -= nR
2ce40 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eg;.  }else{.   
2ce50 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65   i = pParse->nMe
2ce60 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
2ce70 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20  >nMem += nReg;. 
2ce80 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
2ce90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
2cea0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61  easeTempRange(Pa
2ceb0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2cec0 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
2ced0 7b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20  {.  if( nReg==1 
2cee0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
2cef0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
2cf00 72 73 65 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  rse, iReg);.    
2cf10 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
2cf20 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
2cf30 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52 65  move(pParse, iRe
2cf40 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20  g, nReg);.  if( 
2cf50 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61  nReg>pParse->nRa
2cf60 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50  ngeReg ){.    pP
2cf70 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2cf80 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
2cf90 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20  se->iRangeReg = 
2cfa0 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iReg;.  }.}../*.
2cfb0 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70  ** Mark all temp
2cfc0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
2cfd0 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c  as being unavail
2cfe0 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a  able for reuse..
2cff0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
2d000 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
2d010 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
2d020 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  .  pParse->nTemp
2d030 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Reg = 0;.  pPars
2d040 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30  e->nRangeReg = 0
2d050 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64  ;.}../*.** Valid
2d060 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70  ate that no temp
2d070 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 66  orary register f
2d080 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20  alls within the 
2d090 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72  range of.** iFir
2d0a0 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75  st..iLast, inclu
2d0b0 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74  sive.  This rout
2d0c0 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
2d0d0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73   from within ass
2d0e0 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65  ert().** stateme
2d0f0 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nts..*/.#ifdef S
2d100 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
2d110 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e  sqlite3NoTempsIn
2d120 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
2d130 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c  rse, int iFirst,
2d140 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69   int iLast){.  i
2d150 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72  nt i;.  if( pPar
2d160 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a  se->nRangeReg>0.
2d170 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52     && pParse->iR
2d180 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e  angeReg+pParse->
2d190 6e 52 61 6e 67 65 52 65 67 3c 69 4c 61 73 74 0a  nRangeReg<iLast.
2d1a0 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52     && pParse->iR
2d1b0 61 6e 67 65 52 65 67 3e 3d 69 46 69 72 73 74 0a  angeReg>=iFirst.
2d1c0 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e    ){.     return
2d1d0 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
2d1e0 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65  0; i<pParse->nTe
2d1f0 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  mpReg; i++){.   
2d200 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54 65   if( pParse->aTe
2d210 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74  mpReg[i]>=iFirst
2d220 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65 6d   && pParse->aTem
2d230 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29  pReg[i]<=iLast )
2d240 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
2d250 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2d260 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
2d270 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
2d280 20 2a 2f 0a                                       */.