/ Hex Artifact Content
Login

Artifact 26f51aa89dd4fb89f2addf1c5b75e2505e2df638d7df36663b2e1d77e15d1950:


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 7c 45 50 5f   EP_IntValue|EP_
6320: 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20 70 4e  Leaf;.        pN
6330: 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
6340: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Value;.      }el
6350: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
6360: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68  ->u.zToken = (ch
6370: 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
6380: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
6390: 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54  oken->z!=0 || pT
63a0: 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20  oken->n==0 );.  
63b0: 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e        if( pToken
63c0: 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65  ->n ) memcpy(pNe
63d0: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f  w->u.zToken, pTo
63e0: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
63f0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  n);.        pNew
6400: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65  ->u.zToken[pToke
6410: 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  n->n] = 0;.     
6420: 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26     if( dequote &
6430: 26 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74 65  & sqlite3Isquote
6440: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  (pNew->u.zToken[
6450: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0]) ){.         
6460: 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f   if( pNew->u.zTo
6470: 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70 4e  ken[0]=='"' ) pN
6480: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
6490: 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20  DblQuoted;.     
64a0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
64b0: 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  ote(pNew->u.zTok
64c0: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  en);.        }. 
64d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
64e0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
64f0: 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65  _DEPTH>0.    pNe
6500: 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a  w->nHeight = 1;.
6510: 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72  #endif  .  }.  r
6520: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
6530: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
6540: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
6550: 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d  ode from a zero-
6560: 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e  terminated token
6570: 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72   that has.** alr
6580: 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74  eady been dequot
6590: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
65a0: 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69  ite3Expr(.  sqli
65b0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
65c0: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
65d0: 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  r sqlite3DbMallo
65e0: 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20  cZero() (may be 
65f0: 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  null) */.  int o
6600: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6610: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
6620: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e   opcode */.  con
6630: 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20  st char *zToken 
6640: 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72       /* Token ar
6650: 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62  gument.  Might b
6660: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54  e NULL */.){.  T
6670: 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20  oken x;.  x.z = 
6680: 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20  zToken;.  x.n = 
6690: 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33  zToken ? sqlite3
66a0: 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29  Strlen30(zToken)
66b0: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73   : 0;.  return s
66c0: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
66d0: 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a  db, op, &x, 0);.
66e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20  }../*.** Attach 
66f0: 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61  subtrees pLeft a
6700: 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65  nd pRight to the
6710: 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74   Expr node pRoot
6720: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74  ..**.** If pRoot
6730: 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
6740: 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20  s that a memory 
6750: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
6760: 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a   has occurred..*
6770: 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  * In that case, 
6780: 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72  delete the subtr
6790: 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ees pLeft and pR
67a0: 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ight..*/.void sq
67b0: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
67c0: 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74  ubtrees(.  sqlit
67d0: 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a  e3 *db,.  Expr *
67e0: 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70  pRoot,.  Expr *p
67f0: 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52  Left,.  Expr *pR
6800: 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52  ight.){.  if( pR
6810: 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  oot==0 ){.    as
6820: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
6830: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
6840: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6850: 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  db, pLeft);.    
6860: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6870: 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  e(db, pRight);. 
6880: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
6890: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
68a0: 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20  pRoot->pRight = 
68b0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52  pRight;.      pR
68c0: 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  oot->flags |= EP
68d0: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 52 69  _Propagate & pRi
68e0: 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  ght->flags;.    
68f0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20  }.    if( pLeft 
6900: 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  ){.      pRoot->
6910: 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20  pLeft = pLeft;. 
6920: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67       pRoot->flag
6930: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
6940: 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  e & pLeft->flags
6950: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72  ;.    }.    expr
6960: 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29  SetHeight(pRoot)
6970: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
6980: 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20  llocate an Expr 
6990: 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73  node which joins
69a0: 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20   as many as two 
69b0: 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20  subtrees..**.** 
69c0: 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  One or both of t
69d0: 68 65 20 73 75 62 74 72 65 65 73 20 63 61 6e 20  he subtrees can 
69e0: 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e  be NULL.  Return
69f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
6a00: 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f  e new.** Expr no
6a10: 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f  de.  Or, if an O
6a20: 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
6a30: 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d   set pParse->db-
6a40: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a  >mallocFailed,.*
6a50: 2a 20 66 72 65 65 20 74 68 65 20 73 75 62 74 72  * free the subtr
6a60: 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ees and return N
6a70: 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ULL..*/.Expr *sq
6a80: 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61  lite3PExpr(.  Pa
6a90: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
6aa0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
6ab0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
6ac0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
6ad0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6ae0: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6af0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
6b00: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20          /* Left 
6b10: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
6b20: 72 20 2a 70 52 69 67 68 74 20 20 20 20 20 20 20  r *pRight       
6b30: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70       /* Right op
6b40: 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78  erand */.){.  Ex
6b50: 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d  pr *p;.  if( op=
6b60: 3d 54 4b 5f 41 4e 44 20 26 26 20 70 50 61 72 73  =TK_AND && pPars
6b70: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
6b80: 20 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74    /* Take advant
6b90: 61 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72  age of short-cir
6ba0: 63 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d  cuit false optim
6bb0: 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20  ization for AND 
6bc0: 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  */.    p = sqlit
6bd0: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
6be0: 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69  ->db, pLeft, pRi
6bf0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
6c00: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62     p = sqlite3Db
6c10: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72  MallocRawNN(pPar
6c20: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45  se->db, sizeof(E
6c30: 78 70 72 29 29 3b 0a 20 20 20 20 69 66 28 20 70  xpr));.    if( p
6c40: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
6c50: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  (p, 0, sizeof(Ex
6c60: 70 72 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6f  pr));.      p->o
6c70: 70 20 3d 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d  p = op & TKFLG_M
6c80: 41 53 4b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41  ASK;.      p->iA
6c90: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  gg = -1;.    }. 
6ca0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74     sqlite3ExprAt
6cb0: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
6cc0: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
6cd0: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  t, pRight);.  }.
6ce0: 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20    if( p ) {.    
6cf0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
6d00: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
6d10: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a  ->nHeight);.  }.
6d20: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
6d30: 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74  *.** Add pSelect
6d40: 20 74 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70   to the Expr.x.p
6d50: 53 65 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f  Select field.  O
6d60: 72 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 4e  r, if pExpr is N
6d70: 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61  ULL (due.** do a
6d80: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6d90: 6f 6e 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e  on failure) then
6da0: 20 64 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c   delete the pSel
6db0: 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76  ect object..*/.v
6dc0: 6f 69 64 20 73 71 6c 69 74 65 33 50 45 78 70 72  oid sqlite3PExpr
6dd0: 41 64 64 53 65 6c 65 63 74 28 50 61 72 73 65 20  AddSelect(Parse 
6de0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
6df0: 45 78 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  Expr, Select *pS
6e00: 65 6c 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45  elect){.  if( pE
6e10: 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72  xpr ){.    pExpr
6e20: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53  ->x.pSelect = pS
6e30: 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53  elect;.    ExprS
6e40: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
6e50: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45  , EP_xIsSelect|E
6e60: 50 5f 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20  P_Subquery);.   
6e70: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
6e80: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50  eightAndFlags(pP
6e90: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
6ea0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
6eb0: 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
6ec0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6ed0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
6ee0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
6ef0: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  b, pSelect);.  }
6f00: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
6f10: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
6f20: 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 54 52  always either TR
6f30: 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72 65 73  UE or FALSE (res
6f40: 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a 20 74  pectively),.** t
6f50: 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20 20 49  hen return 1.  I
6f60: 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64 65 74  f one cannot det
6f70: 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75 74 68  ermine the truth
6f80: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
6f90: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 63   expression at c
6fa0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65 74 75  ompile-time retu
6fb0: 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rn 0..**.** This
6fc0: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
6fd0: 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20 74  ion.  If is OK t
6fe0: 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72 65 20  o return 0 here 
6ff0: 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 65  even if.** the e
7000: 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79  xpression really
7010: 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65   is always false
7020: 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66 61 6c   or false (a fal
7030: 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a 2a 2a  se negative)..**
7040: 20 42 75 74 20 69 74 20 69 73 20 61 20 62 75 67   But it is a bug
7050: 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69 66 20   to return 1 if 
7060: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  the expression m
7070: 69 67 68 74 20 68 61 76 65 20 64 69 66 66 65 72  ight have differ
7080: 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76  ent.** boolean v
7090: 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65 72 65  alues in differe
70a0: 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  nt circumstances
70b0: 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69   (a false positi
70c0: 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ve.).**.** Note 
70d0: 74 68 61 74 20 69 66 20 74 68 65 20 65 78 70 72  that if the expr
70e0: 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  ession is part o
70f0: 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f  f conditional fo
7100: 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e  r a.** LEFT JOIN
7110: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74  , then we cannot
7120: 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20 63 6f   determine at co
7130: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
7140: 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20  er or not.** is 
7150: 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65  it true or false
7160: 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75  , so always retu
7170: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
7180: 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73 54 72  int exprAlwaysTr
7190: 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ue(Expr *p){.  i
71a0: 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20  nt v = 0;.  if( 
71b0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
71c0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  p, EP_FromJoin) 
71d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
71e0: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
71f0: 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29  Integer(p, &v) )
7200: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
7210: 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74 61 74  urn v!=0;.}.stat
7220: 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79  ic int exprAlway
7230: 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70 29 7b  sFalse(Expr *p){
7240: 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  .  int v = 0;.  
7250: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
7260: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
7270: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
7280: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
7290: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26  prIsInteger(p, &
72a0: 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  v) ) return 0;. 
72b0: 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a   return v==0;.}.
72c0: 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20  ./*.** Join two 
72d0: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e  expressions usin
72e0: 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  g an AND operato
72f0: 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78  r.  If either ex
7300: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e  pression is.** N
7310: 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  ULL, then just r
7320: 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20  eturn the other 
7330: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
7340: 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f 72  * If one side or
7350: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
7360: 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74  e AND is known t
7370: 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65 6e  o be false, then
7380: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72   instead.** of r
7390: 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20  eturning an AND 
73a0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74  expression, just
73b0: 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74 61   return a consta
73c0: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  nt expression wi
73d0: 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66  th.** a value of
73e0: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20   false..*/.Expr 
73f0: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28  *sqlite3ExprAnd(
7400: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
7410: 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a  r *pLeft, Expr *
7420: 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  pRight){.  if( p
7430: 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Left==0 ){.    r
7440: 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20  eturn pRight;.  
7450: 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74  }else if( pRight
7460: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
7470: 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65  n pLeft;.  }else
7480: 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
7490: 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 65  alse(pLeft) || e
74a0: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
74b0: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71  Right) ){.    sq
74c0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
74d0: 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  db, pLeft);.    
74e0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
74f0: 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  e(db, pRight);. 
7500: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
7510: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7520: 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69  K_INTEGER, &sqli
7530: 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c  te3IntTokens[0],
7540: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
7550: 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
7560: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
7570: 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30  db, TK_AND, 0, 0
7580: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
7590: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
75a0: 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74  (db, pNew, pLeft
75b0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72  , pRight);.    r
75c0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a  eturn pNew;.  }.
75d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
75e0: 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  ct a new express
75f0: 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66  ion node for a f
7600: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c  unction with mul
7610: 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  tiple.** argumen
7620: 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ts..*/.Expr *sql
7630: 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e  ite3ExprFunction
7640: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7650: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
7660: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
7670: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
7680: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7690: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
76a0: 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20  ert( pToken );. 
76b0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
76c0: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
76d0: 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e  FUNCTION, pToken
76e0: 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  , 1);.  if( pNew
76f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
7700: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
7710: 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20  (db, pList); /* 
7720: 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61  Avoid memory lea
7730: 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61  k when malloc fa
7740: 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ils */.    retur
7750: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  n 0;.  }.  pNew-
7760: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
7770: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
7780: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
7790: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
77a0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
77b0: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
77c0: 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  gs(pParse, pNew)
77d0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
77e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
77f0: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
7800: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
7810: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
7820: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
7830: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
7840: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
7850: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7860: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
7870: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
7880: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
7890: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
78a0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
78b0: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
78c0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
78d0: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
78e0: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
78f0: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
7900: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
7910: 74 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f 69 64  too big to avoid
7920: 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72   a denial of ser
7930: 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e  vice attack when
7940: 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74  .** the SQL stat
7950: 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d  ement comes from
7960: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75   an external sou
7970: 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  rce..**.** Wildc
7980: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
7990: 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c   ":aaa", "@aaa",
79a0: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
79b0: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
79c0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
79d0: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
79e0: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
79f0: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
7a00: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
7a10: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
7a20: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
7a30: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7a40: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
7a50: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
7a60: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
7a70: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
7a80: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
7a90: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
7aa0: 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73 71 6c  r, u32 n){.  sql
7ab0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7ac0: 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  e->db;.  const c
7ad0: 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61 72 20  har *z;.  ynVar 
7ae0: 78 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  x;..  if( pExpr=
7af0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
7b00: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
7b10: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
7b20: 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65  P_IntValue|EP_Re
7b30: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
7b40: 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78  ly) );.  z = pEx
7b50: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
7b60: 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
7b70: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d    assert( z[0]!=
7b80: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
7b90: 3d 3d 28 75 33 32 29 73 71 6c 69 74 65 33 53 74  ==(u32)sqlite3St
7ba0: 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20 20 69  rlen30(z) );.  i
7bb0: 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20  f( z[1]==0 ){.  
7bc0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66    /* Wildcard of
7bd0: 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20   the form "?".  
7be0: 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20  Assign the next 
7bf0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7c00: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  */.    assert( z
7c10: 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20  [0]=='?' );.    
7c20: 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  x = (ynVar)(++pP
7c30: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d  arse->nVar);.  }
7c40: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 64 6f  else{.    int do
7c50: 41 64 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Add = 0;.    if(
7c60: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20   z[0]=='?' ){.  
7c70: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
7c80: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
7c90: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
7ca0: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
7cb0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73   and.      ** us
7cc0: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
7cd0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
7ce0: 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20       i64 i;.    
7cf0: 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20 20 20    int bOk;.     
7d00: 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f 2a 4f   if( n==2 ){ /*O
7d10: 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54  PTIMIZATION-IF-T
7d20: 52 55 45 2a 2f 0a 20 20 20 20 20 20 20 20 69 20  RUE*/.        i 
7d30: 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f 2a 20  = z[1]-'0';  /* 
7d40: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
7d50: 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73 69 6e 67  of ?N for a sing
7d60: 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a 20 20  le digit N */.  
7d70: 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20        bOk = 1;. 
7d80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7d90: 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c      bOk = 0==sql
7da0: 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d  ite3Atoi64(&z[1]
7db0: 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54  , &i, n-1, SQLIT
7dc0: 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d  E_UTF8);.      }
7dd0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7de0: 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74   i==0 );.      t
7df0: 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b  estcase( i==1 );
7e00: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7e10: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
7e20: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
7e30: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29  ABLE_NUMBER]-1 )
7e40: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7e50: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
7e60: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
7e70: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b  IABLE_NUMBER] );
7e80: 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d  .      if( bOk==
7e90: 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62  0 || i<1 || i>db
7ea0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
7eb0: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
7ec0: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20  UMBER] ){.      
7ed0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7ee0: 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61  g(pParse, "varia
7ef0: 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  ble number must 
7f00: 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e  be between ?1 an
7f10: 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20  d ?%d",.        
7f20: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53      db->aLimit[S
7f30: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
7f40: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20  ABLE_NUMBER]);. 
7f50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
7f60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 78 20 3d       }.      x =
7f70: 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20   (ynVar)i;.     
7f80: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
7f90: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Var ){.        p
7fa0: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69  Parse->nVar = (i
7fb0: 6e 74 29 78 3b 0a 20 20 20 20 20 20 20 20 64 6f  nt)x;.        do
7fc0: 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Add = 1;.      }
7fd0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
7fe0: 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70  VListNumToName(p
7ff0: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 78  Parse->pVList, x
8000: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8010: 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20  doAdd = 1;.     
8020: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8030: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73      /* Wildcards
8040: 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24   like ":aaa", "$
8050: 61 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20  aaa" or "@aaa". 
8060: 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   Reuse the same 
8070: 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
8080: 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  * number as the 
8090: 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65  prior appearance
80a0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
80b0: 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  e, or if the nam
80c0: 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e  e.      ** has n
80d0: 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65  ever appeared be
80e0: 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20  fore, reuse the 
80f0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75  same variable nu
8100: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mber.      */.  
8110: 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 73      x = (ynVar)s
8120: 71 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d 65 54  qlite3VListNameT
8130: 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70 56 4c  oNum(pParse->pVL
8140: 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  ist, z, n);.    
8150: 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20    if( x==0 ){.  
8160: 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72        x = (ynVar
8170: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
8180: 29 3b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64  );.        doAdd
8190: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
81a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 41 64    }.    if( doAd
81b0: 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  d ){.      pPars
81c0: 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71 6c 69  e->pVList = sqli
81d0: 74 65 33 56 4c 69 73 74 41 64 64 28 64 62 2c 20  te3VListAdd(db, 
81e0: 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20  pParse->pVList, 
81f0: 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20 7d 0a  z, n, x);.    }.
8200: 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69 43 6f    }.  pExpr->iCo
8210: 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66 28 20  lumn = x;.  if( 
8220: 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  x>db->aLimit[SQL
8230: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
8240: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
8250: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8260: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8270: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
8280: 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  s");.  }.}../*.*
8290: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
82a0: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
82b0: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  on tree..*/.stat
82c0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
82d0: 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  NE void sqlite3E
82e0: 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69  xprDeleteNN(sqli
82f0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
8300: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
8310: 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  0 );.  /* Sanity
8320: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
8330: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
8340: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
8350: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
8360: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
8370: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8380: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
8390: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
83a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
83b0: 45 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48  EBUG.  if( ExprH
83c0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
83d0: 5f 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48  _Leaf) && !ExprH
83e0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
83f0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
8400: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
8410: 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  eft==0 );.    as
8420: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
8430: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
8440: 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d  ( p->x.pSelect==
8450: 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  0 );.  }.#endif.
8460: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
8470: 6f 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f  operty(p, (EP_To
8480: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
8490: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
84a0: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
84b0: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
84c0: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
84d0: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
84e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70    assert( p->x.p
84f0: 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  List==0 || p->pR
8500: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ight==0 );.    i
8510: 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70  f( p->pLeft && p
8520: 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op!=TK_SELECT_
8530: 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33  COLUMN ) sqlite3
8540: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8550: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20   p->pLeft);.    
8560: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8570: 65 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29  e(db, p->pRight)
8580: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
8590: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
85a0: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
85b0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
85c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
85d0: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d  .pSelect);.    }
85e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
85f0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
8600: 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  e(db, p->x.pList
8610: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
8620: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8630: 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65  ty(p, EP_MemToke
8640: 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  n) ) sqlite3DbFr
8650: 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  ee(db, p->u.zTok
8660: 65 6e 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72  en);.  if( !Expr
8670: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8680: 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20  P_Static) ){.   
8690: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
86a0: 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76  (db, p);.  }.}.v
86b0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44  oid sqlite3ExprD
86c0: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
86d0: 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  b, Expr *p){.  i
86e0: 66 28 20 70 20 29 20 73 71 6c 69 74 65 33 45 78  f( p ) sqlite3Ex
86f0: 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70  prDeleteNN(db, p
8700: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
8710: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
8720: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
8730: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
8740: 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a  ion structure .*
8750: 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  * passed as the 
8760: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
8770: 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f  This is always o
8780: 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53  ne of EXPR_FULLS
8790: 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44  IZE,.** EXPR_RED
87a0: 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52  UCEDSIZE or EXPR
87b0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a  _TOKENONLYSIZE..
87c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
87d0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
87e0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70  r *p){.  if( Exp
87f0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
8800: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20  EP_TokenOnly) ) 
8810: 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45  return EXPR_TOKE
8820: 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28  NONLYSIZE;.  if(
8830: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8840: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20  (p, EP_Reduced) 
8850: 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45  ) return EXPR_RE
8860: 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74  DUCEDSIZE;.  ret
8870: 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  urn EXPR_FULLSIZ
8880: 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E;.}../*.** The 
8890: 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29  dupedExpr*Size()
88a0: 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72   routines each r
88b0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
88c0: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
88d0: 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61  ed.** to store a
88e0: 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72   copy of an expr
88f0: 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73  ession or expres
8900: 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79  sion tree.  They
8910: 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f   differ in.** ho
8920: 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72  w much of the tr
8930: 65 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a  ee is measured..
8940: 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  **.**     dupedE
8950: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
8960: 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79      Size of only
8970: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
8980: 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65  ure .**     dupe
8990: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20  dExprNodeSize() 
89a0: 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78        Size of Ex
89b0: 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74  pr + space for t
89c0: 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65  oken.**     dupe
89d0: 64 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20  dExprSize()     
89e0: 20 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b        Expr + tok
89f0: 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d  en + subtree com
8a00: 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a  ponents.**.*****
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 2a 2a  ****************
8a50: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
8a60: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8a70: 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  Size() function 
8a80: 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75  returns two valu
8a90: 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65  es OR-ed togethe
8aa0: 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20  r:  .** (1) the 
8ab0: 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66  space required f
8ac0: 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  or a copy of the
8ad0: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
8ae0: 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29  only and .** (2)
8af0: 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67   the EP_xxx flag
8b00: 73 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20  s that indicate 
8b10: 77 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75  what the structu
8b20: 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62  re size should b
8b30: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  e..** The return
8b40: 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79   values is alway
8b50: 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20  s one of:.**.** 
8b60: 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49       EXPR_FULLSI
8b70: 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ZE.**      EXPR_
8b80: 52 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20  REDUCEDSIZE   | 
8b90: 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20  EP_Reduced.**   
8ba0: 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c     EXPR_TOKENONL
8bb0: 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e  YSIZE | EP_Token
8bc0: 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  Only.**.** The s
8bd0: 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63  ize of the struc
8be0: 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e  ture can be foun
8bf0: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
8c00: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
8c10: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
8c20: 20 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68   with 0xfff.  Th
8c30: 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66  e flags can be f
8c40: 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20  ound by masking 
8c50: 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  the.** return va
8c60: 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75  lue with EP_Redu
8c70: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
8c80: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
8c90: 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58  t with flags==EX
8ca0: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68  PRDUP_REDUCE, th
8cb0: 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b  is routines work
8cc0: 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a  s on full-size.*
8cd0: 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78  * (unreduced) Ex
8ce0: 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68  pr objects as th
8cf0: 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79  ey or originally
8d00: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
8d10: 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44  the parser..** D
8d20: 75 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  uring expression
8d30: 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61   analysis, extra
8d40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
8d50: 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76  computed and mov
8d60: 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72  ed into.** later
8d70: 20 70 61 72 74 73 20 6f 66 20 74 65 68 20 45 78   parts of teh Ex
8d80: 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  pr object and th
8d90: 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  at extra informa
8da0: 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63  tion might get c
8db0: 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66  hopped.** off if
8dc0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8dd0: 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74  is reduced.  Not
8de0: 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64  e also that it d
8df0: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a  oes not work to.
8e00: 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44  ** make an EXPRD
8e10: 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f  UP_REDUCE copy o
8e20: 66 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72  f a reduced expr
8e30: 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f  ession.  It is o
8e40: 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20  nly legal.** to 
8e50: 72 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e  reduce a pristin
8e60: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  e expression tre
8e70: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65  e from the parse
8e80: 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  r.  The implemen
8e90: 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70  tation.** of dup
8ea0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
8eb0: 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69  () contain multi
8ec0: 70 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61  ple assert() sta
8ed0: 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74  tements that att
8ee0: 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72  empt.** to enfor
8ef0: 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ce this constrai
8f00: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
8f10: 74 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  t dupedExprStruc
8f20: 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69  tSize(Expr *p, i
8f30: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
8f40: 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74   nSize;.  assert
8f50: 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  ( flags==EXPRDUP
8f60: 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73  _REDUCE || flags
8f70: 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f  ==0 ); /* Only o
8f80: 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c  ne flag value al
8f90: 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  lowed */.  asser
8fa0: 74 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  t( EXPR_FULLSIZE
8fb0: 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73  <=0xfff );.  ass
8fc0: 65 72 74 28 20 28 30 78 66 66 66 20 26 20 28 45  ert( (0xfff & (E
8fd0: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
8fe0: 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20  enOnly))==0 );. 
8ff0: 20 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c 7c   if( 0==flags ||
9000: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43   p->op==TK_SELEC
9010: 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  T_COLUMN ){.    
9020: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c  nSize = EXPR_FUL
9030: 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LSIZE;.  }else{.
9040: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9050: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9060: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
9070: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
9080: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9090: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
90a0: 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20  romJoin) ); .   
90b0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
90c0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
90d0: 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20  MemToken) );.   
90e0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
90f0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9100: 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20  NoReduce) );.   
9110: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c   if( p->pLeft ||
9120: 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20   p->x.pList ){. 
9130: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
9140: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20  R_REDUCEDSIZE | 
9150: 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20  EP_Reduced;.    
9160: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
9170: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
9180: 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65  0 );.      nSize
9190: 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c   = EXPR_TOKENONL
91a0: 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e  YSIZE | EP_Token
91b0: 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Only;.    }.  }.
91c0: 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a    return nSize;.
91d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
91e0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
91f0: 68 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65  he space in byte
9200: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  s required to st
9210: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a  ore the copy .**
9220: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
9230: 75 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70  ucture and a cop
9240: 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e  y of the Expr.u.
9250: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
9260: 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67  f that.** string
9270: 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f   is defined.).*/
9280: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
9290: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78  dExprNodeSize(Ex
92a0: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
92b0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
92c0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
92d0: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26  Size(p, flags) &
92e0: 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45   0xfff;.  if( !E
92f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9300: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
9310: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
9320: 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71  .    nByte += sq
9330: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
9340: 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20  >u.zToken)+1;.  
9350: 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  }.  return ROUND
9360: 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  8(nByte);.}../*.
9370: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
9380: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
9390: 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65  quired to create
93a0: 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
93b0: 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  the .** expressi
93c0: 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65  on passed as the
93d0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
93e0: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
93f0: 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73  ment is a.** mas
9400: 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50  k containing EXP
9410: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
9420: 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
9430: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
9440: 73 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74  s space to creat
9450: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
9460: 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69  Expr struct.** i
9470: 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75  tself and the bu
9480: 66 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f  ffer referred to
9490: 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65   by Expr.u.zToke
94a0: 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a  n, if any..**.**
94b0: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
94c0: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
94d0: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  et, then the ret
94e0: 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64  urn value includ
94f0: 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20  es .** space to 
9500: 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78  duplicate all Ex
9510: 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20  pr nodes in the 
9520: 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45  tree formed by E
9530: 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e  xpr.pLeft .** an
9540: 64 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61  d Expr.pRight va
9550: 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74  riables (but not
9560: 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75   for any structu
9570: 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f  res pointed to o
9580: 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20  r .** descended 
9590: 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e  from the Expr.x.
95a0: 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e  pList or Expr.x.
95b0: 70 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65  pSelect variable
95c0: 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s)..*/.static in
95d0: 74 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  t dupedExprSize(
95e0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
95f0: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
9600: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b   = 0;.  if( p ){
9610: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70  .    nByte = dup
9620: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70  edExprNodeSize(p
9630: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
9640: 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f  ( flags&EXPRDUP_
9650: 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20  REDUCE ){.      
9660: 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78  nByte += dupedEx
9670: 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c  prSize(p->pLeft,
9680: 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45   flags) + dupedE
9690: 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68  xprSize(p->pRigh
96a0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  t, flags);.    }
96b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42  .  }.  return nB
96c0: 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  yte;.}../*.** Th
96d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
96e0: 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
96f0: 33 45 78 70 72 44 75 70 28 29 2c 20 65 78 63 65  3ExprDup(), exce
9700: 70 74 20 74 68 61 74 20 69 66 20 70 7a 42 75 66  pt that if pzBuf
9710: 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e  fer .** is not N
9720: 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66  ULL then *pzBuff
9730: 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
9740: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
9750: 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  er large enough 
9760: 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65  .** to store the
9770: 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
9780: 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65  ion p, the copie
9790: 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  s of p->u.zToken
97a0: 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62  .** (if applicab
97b0: 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70  le), and the cop
97c0: 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c  ies of the p->pL
97d0: 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68  eft and p->pRigh
97e0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  t expressions,.*
97f0: 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65  * if any. Before
9800: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42   returning, *pzB
9810: 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20  uffer is set to 
9820: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
9830: 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69  ast the.** porti
9840: 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  on of the buffer
9850: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20   copied into by 
9860: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
9870: 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 65  /.static Expr *e
9880: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
9890: 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  db, Expr *p, int
98a0: 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a   dupFlags, u8 **
98b0: 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70  pzBuffer){.  Exp
98c0: 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  r *pNew;        
98d0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
98e0: 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a  eturn */.  u8 *z
98f0: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
9900: 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65   /* Memory space
9910: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 62   from which to b
9920: 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63 74  uild Expr object
9930: 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69 63   */.  u32 static
9940: 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 45  Flag;       /* E
9950: 50 5f 53 74 61 74 69 63 20 69 66 20 73 70 61 63  P_Static if spac
9960: 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 66  e not obtained f
9970: 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20  rom malloc */.. 
9980: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
9990: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b  ;.  assert( p );
99a0: 0a 20 20 61 73 73 65 72 74 28 20 64 75 70 46 6c  .  assert( dupFl
99b0: 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61  ags==0 || dupFla
99c0: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
99d0: 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CE );.  assert( 
99e0: 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64  pzBuffer==0 || d
99f0: 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  upFlags==EXPRDUP
9a00: 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a  _REDUCE );..  /*
9a10: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   Figure out wher
9a20: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e  e to write the n
9a30: 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72  ew Expr structur
9a40: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75  e. */.  if( pzBu
9a50: 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c  ffer ){.    zAll
9a60: 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a  oc = *pzBuffer;.
9a70: 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d      staticFlag =
9a80: 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65   EP_Static;.  }e
9a90: 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20  lse{.    zAlloc 
9aa0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
9ab0: 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65 64  cRawNN(db, duped
9ac0: 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70 46  ExprSize(p, dupF
9ad0: 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61 74  lags));.    stat
9ae0: 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a  icFlag = 0;.  }.
9af0: 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20 2a    pNew = (Expr *
9b00: 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20  )zAlloc;..  if( 
9b10: 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53  pNew ){.    /* S
9b20: 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74  et nNewSize to t
9b30: 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65  he size allocate
9b40: 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74  d for the struct
9b50: 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20  ure pointed to. 
9b60: 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54     ** by pNew. T
9b70: 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58  his is either EX
9b80: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50  PR_FULLSIZE, EXP
9b90: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
9ba0: 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b  .    ** EXPR_TOK
9bb0: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b  ENONLYSIZE. nTok
9bc0: 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  en is set to the
9bd0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9be0: 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a   consumed.    **
9bf0: 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20   by the copy of 
9c00: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
9c10: 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e  string (if any).
9c20: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  .    */.    cons
9c30: 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75  t unsigned nStru
9c40: 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78  ctSize = dupedEx
9c50: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20  prStructSize(p, 
9c60: 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 63  dupFlags);.    c
9c70: 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a  onst int nNewSiz
9c80: 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20  e = nStructSize 
9c90: 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e 74  & 0xfff;.    int
9ca0: 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28   nToken;.    if(
9cb0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
9cc0: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
9cd0: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
9ce0: 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e   ){.      nToken
9cf0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
9d00: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
9d10: 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  + 1;.    }else{.
9d20: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30        nToken = 0
9d30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9d40: 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  dupFlags ){.    
9d50: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
9d60: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9d70: 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20  Reduced)==0 );. 
9d80: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c       memcpy(zAll
9d90: 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29  oc, p, nNewSize)
9da0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9db0: 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20 28     u32 nSize = (
9dc0: 75 33 32 29 65 78 70 72 53 74 72 75 63 74 53 69  u32)exprStructSi
9dd0: 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ze(p);.      mem
9de0: 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e  cpy(zAlloc, p, n
9df0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
9e00: 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c   nSize<EXPR_FULL
9e10: 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20  SIZE ){ .       
9e20: 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b   memset(&zAlloc[
9e30: 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f  nSize], 0, EXPR_
9e40: 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b  FULLSIZE-nSize);
9e50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9e60: 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45      /* Set the E
9e70: 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f  P_Reduced, EP_To
9e80: 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f  kenOnly, and EP_
9e90: 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70  Static flags app
9ea0: 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  ropriately. */. 
9eb0: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26     pNew->flags &
9ec0: 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45  = ~(EP_Reduced|E
9ed0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53  P_TokenOnly|EP_S
9ee0: 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65  tatic|EP_MemToke
9ef0: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c  n);.    pNew->fl
9f00: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
9f10: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
9f20: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
9f30: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
9f40: 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a  |= staticFlag;..
9f50: 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
9f60: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
9f70: 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ng, if any. */. 
9f80: 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b     if( nToken ){
9f90: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f  .      char *zTo
9fa0: 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54  ken = pNew->u.zT
9fb0: 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a  oken = (char*)&z
9fc0: 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b  Alloc[nNewSize];
9fd0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54  .      memcpy(zT
9fe0: 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  oken, p->u.zToke
9ff0: 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  n, nToken);.    
a000: 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 28  }..    if( 0==((
a010: 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66  p->flags|pNew->f
a020: 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f 6b 65  lags) & (EP_Toke
a030: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20  nOnly|EP_Leaf)) 
a040: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  ){.      /* Fill
a050: 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e   in the pNew->x.
a060: 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d  pSelect or pNew-
a070: 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e  >x.pList member.
a080: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78   */.      if( Ex
a090: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
a0a0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
a0b0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a0c0: 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  x.pSelect = sqli
a0d0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
a0e0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64   p->x.pSelect, d
a0f0: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
a100: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
a110: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73  New->x.pList = s
a120: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
a130: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  p(db, p->x.pList
a140: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
a150: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
a160: 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d  /* Fill in pNew-
a170: 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d  >pLeft and pNew-
a180: 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  >pRight. */.    
a190: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
a1a0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64  rty(pNew, EP_Red
a1b0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
a1c0: 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  y) ){.      zAll
a1d0: 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e  oc += dupedExprN
a1e0: 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  odeSize(p, dupFl
a1f0: 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
a200: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a210: 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f  (pNew, EP_TokenO
a220: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
a230: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
a240: 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f  eft = p->pLeft ?
a250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a260: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a270: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50  b, p->pLeft, EXP
a280: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
a290: 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20  lloc) : 0;.     
a2a0: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
a2b0: 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20  = p->pRight ?.  
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2d0: 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c       exprDup(db,
a2e0: 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52   p->pRight, EXPR
a2f0: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
a300: 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  loc) : 0;.      
a310: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 7a 42 75  }.      if( pzBu
a320: 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ffer ){.        
a330: 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c  *pzBuffer = zAll
a340: 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  oc;.      }.    
a350: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
a360: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
a370: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
a380: 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20  y|EP_Leaf) ){.  
a390: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
a3a0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op==TK_SELECT_CO
a3b0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
a3c0: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
a3d0: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
a3e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
a3f0: 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e  Column==0 || p->
a400: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
a410: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a420: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20  ->pRight==0  || 
a430: 70 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c  p->pRight==p->pL
a440: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  eft );.        }
a450: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a460: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71  pNew->pLeft = sq
a470: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a480: 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20   p->pLeft, 0);. 
a490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a4a0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
a4b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a4c0: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29  b, p->pRight, 0)
a4d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a4e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
a4f0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  w;.}../*.** Crea
a500: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
a510: 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65  deep copy of the
a520: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
a530: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
a540: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e   argument. If an
a550: 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69   OOM condition i
a560: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e  s encountered, N
a570: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ULL is returned.
a580: 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d  ** and the db->m
a590: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
a5a0: 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   set..*/.#ifndef
a5b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
a5c0: 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69  .static With *wi
a5d0: 74 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  thDup(sqlite3 *d
a5e0: 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57  b, With *p){.  W
a5f0: 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  ith *pRet = 0;. 
a600: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
a610: 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
a620: 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d  (*p) + sizeof(p-
a630: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74  >a[0]) * (p->nCt
a640: 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d  e-1);.    pRet =
a650: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
a660: 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
a670: 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b  .    if( pRet ){
a680: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
a690: 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d      pRet->nCte =
a6a0: 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20   p->nCte;.      
a6b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
a6c0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
a6d0: 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65    pRet->a[i].pSe
a6e0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
a6f0: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61  lectDup(db, p->a
a700: 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b  [i].pSelect, 0);
a710: 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61  .        pRet->a
a720: 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69  [i].pCols = sqli
a730: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
a740: 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73  b, p->a[i].pCols
a750: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
a760: 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  et->a[i].zName =
a770: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
a780: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  (db, p->a[i].zNa
a790: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
a7a0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a7b0: 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  pRet;.}.#else.# 
a7c0: 64 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78  define withDup(x
a7d0: 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,y) 0.#endif../*
a7e0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
a7f0: 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69  g group of routi
a800: 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f  nes make deep co
a810: 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69  pies of expressi
a820: 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69  ons,.** expressi
a830: 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73  on lists, ID lis
a840: 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73  ts, and select s
a850: 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20  tatements.  The 
a860: 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65  copies can.** be
a870: 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69   deleted (by bei
a880: 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ng passed to the
a890: 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e  ir respective ..
a8a0: 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e  .Delete() routin
a8b0: 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65  es).** without e
a8c0: 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69  ffecting the ori
a8d0: 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ginals..**.** Th
a8e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
a8f0: 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63  t, ID, and sourc
a900: 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62  e lists return b
a910: 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  y sqlite3ExprLis
a920: 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74  tDup(),.** sqlit
a930: 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61  e3IdListDup(), a
a940: 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  nd sqlite3SrcLis
a950: 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62  tDup() can not b
a960: 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64  e further expand
a970: 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71  ed .** by subseq
a980: 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
a990: 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28  lite*ListAppend(
a9a0: 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a  ) routines..**.*
a9b0: 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61  * Any tables tha
a9c0: 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69  t the SrcList mi
a9d0: 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65  ght point to are
a9e0: 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e   not duplicated.
a9f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
aa00: 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61   parameter conta
aa10: 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f  ins a combinatio
aa20: 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50  n of the EXPRDUP
aa30: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49  _XXX flags..** I
aa40: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
aa50: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
aa60: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63  , then the struc
aa70: 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73  ture returned is
aa80: 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20   a.** truncated 
aa90: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75  version of the u
aaa0: 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74  sual Expr struct
aab0: 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ure that will be
aac0: 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61   stored as.** pa
aad0: 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  rt of the in-mem
aae0: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
aaf0: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
ab00: 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78  se schema..*/.Ex
ab10: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44  pr *sqlite3ExprD
ab20: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
ab30: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
ab40: 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66  gs){.  assert( f
ab50: 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
ab60: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
ab70: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f   );.  return p ?
ab80: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20   exprDup(db, p, 
ab90: 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d  flags, 0) : 0;.}
aba0: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
abb0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71  e3ExprListDup(sq
abc0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
abd0: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
abe0: 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  s){.  ExprList *
abf0: 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45  pNew;.  struct E
ac00: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
ac10: 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a  tem, *pOldItem;.
ac20: 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20    int i;.  Expr 
ac30: 2a 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c  *pPriorSelectCol
ac40: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
ac50: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
ac60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
ac70: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
ac80: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
ac90: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
aca0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 2b 73 69  sizeof(*pNew)+si
acb0: 7a 65 6f 66 28 70 4e 65 77 2d 3e 61 5b 30 5d 29  zeof(pNew->a[0])
acc0: 2a 28 70 2d 3e 6e 45 78 70 72 2d 31 29 20 29 3b  *(p->nExpr-1) );
acd0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
ace0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
acf0: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4e 65 77  w->nAlloc = pNew
ad00: 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78  ->nExpr = p->nEx
ad10: 70 72 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e  pr;.  pItem = pN
ad20: 65 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65  ew->a;.  pOldIte
ad30: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
ad40: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
ad50: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
ad60: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
ad70: 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d  Expr *pOldExpr =
ad80: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
ad90: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  ;.    Expr *pNew
ada0: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
adb0: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
adc0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
add0: 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Expr, flags);.  
ade0: 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 20 0a    if( pOldExpr .
adf0: 20 20 20 20 20 26 26 20 70 4f 6c 64 45 78 70 72       && pOldExpr
ae00: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
ae10: 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 28  COLUMN.     && (
ae20: 70 4e 65 77 45 78 70 72 20 3d 20 70 49 74 65 6d  pNewExpr = pItem
ae30: 2d 3e 70 45 78 70 72 29 21 3d 30 20 0a 20 20 20  ->pExpr)!=0 .   
ae40: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
ae50: 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c  ( pNewExpr->iCol
ae60: 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b  umn==0 || i>0 );
ae70: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 45  .      if( pNewE
ae80: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20  xpr->iColumn==0 
ae90: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
aea0: 74 28 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65  t( pOldExpr->pLe
aeb0: 66 74 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52  ft==pOldExpr->pR
aec0: 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 20 20  ight );.        
aed0: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20  pPriorSelectCol 
aee0: 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66  = pNewExpr->pLef
aef0: 74 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 52  t = pNewExpr->pR
af00: 69 67 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ight;.      }els
af10: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
af20: 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  t( i>0 );.      
af30: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 5b    assert( pItem[
af40: 2d 31 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a  -1].pExpr!=0 );.
af50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
af60: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
af70: 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78  n==pItem[-1].pEx
af80: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b  pr->iColumn+1 );
af90: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
afa0: 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c   pPriorSelectCol
afb0: 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70  ==pItem[-1].pExp
afc0: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  r->pLeft );.    
afd0: 20 20 20 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c      pNewExpr->pL
afe0: 65 66 74 20 3d 20 70 50 72 69 6f 72 53 65 6c 65  eft = pPriorSele
aff0: 63 74 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  ctCol;.      }. 
b000: 20 20 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e     }.    pItem->
b010: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
b020: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
b030: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
b040: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
b050: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
b060: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
b070: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
b080: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  ->sortOrder = pO
b090: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  ldItem->sortOrde
b0a0: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  r;.    pItem->do
b0b0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ne = 0;.    pIte
b0c0: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  m->bSpanIsTab = 
b0d0: 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49  pOldItem->bSpanI
b0e0: 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d  sTab;.    pItem-
b0f0: 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75  >u = pOldItem->u
b100: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
b110: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  New;.}../*.** If
b120: 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65   cursors, trigge
b130: 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75  rs, views and su
b140: 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c  bqueries are all
b150: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a   omitted from.**
b160: 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e   the build, then
b170: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   none of the fol
b180: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c  lowing routines,
b190: 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20   except for .** 
b1a0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
b1b0: 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  (), can be calle
b1c0: 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  d. sqlite3Select
b1d0: 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d  Dup() is sometim
b1e0: 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74  es.** called wit
b1f0: 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  h a NULL argumen
b200: 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  t..*/.#if !defin
b210: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
b220: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
b230: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
b240: 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66  GGER) \. || !def
b250: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b260: 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69  _SUBQUERY).SrcLi
b270: 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
b280: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
b290: 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69  b, SrcList *p, i
b2a0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63  nt flags){.  Src
b2b0: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
b2c0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  t i;.  int nByte
b2d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
b2e0: 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
b2f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42  ) return 0;.  nB
b300: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
b310: 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20   + (p->nSrc>0 ? 
b320: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
b330: 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20  * (p->nSrc-1) : 
b340: 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  0);.  pNew = sql
b350: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
b360: 4e 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  N(db, nByte );. 
b370: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
b380: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
b390: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
b3a0: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
b3b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
b3c0: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
b3d0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
b3e0: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
b3f0: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
b400: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
b410: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
b420: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54   &p->a[i];.    T
b430: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
b440: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pNewItem->pSchem
b450: 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  a = pOldItem->pS
b460: 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49  chema;.    pNewI
b470: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
b480: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
b490: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
b4a0: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
b4b0: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
b4c0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
b4d0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
b4e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
b4f0: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
b500: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
b510: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69  , pOldItem->zAli
b520: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  as);.    pNewIte
b530: 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d  m->fg = pOldItem
b540: 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77 49 74  ->fg;.    pNewIt
b550: 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f  em->iCursor = pO
b560: 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ldItem->iCursor;
b570: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61  .    pNewItem->a
b580: 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c  ddrFillSub = pOl
b590: 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  dItem->addrFillS
b5a0: 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ub;.    pNewItem
b5b0: 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f  ->regReturn = pO
b5c0: 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72  ldItem->regRetur
b5d0: 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49  n;.    if( pNewI
b5e0: 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
b5f0: 64 42 79 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  dBy ){.      pNe
b600: 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  wItem->u1.zIndex
b610: 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 44 62  edBy = sqlite3Db
b620: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
b630: 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
b640: 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  By);.    }.    p
b650: 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65  NewItem->pIBInde
b660: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49  x = pOldItem->pI
b670: 42 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  BIndex;.    if( 
b680: 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54  pNewItem->fg.isT
b690: 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  abFunc ){.      
b6a0: 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75  pNewItem->u1.pFu
b6b0: 6e 63 41 72 67 20 3d 20 0a 20 20 20 20 20 20 20  ncArg = .       
b6c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
b6d0: 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  stDup(db, pOldIt
b6e0: 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c  em->u1.pFuncArg,
b6f0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20   flags);.    }. 
b700: 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74     pTab = pNewIt
b710: 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49  em->pTab = pOldI
b720: 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
b730: 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20  f( pTab ){.     
b740: 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b   pTab->nTabRef++
b750: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
b760: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Item->pSelect = 
b770: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
b780: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
b790: 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a  Select, flags);.
b7a0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f      pNewItem->pO
b7b0: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
b7c0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b7d0: 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20  >pOn, flags);.  
b7e0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69    pNewItem->pUsi
b7f0: 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69  ng = sqlite3IdLi
b800: 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  stDup(db, pOldIt
b810: 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20  em->pUsing);.   
b820: 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73   pNewItem->colUs
b830: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63  ed = pOldItem->c
b840: 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65  olUsed;.  }.  re
b850: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c  turn pNew;.}.IdL
b860: 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
b870: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
b880: 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  b, IdList *p){. 
b890: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
b8a0: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
b8b0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
b8c0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
b8d0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
b8e0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
b8f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
b900: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
b910: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b920: 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e   pNew->nId = p->
b930: 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  nId;.  pNew->a =
b940: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b950: 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64  RawNN(db, p->nId
b960: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
b970: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
b980: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
b990: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
b9a0: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
b9b0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f  n 0;.  }.  /* No
b9c0: 74 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  te that because 
b9d0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
b9e0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70  allocation for p
b9f0: 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a  ->a[] is not.  *
ba00: 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20  * necessarily a 
ba10: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71  power of two, sq
ba20: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
ba30: 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63  d() may not be c
ba40: 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  alled.  ** on th
ba50: 65 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61  e duplicate crea
ba60: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
ba70: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  tion. */.  for(i
ba80: 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b  =0; i<p->nId; i+
ba90: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49  +){.    struct I
baa0: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  dList_item *pNew
bab0: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
bac0: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  i];.    struct I
bad0: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  dList_item *pOld
bae0: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
baf0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
bb00: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
bb10: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
bb20: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
bb30: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d   pNewItem->idx =
bb40: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a   pOldItem->idx;.
bb50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
bb60: 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c  w;.}.Select *sql
bb70: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
bb80: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
bb90: 74 20 2a 70 44 75 70 2c 20 69 6e 74 20 66 6c 61  t *pDup, int fla
bba0: 67 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  gs){.  Select *p
bbb0: 52 65 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63  Ret = 0;.  Selec
bbc0: 74 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  t *pNext = 0;.  
bbd0: 53 65 6c 65 63 74 20 2a 2a 70 70 20 3d 20 26 70  Select **pp = &p
bbe0: 52 65 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  Ret;.  Select *p
bbf0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
bc00: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44  =0 );.  for(p=pD
bc10: 75 70 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69  up; p; p=p->pPri
bc20: 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  or){.    Select 
bc30: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44  *pNew = sqlite3D
bc40: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
bc50: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
bc60: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
bc70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77   break;.    pNew
bc80: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
bc90: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
bca0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61  , p->pEList, fla
bcb0: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
bcc0: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
bcd0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
bce0: 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Src, flags);.   
bcf0: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
bd00: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
bd10: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c  b, p->pWhere, fl
bd20: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
bd30: 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
bd40: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
bd50: 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66  , p->pGroupBy, f
bd60: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d  lags);.    pNew-
bd70: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
bd80: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
bd90: 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29  >pHaving, flags)
bda0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64  ;.    pNew->pOrd
bdb0: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
bdc0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
bdd0: 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73  >pOrderBy, flags
bde0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  );.    pNew->op 
bdf0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65  = p->op;.    pNe
be00: 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78 74  w->pNext = pNext
be10: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69  ;.    pNew->pPri
be20: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  or = 0;.    pNew
be30: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
be40: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
be50: 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b  >pLimit, flags);
be60: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  .    pNew->pOffs
be70: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
be80: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  Dup(db, p->pOffs
be90: 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  et, flags);.    
bea0: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
beb0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66  ;.    pNew->iOff
bec0: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  set = 0;.    pNe
bed0: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  w->selFlags = p-
bee0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f  >selFlags & ~SF_
bef0: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
bf00: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65     pNew->addrOpe
bf10: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
bf20: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65     pNew->addrOpe
bf30: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
bf40: 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74     pNew->nSelect
bf50: 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74  Row = p->nSelect
bf60: 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  Row;.    pNew->p
bf70: 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28 64  With = withDup(d
bf80: 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20  b, p->pWith);.  
bf90: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53    sqlite3SelectS
bfa0: 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e  etName(pNew, p->
bfb0: 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 2a  zSelName);.    *
bfc0: 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70  pp = pNew;.    p
bfd0: 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50 72 69 6f  p = &pNew->pPrio
bfe0: 72 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  r;.    pNext = p
bff0: 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  New;.  }..  retu
c000: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65  rn pRet;.}.#else
c010: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
c020: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
c030: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
c040: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
c050: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
c060: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
c070: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
c080: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
c090: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
c0a0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
c0b0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
c0c0: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
c0d0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
c0e0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
c0f0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  st..**.** If a m
c100: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
c110: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
c120: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
c130: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
c140: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
c150: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
c160: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
c170: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
c180: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
c190: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
c1a0: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
c1b0: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
c1c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
c1d0: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
c1e0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
c1f0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
c200: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
c210: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
c220: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
c230: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
c240: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
c250: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
c260: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
c270: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
c280: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
c290: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  LL */.){.  struc
c2a0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
c2b0: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
c2c0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c2d0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
c2e0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
c2f0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
c300: 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
c310: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
c320: 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29  zeof(ExprList) )
c330: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
c340: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
c350: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
c360: 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20     pList->nExpr 
c370: 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  = 0;.    pList->
c380: 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 65  nAlloc = 1;.  }e
c390: 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  lse if( pList->n
c3a0: 45 78 70 72 3d 3d 70 4c 69 73 74 2d 3e 6e 41 6c  Expr==pList->nAl
c3b0: 6c 6f 63 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  loc ){.    ExprL
c3c0: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70  ist *pNew;.    p
c3d0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
c3e0: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74  ealloc(db, pList
c3f0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
c400: 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 2b 28  sizeof(*pList)+(
c410: 32 2a 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20  2*pList->nAlloc 
c420: 2d 20 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73  - 1)*sizeof(pLis
c430: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
c440: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
c450: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
c460: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
c470: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69   = pNew;.    pLi
c480: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b  st->nAlloc *= 2;
c490: 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
c4a0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
c4b0: 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61 73 73 65  nExpr++];.  asse
c4c0: 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73 74 72  rt( offsetof(str
c4d0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
c4e0: 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65 6f 66  m,zName)==sizeof
c4f0: 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20 29  (pItem->pExpr) )
c500: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
c510: 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70 72  etof(struct Expr
c520: 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78 70 72 29  List_item,pExpr)
c530: 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ==0 );.  memset(
c540: 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c  &pItem->zName,0,
c550: 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 2d 6f  sizeof(*pItem)-o
c560: 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45  ffsetof(struct E
c570: 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61  xprList_item,zNa
c580: 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 70  me));.  pItem->p
c590: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
c5a0: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e  return pList;..n
c5b0: 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a  o_mem:     .  /*
c5c0: 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d   Avoid leaking m
c5d0: 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20  emory if malloc 
c5e0: 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20  has failed. */. 
c5f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
c600: 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
c610: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c620: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
c630: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
c640: 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73  ../*.** pColumns
c650: 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72 6d 20   and pExpr form 
c660: 61 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d  a vector assignm
c670: 65 6e 74 20 77 68 69 63 68 20 69 73 20 70 61 72  ent which is par
c680: 74 20 6f 66 20 74 68 65 20 53 45 54 0a 2a 2a 20  t of the SET.** 
c690: 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55 50 44  clause of an UPD
c6a0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ATE statement.  
c6b0: 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
c6c0: 20 20 20 20 20 20 20 20 28 61 2c 62 2c 63 29 20          (a,b,c) 
c6d0: 3d 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  = (expr1,expr2,e
c6e0: 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20 20 20  xpr3).** Or:    
c6f0: 28 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c 45 43  (a,b,c) = (SELEC
c700: 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e  T x,y,z FROM ...
c710: 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63  .).**.** For eac
c720: 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 76 65  h term of the ve
c730: 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 2c  ctor assignment,
c740: 20 61 70 70 65 6e 64 20 6e 65 77 20 65 6e 74 72   append new entr
c750: 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 78  ies to the.** ex
c760: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c  pression list pL
c770: 69 73 74 2e 20 20 49 6e 20 74 68 65 20 63 61 73  ist.  In the cas
c780: 65 20 6f 66 20 61 20 73 75 62 71 75 65 72 79 20  e of a subquery 
c790: 6f 6e 20 74 68 65 20 52 48 53 2c 20 61 70 70 65  on the RHS, appe
c7a0: 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f  nd.** TK_SELECT_
c7b0: 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f  COLUMN expressio
c7c0: 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  ns..*/.ExprList 
c7d0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
c7e0: 41 70 70 65 6e 64 56 65 63 74 6f 72 28 0a 20 20  AppendVector(.  
c7f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c800: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
c810: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
c820: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
c830: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
c840: 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64   which to append
c850: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
c860: 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f  */.  IdList *pCo
c870: 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c  lumns,      /* L
c880: 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20  ist of names of 
c890: 4c 48 53 20 6f 66 20 74 68 65 20 61 73 73 69 67  LHS of the assig
c8a0: 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20  nment */.  Expr 
c8b0: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
c8c0: 20 20 2f 2a 20 56 65 63 74 6f 72 20 65 78 70 72    /* Vector expr
c8d0: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70  ession to be app
c8e0: 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20  ended. Might be 
c8f0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  NULL */.){.  sql
c900: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
c910: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a  e->db;.  int n;.
c920: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
c930: 46 69 72 73 74 20 3d 20 70 4c 69 73 74 20 3f 20  First = pList ? 
c940: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
c950: 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20  ;.  /* pColumns 
c960: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c  can only be NULL
c970: 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 20 62   due to an OOM b
c980: 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63  ut an OOM will c
c990: 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65 78 69  ause an.  ** exi
c9a0: 74 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  t prior to this 
c9b0: 72 6f 75 74 69 6e 65 20 62 65 69 6e 67 20 69 6e  routine being in
c9c0: 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28 20 4e  voked */.  if( N
c9d0: 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30  EVER(pColumns==0
c9e0: 29 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f  ) ) goto vector_
c9f0: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20  append_error;.  
ca00: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 67  if( pExpr==0 ) g
ca10: 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e  oto vector_appen
ca20: 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49  d_error;..  /* I
ca30: 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20 76  f the RHS is a v
ca40: 65 63 74 6f 72 2c 20 74 68 65 6e 20 77 65 20 63  ector, then we c
ca50: 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 63  an immediately c
ca60: 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
ca70: 20 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20   .  ** the size 
ca80: 6f 66 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c  of the RHS and L
ca90: 48 53 20 6d 61 74 63 68 2e 20 20 42 75 74 20 69  HS match.  But i
caa0: 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20 53  f the RHS is a S
cab0: 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20 77 69 6c  ELECT, .  ** wil
cac0: 64 63 61 72 64 73 20 28 22 2a 22 29 20 69 6e 20  dcards ("*") in 
cad0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
cae0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 6d 75 73  f the SELECT mus
caf0: 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65  t be expanded be
cb00: 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 63 61 6e  fore.  ** we can
cb10: 20 64 6f 20 74 68 65 20 73 69 7a 65 20 63 68 65   do the size che
cb20: 63 6b 2c 20 73 6f 20 64 65 66 65 72 20 74 68 65  ck, so defer the
cb30: 20 73 69 7a 65 20 63 68 65 63 6b 20 75 6e 74 69   size check unti
cb40: 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
cb50: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45  n..  */.  if( pE
cb60: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45  xpr->op!=TK_SELE
cb70: 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e 73 2d 3e  CT && pColumns->
cb80: 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74 65 33 45  nId!=(n=sqlite3E
cb90: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45  xprVectorSize(pE
cba0: 78 70 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  xpr)) ){.    sql
cbb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
cbc0: 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73  rse, "%d columns
cbd0: 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61 6c   assigned %d val
cbe0: 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ues",.          
cbf0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d            pColum
cc00: 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20 20  ns->nId, n);.   
cc10: 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70   goto vector_app
cc20: 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a  end_error;.  }..
cc30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
cc40: 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b 29  lumns->nId; i++)
cc50: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 75 62  {.    Expr *pSub
cc60: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
cc70: 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64  prForVectorField
cc80: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
cc90: 69 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  i);.    pList = 
cca0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
ccb0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4c  ppend(pParse, pL
ccc0: 69 73 74 2c 20 70 53 75 62 45 78 70 72 29 3b 0a  ist, pSubExpr);.
ccd0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
cce0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ccf0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 69 46 69  List->nExpr==iFi
cd00: 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20 20 20 20  rst+i+1 );.     
cd10: 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d   pList->a[pList-
cd20: 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
cd30: 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d  = pColumns->a[i]
cd40: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43  .zName;.      pC
cd50: 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61  olumns->a[i].zNa
cd60: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  me = 0;.    }.  
cd70: 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  }..  if( !db->ma
cd80: 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 70 45  llocFailed && pE
cd90: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
cda0: 43 54 20 26 26 20 41 4c 57 41 59 53 28 70 4c 69  CT && ALWAYS(pLi
cdb0: 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 45 78  st!=0) ){.    Ex
cdc0: 70 72 20 2a 70 46 69 72 73 74 20 3d 20 70 4c 69  pr *pFirst = pLi
cdd0: 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45  st->a[iFirst].pE
cde0: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
cdf0: 20 70 46 69 72 73 74 21 3d 30 20 29 3b 0a 20 20   pFirst!=0 );.  
ce00: 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73 74    assert( pFirst
ce10: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
ce20: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 0a  COLUMN );.     .
ce30: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
ce40: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ce50: 74 20 69 6e 20 70 52 69 67 68 74 20 73 6f 20 69  t in pRight so i
ce60: 74 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  t will be delete
ce70: 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 73 71  d when.    ** sq
ce80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
ce90: 65 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ete() is called 
cea0: 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 70  */.    pFirst->p
ceb0: 52 69 67 68 74 20 3d 20 70 45 78 70 72 3b 0a 20  Right = pExpr;. 
cec0: 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 0a 20     pExpr = 0;.. 
ced0: 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74     /* Remember t
cee0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 4c  he size of the L
cef0: 48 53 20 69 6e 20 69 54 61 62 6c 65 20 73 6f 20  HS in iTable so 
cf00: 74 68 61 74 20 77 65 20 63 61 6e 20 63 68 65 63  that we can chec
cf10: 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  k that.    ** th
cf20: 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 73 69  e RHS and LHS si
cf30: 7a 65 73 20 6d 61 74 63 68 20 64 75 72 69 6e 67  zes match during
cf40: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
cf50: 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d  . */.    pFirst-
cf60: 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f 6c 75 6d  >iTable = pColum
cf70: 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76 65  ns->nId;.  }..ve
cf80: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
cf90: 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  r:.  sqlite3Expr
cfa0: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
cfb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69  );.  sqlite3IdLi
cfc0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  stDelete(db, pCo
cfd0: 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e  lumns);.  return
cfe0: 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
cff0: 20 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f 72   Set the sort or
d000: 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73 74  der for the last
d010: 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20   element on the 
d020: 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a  given ExprList..
d030: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
d040: 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72  xprListSetSortOr
d050: 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  der(ExprList *p,
d060: 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 29   int iSortOrder)
d070: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
d080: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
d090: 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46   SQLITE_SO_UNDEF
d0a0: 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49 54 45  INED<0 && SQLITE
d0b0: 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53 51  _SO_ASC>=0 && SQ
d0c0: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29  LITE_SO_DESC>0 )
d0d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
d0e0: 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  Expr>0 );.  if( 
d0f0: 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a  iSortOrder<0 ){.
d100: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
d110: 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72  [p->nExpr-1].sor
d120: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
d130: 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72 65 74  O_ASC );.    ret
d140: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b  urn;.  }.  p->a[
d150: 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74  p->nExpr-1].sort
d160: 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53 6f 72  Order = (u8)iSor
d170: 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tOrder;.}../*.**
d180: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
d190: 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d  t.a[].zName elem
d1a0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
d1b0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
d1c0: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
d1d0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
d1e0: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
d1f0: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
d200: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
d210: 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75    But pName shou
d220: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
d230: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
d240: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
d250: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
d260: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d270: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
d280: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d290: 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
d2a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d2b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
d2c0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d2d0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
d2e0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
d2f0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
d300: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
d310: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
d320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
d330: 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  e to be added */
d340: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
d350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
d360: 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ue to cause the 
d370: 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f  name to be dequo
d380: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ted */.){.  asse
d390: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
d3a0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
d3b0: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
d3c0: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
d3d0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
d3e0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
d3f0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
d400: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
d410: 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
d420: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
d430: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
d440: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
d450: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
d460: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
d470: 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64  trNDup(pParse->d
d480: 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  b, pName->z, pNa
d490: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20  me->n);.    if( 
d4a0: 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74 65  dequote ) sqlite
d4b0: 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e  3Dequote(pItem->
d4c0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zName);.  }.}../
d4d0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
d4e0: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20  rList.a[].zSpan 
d4f0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
d500: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
d510: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
d520: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
d530: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
d540: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
d550: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
d560: 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20  ror.  But pSpan 
d570: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
d580: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
d590: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
d5a0: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
d5b0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
d5c0: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
d5d0: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
d5e0: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
d5f0: 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pan(.  Parse *pP
d600: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
d610: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
d620: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
d630: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
d640: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
d650: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
d660: 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a   */.  ExprSpan *
d670: 70 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a  pSpan         /*
d680: 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20   The span to be 
d690: 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  added */.){.  sq
d6a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
d6b0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
d6c0: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62  ( pList!=0 || db
d6d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
d6e0: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
d6f0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
d700: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
d710: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
d720: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
d730: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
d740: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
d750: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
d760: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
d770: 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70  Item->pExpr==pSp
d780: 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  an->pExpr );.   
d790: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d7a0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
d7b0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
d7c0: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
d7d0: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
d7e0: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->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 20 20 20 20                  
d810: 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d      (int)(pSpan-
d820: 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a  >zEnd - pSpan->z
d830: 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  Start));.  }.}..
d840: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
d850: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c  ression list pEL
d860: 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ist contains mor
d870: 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c  e than iLimit el
d880: 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65  ements,.** leave
d890: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
d8a0: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
d8b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
d8c0: 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
d8d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d8e0: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ,.  ExprList *pE
d8f0: 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  List,.  const ch
d900: 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20  ar *zObject.){. 
d910: 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65   int mx = pParse
d920: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
d930: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
d940: 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  ];.  testcase( p
d950: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
d960: 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20  >nExpr==mx );.  
d970: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
d980: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
d990: 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28  r==mx+1 );.  if(
d9a0: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
d9b0: 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20  t->nExpr>mx ){. 
d9c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d9d0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
d9e0: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
d9f0: 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20  %s", zObject);. 
da00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
da10: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
da20: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
da30: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
da40: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70  OINLINE void exp
da50: 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71  rListDeleteNN(sq
da60: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
da70: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
da80: 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nt i = pList->nE
da90: 78 70 72 3b 0a 20 20 73 74 72 75 63 74 20 45 78  xpr;.  struct Ex
daa0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
dab0: 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61 3b 0a  em =  pList->a;.
dac0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
dad0: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 64 6f  >nExpr>0 );.  do
dae0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
daf0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  rDelete(db, pIte
db00: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73  m->pExpr);.    s
db10: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
db20: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
db30: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
db40: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
db50: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2b 2b  an);.    pItem++
db60: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d 69 3e  ;.  }while( --i>
db70: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  0 );.  sqlite3Db
db80: 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74  FreeNN(db, pList
db90: 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
dba0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
dbb0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
dbc0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
dbd0: 20 69 66 28 20 70 4c 69 73 74 20 29 20 65 78 70   if( pList ) exp
dbe0: 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62  rListDeleteNN(db
dbf0: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
dc00: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69  ** Return the bi
dc10: 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20  twise-OR of all 
dc20: 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64  Expr.flags field
dc30: 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a  s in the given.*
dc40: 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75  * ExprList..*/.u
dc50: 33 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  32 sqlite3ExprLi
dc60: 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78  stFlags(const Ex
dc70: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
dc80: 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d    int i;.  u32 m
dc90: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 0;.  if( pLis
dca0: 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
dcb0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
dcc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 45  ; i++){.       E
dcd0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69  xpr *pExpr = pLi
dce0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
dcf0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
dd00: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
dd10: 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c    m |= pExpr->fl
dd20: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ags;.    }.  }. 
dd30: 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a   return m;.}../*
dd40: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
dd50: 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61  es are Walker ca
dd60: 6c 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20  llbacks used to 
dd70: 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e  check expression
dd80: 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74  s to.** see if t
dd90: 68 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e  hey are "constan
dda0: 74 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69  t" for some defi
ddb0: 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61  nition of consta
ddc0: 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b  nt.  The.** Walk
ddd0: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64  er.eCode value d
dde0: 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79  etermines the ty
ddf0: 70 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22  pe of "constant"
de00: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a   we are looking.
de10: 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ** for..**.** Th
de20: 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ese callback rou
de30: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
de40: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
de50: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
de60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
de70: 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  IsConstant()    
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
de90: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a  alker->eCode==1.
dea0: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
deb0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
dec0: 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20  oin()           
ded0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
dee0: 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  2.**     sqlite3
def0: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
df00: 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20  ant()           
df10: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
df20: 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ==3.**     sqlit
df30: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
df40: 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20  OrFunction()    
df50: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
df60: 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a  de==4 or 5.**.**
df70: 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74   In all cases, t
df80: 68 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74  he callbacks set
df90: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20   Walker.eCode=0 
dfa0: 61 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65  and abort if the
dfb0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
dfc0: 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62  s found to not b
dfd0: 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a  e a constant..**
dfe0: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45  .** The sqlite3E
dff0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
e000: 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65  unction() is use
e010: 64 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67  d for evaluating
e020: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
e030: 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
e040: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
e050: 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76  e Walker.eCode v
e060: 61 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70  alue is 5 when p
e070: 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69  arsing.** an exi
e080: 73 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64  sting schema and
e090: 20 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69   4 when processi
e0a0: 6e 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65  ng a new stateme
e0b0: 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20  nt.  A bound.** 
e0c0: 70 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73  parameter raises
e0d0: 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65   an error for ne
e0e0: 77 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75  w statements, bu
e0f0: 74 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f  t is silently co
e100: 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55  nverted.** to NU
e110: 4c 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  LL for existing 
e120: 73 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61  schemas.  This a
e130: 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73  llows sqlite_mas
e140: 74 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20  ter tables that 
e150: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f  .** contain a bo
e160: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65  und parameter be
e170: 63 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20  cause they were 
e180: 67 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64  generated by old
e190: 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  er versions.** o
e1a0: 66 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70  f SQLite to be p
e1b0: 61 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76  arsed by newer v
e1c0: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
e1d0: 65 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e  e without raisin
e1e0: 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  g a.** malformed
e1f0: 20 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a   schema error..*
e200: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
e210: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  rNodeIsConstant(
e220: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
e230: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a   Expr *pExpr){..
e240: 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d    /* If pWalker-
e250: 3e 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e  >eCode is 2 then
e260: 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65   any term of the
e270: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
e280: 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a   comes from.  **
e290: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
e2a0: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65   clauses of a le
e2b0: 66 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69  ft join disquali
e2c0: 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73  fies the express
e2d0: 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65  ion.  ** from be
e2e0: 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63  ing considered c
e2f0: 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  onstant. */.  if
e300: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
e310: 3d 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72  ==2 && ExprHasPr
e320: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
e330: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
e340: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
e350: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
e360: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
e370: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
e380: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ->op ){.    /* C
e390: 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e  onsider function
e3a0: 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74  s to be constant
e3b0: 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72   if all their ar
e3c0: 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73  guments are cons
e3d0: 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20  tant.    ** and 
e3e0: 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e  either pWalker->
e3f0: 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72  eCode==4 or 5 or
e400: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61   the function ha
e410: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c  s the.    ** SQL
e420: 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66  ITE_FUNC_CONST f
e430: 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65  lag. */.    case
e440: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
e450: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
e460: 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70  >eCode>=4 || Exp
e470: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
e480: 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29  pr,EP_ConstFunc)
e490: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
e4a0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
e4b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e4c0: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
e4d0: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
e4e0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
e4f0: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
e500: 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20  case TK_ID:.    
e510: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a  case TK_COLUMN:.
e520: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
e530: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
e540: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
e550: 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
e560: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e570: 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ID );.      test
e580: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
e590: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
e5a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
e5b0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
e5c0: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
e5d0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
e5e0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
e5f0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66  LUMN );.      if
e600: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
e610: 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54  ==3 && pExpr->iT
e620: 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  able==pWalker->u
e630: 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  .iCur ){.       
e640: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
e650: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
e660: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
e670: 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ugh */.    case 
e680: 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 0a  TK_IF_NULL_ROW:.
e690: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e6a0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46  pExpr->op==TK_IF
e6b0: 5f 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20 20  _NULL_ROW );.   
e6c0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
e6d0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
e6e0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
e6f0: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
e700: 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70  BLE:.      if( p
e710: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35  Walker->eCode==5
e720: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
e730: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20  ilently convert 
e740: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73  bound parameters
e750: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 73   that appear ins
e760: 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20  ide of CREATE.  
e770: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
e780: 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20  nts into a NULL 
e790: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65  when parsing the
e7a0: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
e7b0: 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20  t text out.     
e7c0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c     ** of the sql
e7d0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
e7e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70   */.        pExp
e7f0: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
e800: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e810: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
e820: 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =4 ){.        /*
e830: 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74   A bound paramet
e840: 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20 73  er in a CREATE s
e850: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72  tatement that or
e860: 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20  iginates from.  
e870: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
e880: 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73 65  _prepare() cause
e890: 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
e8a0: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
e8b0: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
e8c0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
e8d0: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
e8e0: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
e8f0: 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74  h */.    default
e900: 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
e910: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e920: 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c  SELECT ); /* sel
e930: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
e940: 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20  t will disallow 
e950: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
e960: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
e970: 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65  _EXISTS ); /* se
e980: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
e990: 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77  nt will disallow
e9a0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
e9b0: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
e9c0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20   }.}.static int 
e9d0: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
e9e0: 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  tant(Walker *pWa
e9f0: 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f  lker, Select *No
ea00: 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
ea10: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
ea20: 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ed);.  pWalker->
ea30: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74  eCode = 0;.  ret
ea40: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d  urn WRC_Abort;.}
ea50: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
ea60: 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c  IsConst(Expr *p,
ea70: 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20 69   int initFlag, i
ea80: 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b  nt iCur){.  Walk
ea90: 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20  er w;.  w.eCode 
eaa0: 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e  = initFlag;.  w.
eab0: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
eac0: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
ead0: 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  nt;.  w.xSelectC
eae0: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
eaf0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
eb00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
eb10: 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  BUG.  w.xSelectC
eb20: 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74  allback2 = sqlit
eb30: 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65  e3SelectWalkAsse
eb40: 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20 77 2e  rt2;.#endif.  w.
eb50: 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  u.iCur = iCur;. 
eb60: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
eb70: 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
eb80: 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
eb90: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
eba0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
ebb0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
ebc0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ebd0: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61  is constant.** a
ebe0: 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  nd 0 if it invol
ebf0: 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
ec00: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e   function calls.
ec10: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
ec20: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
ec30: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
ec40: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
ec50: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
ec60: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
ec70: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
ec80: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
ec90: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
eca0: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
ecb0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ecc0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45  ExprIsConstant(E
ecd0: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
ece0: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
ecf0: 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   1, 0);.}../*.**
ed00: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
ed10: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
ed20: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
ed30: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ed40: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74  constant.** that
ed50: 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61   does no origina
ed60: 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f  te from the ON o
ed70: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
ed80: 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65  of a join..** Re
ed90: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76  turn 0 if it inv
eda0: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
edb0: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
edc0: 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a  s or terms from.
edd0: 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e  ** an ON or USIN
ede0: 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  G clause..*/.int
edf0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
ee00: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78  nstantNotJoin(Ex
ee10: 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
ee20: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
ee30: 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2, 0);.}../*.** 
ee40: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
ee50: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
ee60: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
ee70: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
ee80: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61  onstant.** for a
ee90: 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66  ny single row of
eea0: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
eeb0: 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e  cursor iCur.  In
eec0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
eed0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
eee0: 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74  must not refer t
eef0: 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d  o any non-determ
ef00: 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e  inistic function
ef10: 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c   nor any.** tabl
ef20: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75  e other than iCu
ef30: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
ef40: 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
ef50: 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  tant(Expr *p, in
ef60: 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72  t iCur){.  retur
ef70: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
ef80: 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f   3, iCur);.}.../
ef90: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b  *.** sqlite3Walk
efa0: 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20  Expr() callback 
efb0: 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 45  used by sqlite3E
efc0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47  xprIsConstantOrG
efd0: 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74 61  roupBy()..*/.sta
efe0: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
eff0: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75  IsConstantOrGrou
f000: 70 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  pBy(Walker *pWal
f010: 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
f020: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
f030: 47 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b 65  GroupBy = pWalke
f040: 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a 20  r->u.pGroupBy;. 
f050: 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43 68   int i;..  /* Ch
f060: 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20  eck if pExpr is 
f070: 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e 79  identical to any
f080: 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e 20   GROUP BY term. 
f090: 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 0a  If so, consider.
f0a0: 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e 74    ** it constant
f0b0: 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
f0c0: 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
f0d0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
f0e0: 70 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42 79  pr *p = pGroupBy
f0f0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
f100: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
f110: 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70  rCompare(0, pExp
f120: 72 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a 20  r, p, -1)<2 ){. 
f130: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
f140: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
f150: 72 43 6f 6c 6c 53 65 71 28 70 57 61 6c 6b 65 72  rCollSeq(pWalker
f160: 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  ->pParse, p);.  
f170: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30      if( pColl==0
f180: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69   || sqlite3_stri
f190: 63 6d 70 28 22 42 49 4e 41 52 59 22 2c 20 70 43  cmp("BINARY", pC
f1a0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29  oll->zName)==0 )
f1b0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
f1c0: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
f1d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
f1e0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45 78   /* Check if pEx
f1f0: 70 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  pr is a sub-sele
f200: 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69  ct. If so, consi
f210: 64 65 72 20 69 74 20 76 61 72 69 61 62 6c 65 2e  der it variable.
f220: 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61   */.  if( ExprHa
f230: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
f240: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
f250: 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65  {.    pWalker->e
f260: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65  Code = 0;.    re
f270: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
f280: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 65 78    }..  return ex
f290: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
f2a0: 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 29  (pWalker, pExpr)
f2b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
f2c0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
f2d0: 72 65 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ree passed as th
f2e0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
f2f0: 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  . Return non-zer
f300: 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72  o.** if the expr
f310: 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73 74 73 20  ession consists 
f320: 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73  entirely of cons
f330: 74 61 6e 74 73 20 6f 72 20 63 6f 70 69 65 73 20  tants or copies 
f340: 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20 69 6e 20  of terms .** in 
f350: 70 47 72 6f 75 70 42 79 20 74 68 61 74 20 73 6f  pGroupBy that so
f360: 72 74 20 77 69 74 68 20 74 68 65 20 42 49 4e 41  rt with the BINA
f370: 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  RY collation seq
f380: 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  uence..**.** Thi
f390: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
f3a0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
f3b0: 66 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  f a term of the 
f3c0: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 63 61  HAVING clause ca
f3d0: 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f 74 65 64  n.** be promoted
f3e0: 20 69 6e 74 6f 20 74 68 65 20 57 48 45 52 45 20   into the WHERE 
f3f0: 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72 64 65  clause.  In orde
f400: 72 20 66 6f 72 20 73 75 63 68 20 61 20 70 72 6f  r for such a pro
f410: 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a  motion to work,.
f420: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
f430: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
f440: 65 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74  e term must be t
f450: 68 65 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20  he same for all 
f460: 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a 20 61 20  members of.** a 
f470: 22 67 72 6f 75 70 22 2e 20 20 54 68 65 20 72 65  "group".  The re
f480: 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74  quirement that t
f490: 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
f4a0: 20 6d 75 73 74 20 62 65 20 42 49 4e 41 52 59 0a   must be BINARY.
f4b0: 2a 2a 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ** assumes that 
f4c0: 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69  no other collati
f4d0: 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c  ng sequence will
f4e0: 20 68 61 76 65 20 61 20 66 69 6e 65 72 2d 67 72   have a finer-gr
f4f0: 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75 70 69 6e  ained.** groupin
f500: 67 20 74 68 61 6e 20 62 69 6e 61 72 79 2e 20 20  g than binary.  
f510: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 28  In other words (
f520: 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61  A=B COLLATE bina
f530: 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 41  ry) implies.** A
f540: 3d 42 20 69 6e 20 65 76 65 72 79 20 6f 74 68 65  =B in every othe
f550: 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  r collating sequ
f560: 65 6e 63 65 2e 20 20 54 68 65 20 72 65 71 75 69  ence.  The requi
f570: 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 0a  rement that the.
f580: 2a 2a 20 47 52 4f 55 50 20 42 59 20 62 65 20 42  ** GROUP BY be B
f590: 49 4e 41 52 59 20 69 73 20 73 74 72 69 63 74 65  INARY is stricte
f5a0: 72 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  r than necessary
f5b0: 2e 20 20 49 74 20 77 6f 75 6c 64 20 61 6c 73 6f  .  It would also
f5c0: 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d   work.** to prom
f5d0: 6f 74 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  ote HAVING claus
f5e0: 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
f5f0: 73 61 6d 65 20 61 6c 74 65 72 6e 61 74 69 76 65  same alternative
f600: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
f610: 71 75 65 6e 63 65 20 61 73 20 74 68 65 20 47 52  quence as the GR
f620: 4f 55 50 20 42 59 20 74 65 72 6d 2c 20 62 75 74  OUP BY term, but
f630: 20 74 68 61 74 20 69 73 20 6d 75 63 68 20 68 61   that is much ha
f640: 72 64 65 72 20 74 6f 20 63 68 65 63 6b 2c 0a 2a  rder to check,.*
f650: 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * alternative co
f660: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f670: 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20  s are uncommon, 
f680: 61 6e 64 20 74 68 69 73 20 69 73 20 6f 6e 6c 79  and this is only
f690: 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74   an.** optimizat
f6a0: 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61 6b 65 20  ion, so we take 
f6b0: 74 68 65 20 65 61 73 79 20 77 61 79 20 6f 75 74  the easy way out
f6c0: 20 61 6e 64 20 73 69 6d 70 6c 79 20 72 65 71 75   and simply requ
f6d0: 69 72 65 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50  ire the.** GROUP
f6e0: 20 42 59 20 74 6f 20 75 73 65 20 74 68 65 20 42   BY to use the B
f6f0: 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67 20  INARY collating 
f700: 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74  sequence..*/.int
f710: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
f720: 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28  nstantOrGroupBy(
f730: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
f740: 78 70 72 20 2a 70 2c 20 45 78 70 72 4c 69 73 74  xpr *p, ExprList
f750: 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a 20 20 57   *pGroupBy){.  W
f760: 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f  alker w;.  w.eCo
f770: 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70  de = 1;.  w.xExp
f780: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
f790: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72  NodeIsConstantOr
f7a0: 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 78 53 65  GroupBy;.  w.xSe
f7b0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30  lectCallback = 0
f7c0: 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75 70 42 79  ;.  w.u.pGroupBy
f7d0: 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 77   = pGroupBy;.  w
f7e0: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
f7f0: 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
f800: 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65  xpr(&w, p);.  re
f810: 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a  turn w.eCode;.}.
f820: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
f830: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
f840: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
f850: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
f860: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
f870: 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20  * or a function 
f880: 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61  call with consta
f890: 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
f8a0: 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74  eturn and 0 if t
f8b0: 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20  here.** are any 
f8c0: 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  variables..**.**
f8d0: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
f8e0: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
f8f0: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
f900: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
f910: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
f920: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
f930: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
f940: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
f950: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
f960: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
f970: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
f980: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
f990: 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75 38 20 69  on(Expr *p, u8 i
f9a0: 73 49 6e 69 74 29 7b 0a 20 20 61 73 73 65 72 74  sInit){.  assert
f9b0: 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69  ( isInit==0 || i
f9c0: 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65  sInit==1 );.  re
f9d0: 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
f9e0: 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30 29  (p, 4+isInit, 0)
f9f0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
fa00: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
fa10: 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c  _HINTS./*.** Wal
fa20: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
fa30: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
fa40: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
fa50: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  n contains a.** 
fa60: 73 75 62 71 75 65 72 79 20 6f 66 20 73 6f 6d 65  subquery of some
fa70: 20 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e 20 30   kind.  Return 0
fa80: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
fa90: 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a   subqueries..*/.
faa0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
fab0: 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72 79 28  ontainsSubquery(
fac0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b  Expr *p){.  Walk
fad0: 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20  er w;.  w.eCode 
fae0: 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  = 1;.  w.xExprCa
faf0: 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
fb00: 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  ExprWalkNoop;.  
fb10: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
fb20: 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73  k = selectNodeIs
fb30: 43 6f 6e 73 74 61 6e 74 3b 0a 23 69 66 64 65 66  Constant;.#ifdef
fb40: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
fb50: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
fb60: 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  k2 = sqlite3Sele
fb70: 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23  ctWalkAssert2;.#
fb80: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 57  endif.  sqlite3W
fb90: 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a  alkExpr(&w, p);.
fba0: 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65    return w.eCode
fbb0: 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ==0;.}.#endif../
fbc0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
fbd0: 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61  ession p codes a
fbe0: 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65   constant intege
fbf0: 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20  r that is small 
fc00: 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74  enough.** to fit
fc10: 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74   in a 32-bit int
fc20: 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61  eger, return 1 a
fc30: 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65  nd put the value
fc40: 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a   of the integer.
fc50: 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20  ** in *pValue.  
fc60: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
fc70: 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  n is not an inte
fc80: 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20  ger or if it is 
fc90: 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69  too big.** to fi
fca0: 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32  t in a signed 32
fcb0: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65  -bit integer, re
fcc0: 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65  turn 0 and leave
fcd0: 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67   *pValue unchang
fce0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
fcf0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
fd00: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56  Expr *p, int *pV
fd10: 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  alue){.  int rc 
fd20: 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  = 0;.  if( p==0 
fd30: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
fd40: 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  Can only happen 
fd50: 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d  following on OOM
fd60: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   */..  /* If an 
fd70: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
fd80: 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c   integer literal
fd90: 20 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20   that fits in a 
fda0: 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20  signed 32-bit.  
fdb0: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  ** integer, then
fdc0: 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65   the EP_IntValue
fdd0: 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20   flag will have 
fde0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74  already been set
fdf0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
fe00: 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op!=TK_INTEGER 
fe10: 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45  || (p->flags & E
fe20: 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20  P_IntValue)!=0. 
fe30: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
fe40: 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e  ite3GetInt32(p->
fe50: 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d  u.zToken, &rc)==
fe60: 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66  0 );..  if( p->f
fe70: 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
fe80: 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75  ue ){.    *pValu
fe90: 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b  e = p->u.iValue;
fea0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
feb0: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e   }.  switch( p->
fec0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
fed0: 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
fee0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70   rc = sqlite3Exp
fef0: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
ff00: 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
ff10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ff20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
ff30: 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NUS: {.      int
ff40: 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   v;.      if( sq
ff50: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
ff60: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29  er(p->pLeft, &v)
ff70: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
ff80: 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33  rt( v!=(-2147483
ff90: 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  647-1) );.      
ffa0: 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
ffb0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
ffc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
ffd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
ffe0: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
fff0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10000 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
10010 46 41 4c 53 45 20 69 66 20 74 68 65 72 65 20 69  FALSE if there i
10020 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
10030 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10040 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  can be NULL..**.
10050 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
10060 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55  sion might be NU
10070 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78 70  LL or if the exp
10080 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63  ression is too c
10090 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c  omplex.** to tel
100a0 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  l return TRUE.  
100b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
100c0 69 6e 65 20 69 73 20 75 73 65 64 20 61 73 20 61  ine is used as a
100d0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
100e0 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c  to skip OP_IsNul
100f0 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65  l opcodes.** whe
10100 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61  n we know that a
10110 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
10120 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61   NULL.  Hence, a
10130 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a   false positive.
10140 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52  ** (returning TR
10150 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20  UE when in fact 
10160 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
10170 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c  an never be NULL
10180 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20  ) might.** be a 
10190 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63  small performanc
101a0 65 20 68 69 74 20 62 75 74 20 69 73 20 6f 74 68  e hit but is oth
101b0 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e  erwise harmless.
101c0 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a    On the other.*
101d0 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20  * hand, a false 
101e0 6e 65 67 61 74 69 76 65 20 28 72 65 74 75 72 6e  negative (return
101f0 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74  ing FALSE when t
10200 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20  he result could 
10210 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c  be NULL).** will
10220 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
10230 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61  n an incorrect a
10240 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20  nswer.  So when 
10250 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
10260 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74  .** TRUE..*/.int
10270 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
10280 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72  eNull(const Expr
10290 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20   *p){.  u8 op;. 
102a0 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
102b0 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70  K_UPLUS || p->op
102c0 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70  ==TK_UMINUS ){ p
102d0 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20   = p->pLeft; }. 
102e0 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69   op = p->op;.  i
102f0 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
10300 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32  ER ) op = p->op2
10310 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
10320 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
10330 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20  TEGER:.    case 
10340 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63  TK_STRING:.    c
10350 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20  ase TK_FLOAT:.  
10360 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a    case TK_BLOB:.
10370 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
10380 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
10390 4d 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  MN:.      assert
103a0 28 20 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a  ( p->pTab!=0 );.
103b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70        return Exp
103c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
103d0 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c  EP_CanBeNull) ||
103e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70  .             (p
103f0 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20  ->iColumn>=0 && 
10400 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d  p->pTab->aCol[p-
10410 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c  >iColumn].notNul
10420 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75  l==0);.    defau
10430 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
10440 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
10450 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
10460 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
10470 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61  sion is a consta
10480 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  nt which would b
10490 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62  e.** unchanged b
104a0 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69  y OP_Affinity wi
104b0 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  th the affinity 
104c0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
104d0 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ond.** argument.
104e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
104f0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
10500 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
10510 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72  OP_Affinity oper
10520 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
10530 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69  omitted.  When i
10540 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46  n doubt return F
10550 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e  ALSE.  A false n
10560 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61  egative.** is ha
10570 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65  rmless.  A false
10580 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76   positive, howev
10590 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69  er, can result i
105a0 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61  n the wrong.** a
105b0 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nswer..*/.int sq
105c0 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
105d0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63  AffinityChange(c
105e0 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68  onst Expr *p, ch
105f0 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70  ar aff){.  u8 op
10600 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c  ;.  if( aff==SQL
10610 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72  ITE_AFF_BLOB ) r
10620 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65  eturn 1;.  while
10630 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
10640 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
10650 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
10660 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
10670 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
10680 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
10690 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
106a0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
106b0 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
106c0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
106d0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
106e0 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
106f0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
10700 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
10710 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
10720 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
10730 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
10740 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
10750 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
10760 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
10770 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72  TRING: {.      r
10780 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
10790 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
107a0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  }.    case TK_BL
107b0 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  OB: {.      retu
107c0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
107d0 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
107e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
107f0 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20  p->iTable>=0 ); 
10800 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20   /* p cannot be 
10810 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20  part of a CHECK 
10820 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
10830 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43      return p->iC
10840 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20  olumn<0.        
10850 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
10860 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
10870 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
10880 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d  _NUMERIC);.    }
10890 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
108a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
108b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
108c0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
108d0 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
108e0 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63  ng is a row-id c
108f0 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69  olumn name..*/.i
10900 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  nt sqlite3IsRowi
10910 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  d(const char *z)
10920 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  {.  if( sqlite3S
10930 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49  trICmp(z, "_ROWI
10940 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  D_")==0 ) return
10950 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
10960 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57  3StrICmp(z, "ROW
10970 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
10980 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
10990 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44  3StrICmp(z, "OID
109a0 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
109b0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
109c0 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65  ./*.** pX is the
109d0 20 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70   RHS of an IN op
109e0 65 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69  erator.  If pX i
109f0 73 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  s a SELECT state
10a00 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61  ment .** that ca
10a10 6e 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20  n be simplified 
10a20 74 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c  to a direct tabl
10a30 65 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72  e access, then r
10a40 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
10a50 65 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54  er to the SELECT
10a60 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20   statement.  If 
10a70 70 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45  pX is not a SELE
10a80 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a  CT statement,.**
10a90 20 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43   or if the SELEC
10aa0 54 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64  T statement need
10ab0 73 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74  s to be manifest
10ac0 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69  ed into a transi
10ad0 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68  ent.** table, th
10ae0 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  en return NULL..
10af0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
10b00 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
10b10 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69  static Select *i
10b20 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
10b30 70 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20  pt(Expr *pX){.  
10b40 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63  Select *p;.  Src
10b50 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78  List *pSrc;.  Ex
10b60 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
10b70 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
10b80 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45   int i;.  if( !E
10b90 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
10ba0 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
10bb0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
10bc0 20 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20   Not a subquery 
10bd0 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  */.  if( ExprHas
10be0 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
10bf0 56 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65  VarSelect)  ) re
10c00 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72  turn 0;  /* Corr
10c10 65 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20  elated subq */. 
10c20 20 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65   p = pX->x.pSele
10c30 63 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  ct;.  if( p->pPr
10c40 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ior ) return 0; 
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10c60 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  Not a compound S
10c70 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70  ELECT */.  if( p
10c80 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
10c90 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
10ca0 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74  regate) ){.    t
10cb0 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
10cc0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
10cd0 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
10ce0 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
10cf0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
10d00 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
10d10 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
10d20 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
10d30 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
10d40 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e    return 0; /* N
10d50 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  o DISTINCT keywo
10d60 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67  rd and no aggreg
10d70 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
10d80 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
10d90 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
10da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10db0 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   Has no GROUP BY
10dc0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
10dd0 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
10de0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
10df0 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49      /* Has no LI
10e00 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  MIT clause */.  
10e10 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
10e20 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  et==0 );        
10e30 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d         /* No LIM
10e40 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53  IT means no OFFS
10e50 45 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  ET */.  if( p->p
10e60 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
10e70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10e80 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63  * Has no WHERE c
10e90 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20  lause */.  pSrc 
10ea0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
10eb0 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
10ec0 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
10ed0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
10ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67           /* Sing
10ef0 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20  le term in FROM 
10f00 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
10f10 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
10f20 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
10f30 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f     /* FROM is no
10f40 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20  t a subquery or 
10f50 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d  view */.  pTab =
10f60 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62   pSrc->a[0].pTab
10f70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
10f80 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
10f90 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
10fa0 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
10fb0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  /* FROM clause i
10fc0 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a  s not a view */.
10fd0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
10fe0 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
10ff0 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d  ;        /* FROM
11000 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69   clause not a vi
11010 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
11020 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
11030 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ist;.  assert( p
11040 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 2f 2a  EList!=0 );.  /*
11050 20 41 6c 6c 20 53 45 4c 45 43 54 20 72 65 73 75   All SELECT resu
11060 6c 74 73 20 6d 75 73 74 20 62 65 20 63 6f 6c 75  lts must be colu
11070 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  mns. */.  for(i=
11080 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
11090 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
110a0 70 72 20 2a 70 52 65 73 20 3d 20 70 45 4c 69 73  pr *pRes = pELis
110b0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
110c0 20 20 20 69 66 28 20 70 52 65 73 2d 3e 6f 70 21     if( pRes->op!
110d0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
110e0 75 72 6e 20 30 3b 0a 20 20 20 20 61 73 73 65 72  urn 0;.    asser
110f0 74 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65 3d  t( pRes->iTable=
11100 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72  =pSrc->a[0].iCur
11110 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20 61  sor );  /* Not a
11120 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
11130 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  uery */.  }.  re
11140 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66  turn p;.}.#endif
11150 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11160 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
11170 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11180 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
11190 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
111a0 61 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65  at checks the le
111b0 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
111c0 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43  f index table iC
111d0 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20  ur to see if.** 
111e0 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  it contains any 
111f0 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43  NULL entries.  C
11200 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65  ause the registe
11210 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20  r at regHasNull 
11220 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20  to be set.** to 
11230 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
11240 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e   if iCur contain
11250 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75  s no NULLs.  Cau
11260 73 65 20 72 65 67 69 73 74 65 72 20 72 65 67 48  se register regH
11270 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20  asNull.** to be 
11280 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69  set to NULL if i
11290 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  Cur contains one
112a0 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61   or more NULL va
112b0 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
112c0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 48  void sqlite3SetH
112d0 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20  asNullFlag(Vdbe 
112e0 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e  *v, int iCur, in
112f0 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20  t regHasNull){. 
11300 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73 71   int addr1;.  sq
11310 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11320 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
11330 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20  , regHasNull);. 
11340 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
11350 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
11360 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b 20  _Rewind, iCur); 
11370 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
11380 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
11390 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
113a0 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67 48  n, iCur, 0, regH
113b0 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74  asNull);.  sqlit
113c0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
113d0 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  , OPFLAG_TYPEOFA
113e0 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  RG);.  VdbeComme
113f0 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65 6e  nt((v, "first_en
11400 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43 75  try_in(%d)", iCu
11410 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r));.  sqlite3Vd
11420 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
11430 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  dr1);.}.#endif..
11440 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11450 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
11460 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
11470 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
11480 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74 20 28  or with a list (
11490 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20  not a subquery) 
114a0 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74  on the .** right
114b0 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74  -hand side.  Ret
114c0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 61 74  urn TRUE if that
114d0 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e   list is constan
114e0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
114f0 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43   sqlite3InRhsIsC
11500 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49  onstant(Expr *pI
11510 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53  n){.  Expr *pLHS
11520 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61  ;.  int res;.  a
11530 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
11540 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f  roperty(pIn, EP_
11550 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
11560 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66  pLHS = pIn->pLef
11570 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20  t;.  pIn->pLeft 
11580 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c  = 0;.  res = sql
11590 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
115a0 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e  nt(pIn);.  pIn->
115b0 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20  pLeft = pLHS;.  
115c0 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65  return res;.}.#e
115d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
115e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
115f0 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65  d by the impleme
11600 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  ntation of the I
11610 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  N (...) operator
11620 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61  ..** The pX para
11630 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70  meter is the exp
11640 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52  ression on the R
11650 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
11660 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20  rator, which.** 
11670 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
11680 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
11690 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75  sions or a subqu
116a0 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ery..**.** The j
116b0 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
116c0 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72  ne is to find or
116d0 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65   create a b-tree
116e0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e   object that can
116f0 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68  .** be used eith
11700 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
11710 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65  embership in the
11720 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69   RHS set or to i
11730 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a  terate through.*
11740 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  * all members of
11750 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b   the RHS set, sk
11760 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65  ipping duplicate
11770 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f  s..**.** A curso
11780 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  r is opened on t
11790 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
117a0 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48 53   that is the RHS
117b0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
117c0 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69  tor.** and pX->i
117d0 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
117e0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
117f0 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t cursor..**.** 
11800 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
11810 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
11820 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68  ion indicates th
11830 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61  e b-tree type, a
11840 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
11850 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49     IN_INDEX_ROWI
11860 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72  D      - The cur
11870 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
11880 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  n a database tab
11890 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
118a0 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54  X_INDEX_ASC  - T
118b0 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
118c0 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e  ened on an ascen
118d0 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
118e0 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
118f0 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f  DESC - The curso
11900 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
11910 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
11920 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
11930 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54  X_EPH        - T
11940 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
11950 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
11960 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
11970 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11980 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c             popul
11990 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74  ated epheremal t
119a0 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
119b0 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d  DEX_NOOP       -
119c0 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61   No cursor was a
119d0 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49  llocated.  The I
119e0 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20  N operator must 
119f0 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
11a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d                im
11a10 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73  plemented as a s
11a20 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
11a30 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  risons..**.** An
11a40 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65   existing b-tree
11a50 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69   might be used i
11a60 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73  f the RHS expres
11a70 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d  sion pX is a sim
11a80 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ple.** subquery 
11a90 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  such as:.**.**  
11aa0 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d     SELECT <colum
11ab0 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e  n1>, <column2>..
11ac0 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a  . FROM <table>.*
11ad0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20  *.** If the RHS 
11ae0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
11af0 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20  or is a list or 
11b00 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73  a more complex s
11b10 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  ubquery, then.**
11b20 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
11b30 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ble might need t
11b40 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66  o be generated f
11b50 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20  rom the RHS and 
11b60 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62  then.** pX->iTab
11b70 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  le made to point
11b80 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61   to the ephemera
11b90 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20  l table instead 
11ba0 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  of an.** existin
11bb0 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  g table..**.** T
11bc0 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d  he inFlags param
11bd0 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69  eter must contai
11be0 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  n exactly one of
11bf0 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f   the bits.** IN_
11c00 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
11c10 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f   or IN_INDEX_LOO
11c20 50 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63  P.  If inFlags c
11c30 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e  ontains.** IN_IN
11c40 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20  DEX_MEMBERSHIP, 
11c50 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74  then the generat
11c60 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  ed table will be
11c70 20 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66   used for a.** f
11c80 61 73 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  ast membership t
11c90 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49  est.  When the I
11ca0 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74  N_INDEX_LOOP bit
11cb0 20 69 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20   is set, the.** 
11cc0 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65  IN index will be
11cd0 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76   used to loop ov
11ce0 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
11cf0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a   the RHS of the.
11d00 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  ** IN operator..
11d10 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
11d20 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64  DEX_LOOP is used
11d30 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65   (and the b-tree
11d40 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
11d50 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f   iterate.** thro
11d60 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62  ugh the set memb
11d70 65 72 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d  ers) then the b-
11d80 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f  tree must not co
11d90 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73  ntain duplicates
11da0 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61  ..** An epherema
11db0 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  l table must be 
11dc0 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20  used unless the 
11dd0 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73  selected columns
11de0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a   are guaranteed.
11df0 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20  ** to be unique 
11e00 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  - either because
11e10 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45   it is an INTEGE
11e20 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  R PRIMARY KEY or
11e30 20 64 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49   due to.** a UNI
11e40 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
11e50 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57  r index..**.** W
11e60 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  hen IN_INDEX_MEM
11e70 42 45 52 53 48 49 50 20 69 73 20 75 73 65 64 20  BERSHIP is used 
11e80 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20  (and the b-tree 
11e90 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
11ea0 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65   for fast set me
11eb0 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 29 20  mbership tests) 
11ec0 74 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61  then an epherema
11ed0 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a  l table must .**
11ee0 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
11ef0 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73  <columns> is a s
11f00 69 6e 67 6c 65 20 49 4e 54 45 47 45 52 20 50 52  ingle INTEGER PR
11f10 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
11f20 20 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78   or an .** index
11f30 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 77 69   can be found wi
11f40 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  th the specified
11f50 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74   <columns> as it
11f60 73 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a  s left-most..**.
11f70 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44  ** If the IN_IND
11f80 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49  EX_NOOP_OK and I
11f90 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
11fa0 49 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20  IP are both set 
11fb0 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48  and.** if the RH
11fc0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
11fd0 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28  ator is a list (
11fe0 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20  not a subquery) 
11ff0 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  then this.** rou
12000 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64  tine might decid
12010 65 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20  e that creating 
12020 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74  an ephemeral b-t
12030 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  ree for membersh
12040 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73  ip.** testing is
12050 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61   too expensive a
12060 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44  nd return IN_IND
12070 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61  EX_NOOP.  In tha
12080 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63  t case, the.** c
12090 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73  alling routine s
120a0 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20  hould implement 
120b0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
120c0 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65  using a sequence
120d0 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20  .** of Eq or Ne 
120e0 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
120f0 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tions..**.** Whe
12100 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20  n the b-tree is 
12110 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d  being used for m
12120 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c  embership tests,
12130 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
12140 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e  ction.** might n
12150 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74  eed to know whet
12160 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52  her or not the R
12170 48 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  HS side of the I
12180 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f  N operator.** co
12190 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20  ntains a NULL.  
121a0 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  If prRhsHasNull 
121b0 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f  is not a NULL po
121c0 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66  inter and .** if
121d0 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68   there is any ch
121e0 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
121f0 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  ..) might contai
12200 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61  n a NULL value a
12210 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68  t.** runtime, th
12220 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73  en a register is
12230 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
12240 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
12250 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  er written.** to
12260 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20   *prRhsHasNull. 
12270 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  If there is no c
12280 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
12290 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a  ...) contains a.
122a0 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74  ** NULL value, t
122b0 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  hen *prRhsHasNul
122c0 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  l is left unchan
122d0 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ged..**.** If a 
122e0 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
122f0 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f  cated and its lo
12300 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e  cation stored in
12310 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
12320 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75  then.** the valu
12330 65 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74  e in that regist
12340 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  er will be NULL 
12350 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f  if the b-tree co
12360 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
12370 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65  re.** NULL value
12380 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62  s, and it will b
12390 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20  e some non-NULL 
123a0 76 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74  value if the b-t
123b0 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a  ree contains no.
123c0 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a  ** NULL values..
123d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 69 4d  **.** If the aiM
123e0 61 70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ap parameter is 
123f0 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73  not NULL, it mus
12400 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72  t point to an ar
12410 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ray containing.*
12420 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f  * one element fo
12430 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65  r each column re
12440 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
12450 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
12460 6e 20 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20  n the RHS.** of 
12470 74 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72  the IN(...) oper
12480 61 74 6f 72 2e 20 54 68 65 20 69 27 74 68 20 65  ator. The i'th e
12490 6e 74 72 79 20 6f 66 20 74 68 65 20 61 72 72 61  ntry of the arra
124a0 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  y is populated w
124b0 69 74 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65  ith the.** offse
124c0 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63  t of the index c
124d0 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74 63 68  olumn that match
124e0 65 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75  es the i'th colu
124f0 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  mn returned by t
12500 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f  he.** SELECT. Fo
12510 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
12520 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  e expression and
12530 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78 20   selected index 
12540 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c  are:.**.**   (?,
12550 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 20  ?,?) IN (SELECT 
12560 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31 29  a, b, c FROM t1)
12570 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
12580 45 58 20 69 31 20 4f 4e 20 74 31 28 62 2c 20 63  EX i1 ON t1(b, c
12590 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  , a);.**.** then
125a0 20 61 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75   aiMap[] is popu
125b0 6c 61 74 65 64 20 77 69 74 68 20 7b 32 2c 20 30  lated with {2, 0
125c0 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  , 1}..*/.#ifndef
125d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
125e0 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65  QUERY.int sqlite
125f0 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20  3FindInIndex(.  
12600 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
12620 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
12630 0a 20 20 45 78 70 72 20 2a 70 58 2c 20 20 20 20  .  Expr *pX,    
12640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12650 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
12660 73 69 64 65 20 28 52 48 53 29 20 6f 66 20 74 68  side (RHS) of th
12670 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
12680 0a 20 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20  .  u32 inFlags, 
12690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
126a0 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20   IN_INDEX_LOOP, 
126b0 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 61 6e 64  _MEMBERSHIP, and
126c0 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a  /or _NOOP_OK */.
126d0 20 20 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e    int *prRhsHasN
126e0 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ull,         /* 
126f0 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
12700 20 4e 55 4c 4c 20 73 74 61 74 75 73 2e 20 20 53   NULL status.  S
12710 65 65 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e  ee notes */.  in
12720 74 20 2a 61 69 4d 61 70 20 20 20 20 20 20 20 20  t *aiMap        
12730 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70           /* Mapp
12740 69 6e 67 20 66 72 6f 6d 20 49 6e 64 65 78 20 66  ing from Index f
12750 69 65 6c 64 73 20 74 6f 20 52 48 53 20 66 69 65  ields to RHS fie
12760 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  lds */.){.  Sele
12770 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ct *p;          
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12790 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74    /* SELECT to t
127a0 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f  he right of IN o
127b0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
127c0 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20   eType = 0;     
127d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127e0 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48     /* Type of RH
127f0 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45  S table. IN_INDE
12800 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  X_* */.  int iTa
12810 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
12820 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ++;            /
12830 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20  * Cursor of the 
12840 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  RHS table */.  i
12850 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b  nt mustBeUnique;
12860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12870 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
12880 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71  RHS must be uniq
12890 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ue */.  Vdbe *v 
128a0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
128b0 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a  (pParse);     /*
128c0 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   Virtual machine
128d0 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
128e0 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f  .  assert( pX->o
128f0 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75  p==TK_IN );.  mu
12900 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e  stBeUnique = (in
12910 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
12920 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a  _LOOP)!=0;..  /*
12930 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   If the RHS of t
12940 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72  his IN(...) oper
12950 61 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54  ator is a SELECT
12960 2c 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74  , and if it matt
12970 65 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ers .  ** whethe
12980 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c  r or not the SEL
12990 45 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61  ECT result conta
129a0 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  ins NULL values,
129b0 20 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20   check whether. 
129c0 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20   ** or not NULL 
129d0 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73  is actually poss
129e0 69 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74  ible (it may not
129f0 20 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   be, for example
12a00 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e  , due .  ** to N
12a10 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
12a20 6e 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  nts in the schem
12a30 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76  a). If no NULL v
12a40 61 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69 62  alues are possib
12a50 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52  le,.  ** set prR
12a60 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62  hsHasNull to 0 b
12a70 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67  efore continuing
12a80 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68  .  */.  if( prRh
12a90 73 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d  sHasNull && (pX-
12aa0 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
12ab0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e  elect) ){.    in
12ac0 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  t i;.    ExprLis
12ad0 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e  t *pEList = pX->
12ae0 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
12af0 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
12b00 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
12b10 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
12b20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
12b30 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b  eNull(pEList->a[
12b40 69 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65 61  i].pExpr) ) brea
12b50 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
12b60 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70   i==pEList->nExp
12b70 72 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73  r ){.      prRhs
12b80 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  HasNull = 0;.   
12b90 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
12ba0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20  ck to see if an 
12bb0 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
12bc0 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  r index can be u
12bd0 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69  sed to.  ** sati
12be0 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20  sfy the query.  
12bf0 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62  This is preferab
12c00 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67  le to generating
12c10 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68   a new .  ** eph
12c20 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a  emeral table.  *
12c30 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
12c40 6e 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20  nErr==0 && (p = 
12c50 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
12c60 4f 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20  Opt(pX))!=0 ){. 
12c70 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
12c80 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
12c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
12ca0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12cb0 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
12cc0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12ce0 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e  * Table <table>.
12cf0 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b   */.    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 20 20 20 20 20 20 20 20 2f                 /
12d20 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66  * Database idx f
12d30 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45  or pTab */.    E
12d40 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
12d50 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  = p->pEList;.   
12d60 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c   int nExpr = pEL
12d70 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20  ist->nExpr;..   
12d80 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
12d90 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  st!=0 );        
12da0 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
12db0 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
12dc0 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
12dd0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
12de0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  st->a[0].pExpr!=
12df0 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  0 ); /* Because 
12e00 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
12e10 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
12e20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63   assert( p->pSrc
12e30 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
12e40 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
12e50 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
12e60 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
12e70 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
12e80 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20  >a[0].pTab;..   
12e90 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54   /* Code an OP_T
12ea0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f  ransaction and O
12eb0 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
12ec0 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
12ed0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
12ee0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
12ef0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
12f00 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
12f10 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
12f20 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
12f30 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
12f40 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
12f50 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
12f60 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73  zName);..    ass
12f70 65 72 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69  ert(v);  /* sqli
12f80 74 65 33 47 65 74 56 64 62 65 28 29 20 68 61 73  te3GetVdbe() has
12f90 20 61 6c 77 61 79 73 20 62 65 65 6e 20 70 72 65   always been pre
12fa0 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a  viously called *
12fb0 2f 0a 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d  /.    if( nExpr=
12fc0 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b  =1 && pEList->a[
12fd0 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  0].pExpr->iColum
12fe0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  n<0 ){.      /* 
12ff0 54 68 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43  The "x IN (SELEC
13000 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 61 62  T rowid FROM tab
13010 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a 20 20 20  le)" case */.   
13020 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
13030 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
13040 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20  (v, OP_Once);.  
13050 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
13060 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  (v);..      sqli
13070 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
13080 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
13090 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
130a0 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
130b0 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
130c0 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
130d0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
130e0 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73  iAddr);.    }els
130f0 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
13100 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13120 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
13130 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  le */.      int 
13140 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b  affinity_ok = 1;
13150 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  .      int i;.. 
13160 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
13170 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  at the affinity 
13180 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
13190 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63  d to perform eac
131a0 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  h .      ** comp
131b0 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61  arison is the sa
131c0 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69  me as the affini
131d0 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d  ty of each colum
131e0 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20 20 20 20  n in table.     
131f0 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53 20 6f   ** on the RHS o
13200 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
13210 72 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c 20 69  r.  If it not, i
13220 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
13230 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73  e to.      ** us
13240 65 20 61 6e 79 20 69 6e 64 65 78 20 6f 66 20 74  e any index of t
13250 68 65 20 52 48 53 20 74 61 62 6c 65 2e 20 20 2a  he RHS table.  *
13260 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
13270 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69   i<nExpr && affi
13280 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20  nity_ok; i++){. 
13290 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68         Expr *pLh
132a0 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  s = sqlite3Vecto
132b0 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 58  rFieldSubexpr(pX
132c0 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  ->pLeft, i);.   
132d0 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
132e0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
132f0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
13300 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66       char idxaff
13310 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43   = sqlite3TableC
13320 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 54  olumnAffinity(pT
13330 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53  ab,iCol); /* RHS
13340 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
13350 20 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20    char cmpaff = 
13360 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
13370 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78  finity(pLhs, idx
13380 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65  aff);.        te
13390 73 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d  stcase( cmpaff==
133a0 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
133b0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
133c0 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c  ase( cmpaff==SQL
133d0 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a  ITE_AFF_TEXT );.
133e0 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
133f0 63 6d 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20  cmpaff ){.      
13400 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
13410 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20  AFF_BLOB:.      
13420 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13430 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
13440 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20  TE_AFF_TEXT:.   
13450 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
13460 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
13470 74 79 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e  ty() only return
13480 73 20 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69  s TEXT if one si
13490 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20  de or the.      
134a0 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68        ** other h
134b0 61 73 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61  as no affinity a
134c0 6e 64 20 74 68 65 20 6f 74 68 65 72 20 73 69 64  nd the other sid
134d0 65 20 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63  e is TEXT.  Henc
134e0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e,.            *
134f0 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66  * the only way f
13500 6f 72 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20  or cmpaff to be 
13510 54 45 58 54 20 69 73 20 66 6f 72 20 69 64 78 61  TEXT is for idxa
13520 66 66 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20  ff to be TEXT.  
13530 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
13540 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e   for the term on
13550 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
13560 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66  IN to have no af
13570 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20  finity. */.     
13580 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
13590 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  dxaff==SQLITE_AF
135a0 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20  F_TEXT );.      
135b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
135c0 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a         default:.
135d0 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66 69              affi
135e0 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65  nity_ok = sqlite
135f0 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
13600 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20  ty(idxaff);.    
13610 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
13620 20 20 20 20 20 69 66 28 20 61 66 66 69 6e 69 74       if( affinit
13630 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  y_ok ){.        
13640 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
13650 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20   existing index 
13660 74 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66  that will work f
13670 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61  or this IN opera
13680 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  tor */.        f
13690 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
136a0 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54  ndex; pIdx && eT
136b0 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64  ype==0; pIdx=pId
136c0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
136d0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c       Bitmask col
136e0 55 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f  Used;      /* Co
136f0 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
13700 65 78 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20  ex used */.     
13710 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f       Bitmask mCo
13720 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  l;         /* Ma
13730 73 6b 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  sk for the curre
13740 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20  nt column */.   
13750 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
13760 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29  >nColumn<nExpr )
13770 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
13780 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
13790 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32  nColumn is BMS-2
137a0 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20  , not BMS-1, so 
137b0 74 68 61 74 20 77 65 20 63 61 6e 20 63 6f 6d 70  that we can comp
137c0 75 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ute.          **
137d0 20 42 49 54 4d 41 53 4b 28 6e 45 78 70 72 29 20   BITMASK(nExpr) 
137e0 77 69 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77  without overflow
137f0 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ing */.         
13800 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d   testcase( pIdx-
13810 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20  >nColumn==BMS-2 
13820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
13830 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f  tcase( pIdx->nCo
13840 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  lumn==BMS-1 );. 
13850 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
13860 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d  x->nColumn>=BMS-
13870 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  1 ) continue;.  
13880 20 20 20 20 20 20 20 20 69 66 28 20 6d 75 73 74          if( must
13890 42 65 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20  BeUnique ){.    
138a0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
138b0 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a  ->nKeyCol>nExpr.
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28               ||(
138d0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45  pIdx->nColumn>nE
138e0 78 70 72 20 26 26 20 21 49 73 55 6e 69 71 75 65  xpr && !IsUnique
138f0 49 6e 64 65 78 28 70 49 64 78 29 29 0a 20 20 20  Index(pIdx)).   
13900 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
13910 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
13920 75 65 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e 64  ue;  /* This ind
13930 65 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  ex is not unique
13940 20 6f 76 65 72 20 74 68 65 20 49 4e 20 52 48 53   over the IN RHS
13950 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
13960 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13970 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
13980 20 20 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20     colUsed = 0; 
13990 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20    /* Columns of 
139a0 69 6e 64 65 78 20 75 73 65 64 20 73 6f 20 66 61  index used so fa
139b0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66  r */.          f
139c0 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
139d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
139e0 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20     Expr *pLhs = 
139f0 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
13a00 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c  ldSubexpr(pX->pL
13a10 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  eft, i);.       
13a20 20 20 20 20 20 45 78 70 72 20 2a 70 52 68 73 20       Expr *pRhs 
13a30 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
13a40 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
13a50 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20    CollSeq *pReq 
13a60 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
13a70 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
13a80 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73  arse, pLhs, pRhs
13a90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
13aa0 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20  nt j;.  .       
13ab0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
13ac0 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43  q!=0 || pRhs->iC
13ad0 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20  olumn==XN_ROWID 
13ae0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
13af0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
13b00 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b  or(j=0; j<nExpr;
13b10 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
13b20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
13b30 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73  iColumn[j]!=pRhs
13b40 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->iColumn ) cont
13b50 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
13b60 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
13b70 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20  ->azColl[j] );. 
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
13b90 20 70 52 65 71 21 3d 30 20 26 26 20 73 71 6c 69   pReq!=0 && sqli
13ba0 74 65 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d  te3StrICmp(pReq-
13bb0 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a  >zName, pIdx->az
13bc0 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20  Coll[j])!=0 ){. 
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
13be0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
13bf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13c00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13c10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13c20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e          if( j==n
13c30 45 78 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  Expr ) break;.  
13c40 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d            mCol =
13c50 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20   MASKBIT(j);.   
13c60 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 43 6f           if( mCo
13c70 6c 20 26 20 63 6f 6c 55 73 65 64 20 29 20 62 72  l & colUsed ) br
13c80 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c  eak; /* Each col
13c90 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e  umn used only on
13ca0 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ce */.          
13cb0 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f    colUsed |= mCo
13cc0 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  l;.            i
13cd0 66 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61 70  f( aiMap ) aiMap
13ce0 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  [i] = j;.       
13cf0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
13d00 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 45 78    assert( i==nEx
13d10 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28  pr || colUsed!=(
13d20 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31  MASKBIT(nExpr)-1
13d30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
13d40 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53  f( colUsed==(MAS
13d50 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29  KBIT(nExpr)-1) )
13d60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
13d70 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
13d80 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65  s point, that me
13d90 61 6e 73 20 74 68 65 20 69 6e 64 65 78 20 70 49  ans the index pI
13da0 64 78 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a  dx is usable */.
13db0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
13dc0 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  iAddr = sqlite3V
13dd0 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
13de0 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
13df0 61 67 65 28 76 29 3b 0a 23 69 66 6e 64 65 66 20  age(v);.#ifndef 
13e00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
13e10 41 49 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  AIN.            
13e20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13e30 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
13e40 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20   0, 0, 0,.      
13e50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
13e60 50 72 69 6e 74 66 28 64 62 2c 20 22 55 53 49 4e  Printf(db, "USIN
13e70 47 20 49 4e 44 45 58 20 25 73 20 46 4f 52 20 49  G INDEX %s FOR I
13e80 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70 49 64 78  N-OPERATOR",pIdx
13e90 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  ->zName),.      
13ea0 20 20 20 20 20 20 20 20 50 34 5f 44 59 4e 41 4d          P4_DYNAM
13eb0 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  IC);.#endif.    
13ec0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13ed0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13ee0 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20  OpenRead, iTab, 
13ef0 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
13f00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
13f10 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
13f20 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
13f30 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  dx);.           
13f40 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13f50 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
13f60 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
13f70 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44    assert( IN_IND
13f80 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d  EX_INDEX_DESC ==
13f90 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
13fa0 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  ASC+1 );.       
13fb0 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
13fc0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
13fd0 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  + pIdx->aSortOrd
13fe0 65 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20  er[0];.  .      
13ff0 20 20 20 20 20 20 69 66 28 20 70 72 52 68 73 48        if( prRhsH
14000 61 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66  asNull ){.#ifdef
14010 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
14020 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a  OLUMN_USED_MASK.
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 36                i6
14040 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78  4 mask = (1<<nEx
14050 70 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  pr)-1;.         
14060 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14070 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
14080 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20  _ColumnsUsed, . 
14090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140a0 20 69 54 61 62 2c 20 30 2c 20 30 2c 20 28 75 38   iTab, 0, 0, (u8
140b0 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36  *)&mask, P4_INT6
140c0 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  4);.#endif.     
140d0 20 20 20 20 20 20 20 20 20 2a 70 72 52 68 73 48           *prRhsH
140e0 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  asNull = ++pPars
140f0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
14100 20 20 20 20 20 20 20 69 66 28 20 6e 45 78 70 72         if( nExpr
14110 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==1 ){.         
14120 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
14130 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20  tHasNullFlag(v, 
14140 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e  iTab, *prRhsHasN
14150 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
14160 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14170 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
14180 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
14190 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20  ere(v, iAddr);. 
141a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
141b0 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70     } /* End loop
141c0 20 6f 76 65 72 20 69 6e 64 65 78 65 73 20 2a 2f   over indexes */
141d0 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20  .      } /* End 
141e0 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20  if( affinity_ok 
141f0 29 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e  ) */.    } /* En
14200 64 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69  d if not an rowi
14210 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f  d index */.  } /
14220 2a 20 45 6e 64 20 61 74 74 65 6d 70 74 20 74 6f  * End attempt to
14230 20 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e 67 20   optimize using 
14240 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f  an index */..  /
14250 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74  * If no preexist
14260 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76 61  ing index is ava
14270 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49  ilable for the I
14280 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e  N clause.  ** an
14290 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  d IN_INDEX_NOOP 
142a0 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65  is an allowed re
142b0 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ply.  ** and the
142c0 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
142d0 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
142e0 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t, not a subquer
142f0 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52  y.  ** and the R
14300 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  HS is not consta
14310 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72  nt or has two or
14320 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20   fewer terms,.  
14330 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  ** then it is no
14340 74 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67  t worth creating
14350 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
14360 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ble to evaluate.
14370 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72    ** the IN oper
14380 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49  ator so return I
14390 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20  N_INDEX_NOOP..  
143a0 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
143b0 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73  0.   && (inFlags
143c0 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50   & IN_INDEX_NOOP
143d0 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72  _OK).   && !Expr
143e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
143f0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20  EP_xIsSelect).  
14400 20 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52   && (!sqlite3InR
14410 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29  hsIsConstant(pX)
14420 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d   || pX->x.pList-
14430 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a  >nExpr<=2).  ){.
14440 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
14450 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a  NDEX_NOOP;.  }..
14460 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29    if( eType==0 )
14470 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e  {.    /* Could n
14480 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74  ot find an exist
14490 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
144a0 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65  ex to use as the
144b0 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20   RHS b-tree..   
144c0 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65   ** We will have
144d0 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20   to generate an 
144e0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
144f0 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20  to do the job.. 
14500 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61     */.    u32 sa
14510 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  vedNQueryLoop = 
14520 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
14530 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79  op;.    int rMay
14540 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  HaveNull = 0;.  
14550 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
14560 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20  EX_EPH;.    if( 
14570 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44  inFlags & IN_IND
14580 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20  EX_LOOP ){.     
14590 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
145a0 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  oop = 0;.      i
145b0 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43  f( pX->pLeft->iC
145c0 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72  olumn<0 && !Expr
145d0 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
145e0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
145f0 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d  .        eType =
14600 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
14610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
14620 73 65 20 69 66 28 20 70 72 52 68 73 48 61 73 4e  se if( prRhsHasN
14630 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72  ull ){.      *pr
14640 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61  RhsHasNull = rMa
14650 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50  yHaveNull = ++pP
14660 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
14670 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
14680 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
14690 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e  e, pX, rMayHaveN
146a0 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  ull, eType==IN_I
146b0 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20  NDEX_ROWID);.   
146c0 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
146d0 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72  oop = savedNQuer
146e0 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yLoop;.  }else{.
146f0 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d      pX->iTable =
14700 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69 66   iTab;.  }..  if
14710 28 20 61 69 4d 61 70 20 26 26 20 65 54 79 70 65  ( aiMap && eType
14720 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  !=IN_INDEX_INDEX
14730 5f 41 53 43 20 26 26 20 65 54 79 70 65 21 3d 49  _ASC && eType!=I
14740 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
14750 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  SC ){.    int i,
14760 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69   n;.    n = sqli
14770 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
14780 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  e(pX->pLeft);.  
14790 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
147a0 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20  i++) aiMap[i] = 
147b0 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
147c0 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  eType;.}.#endif.
147d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
147e0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
147f0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 45 78  .** Argument pEx
14800 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e  pr is an (?, ?..
14810 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65  .) IN(...) expre
14820 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20  ssion. This .** 
14830 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
14840 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  es and returns a
14850 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
14860 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
14870 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e 69  g .** the affini
14880 74 69 65 73 20 74 6f 20 62 65 20 75 73 65 64 20  ties to be used 
14890 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
148a0 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
148b0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74  n..**.** It is t
148c0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
148d0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
148e0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
148f0 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73  he returned.** s
14900 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74 75 61  tring is eventua
14910 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20  lly freed using 
14920 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
14930 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
14940 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28  *exprINAffinity(
14950 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
14960 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45  xpr *pExpr){.  E
14970 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
14980 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74  pr->pLeft;.  int
14990 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45   nVal = sqlite3E
149a0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
149b0 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a  eft);.  Select *
149c0 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78 70 72  pSelect = (pExpr
149d0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
149e0 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70 72 2d  Select) ? pExpr-
149f0 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a  >x.pSelect : 0;.
14a00 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20    char *zRet;.. 
14a10 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
14a20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a  op==TK_IN );.  z
14a30 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ret = sqlite3DbM
14a40 61 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d  allocRaw(pParse-
14a50 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20  >db, nVal+1);.  
14a60 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20  if( zRet ){.    
14a70 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
14a80 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29  =0; i<nVal; i++)
14a90 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 41  {.      Expr *pA
14aa0 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
14ab0 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65  FieldSubexpr(pLe
14ac0 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 68  ft, i);.      ch
14ad0 61 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45 78  ar a = sqlite3Ex
14ae0 70 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b 0a  prAffinity(pA);.
14af0 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 65 63        if( pSelec
14b00 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  t ){.        zRe
14b10 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f  t[i] = sqlite3Co
14b20 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 53  mpareAffinity(pS
14b30 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
14b40 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20  [i].pExpr, a);. 
14b50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14b60 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b      zRet[i] = a;
14b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14b80 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20     zRet[nVal] = 
14b90 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75  '\0';.  }.  retu
14ba0 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn zRet;.}.#endi
14bb0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
14bc0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
14bd0 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50  /*.** Load the P
14be0 61 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73  arse object pass
14bf0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
14c00 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e  argument with an
14c10 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61   error .** messa
14c20 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ge of the form:.
14c30 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c  **.**   "sub-sel
14c40 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f  ect returns N co
14c50 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64  lumns - expected
14c60 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73   M".*/   .void s
14c70 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
14c80 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  rror(Parse *pPar
14c90 73 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c  se, int nActual,
14ca0 20 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a 20   int nExpect){. 
14cb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
14cc0 74 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74 20  t = "sub-select 
14cd0 72 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d  returns %d colum
14ce0 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 25 64  ns - expected %d
14cf0 22 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  ";.  sqlite3Erro
14d00 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46 6d  rMsg(pParse, zFm
14d10 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70  t, nActual, nExp
14d20 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ect);.}.#endif..
14d30 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e  /*.** Expression
14d40 20 70 45 78 70 72 20 69 73 20 61 20 76 65 63 74   pExpr is a vect
14d50 6f 72 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  or that has been
14d60 20 75 73 65 64 20 69 6e 20 61 20 63 6f 6e 74 65   used in a conte
14d70 78 74 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 69  xt where.** it i
14d80 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
14d90 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 73   If pExpr is a s
14da0 75 62 2d 73 65 6c 65 63 74 20 76 65 63 74 6f 72  ub-select vector
14db0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 0a  , this routine .
14dc0 2a 2a 20 6c 6f 61 64 73 20 74 68 65 20 50 61 72  ** loads the Par
14dd0 73 65 20 6f 62 6a 65 63 74 20 77 69 74 68 20 61  se object with a
14de0 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20   message of the 
14df0 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73  form:.**.**   "s
14e00 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e  ub-select return
14e10 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78  s N columns - ex
14e20 70 65 63 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20  pected 1".**.** 
14e30 4f 72 2c 20 69 66 20 69 74 20 69 73 20 61 20 72  Or, if it is a r
14e40 65 67 75 6c 61 72 20 73 63 61 6c 61 72 20 76 65  egular scalar ve
14e50 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72  ctor:.**.**   "r
14e60 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
14e70 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c  ".*/   .void sql
14e80 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d  ite3VectorErrorM
14e90 73 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sg(Parse *pParse
14ea0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
14eb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14ec0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69  MIT_SUBQUERY.  i
14ed0 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
14ee0 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
14ef0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 75 62  {.    sqlite3Sub
14f00 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  selectError(pPar
14f10 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  se, pExpr->x.pSe
14f20 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
14f30 78 70 72 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  xpr, 1);.  }else
14f40 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
14f50 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14f60 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c  pParse, "row val
14f70 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20  ue misused");.  
14f80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
14f90 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61  ate code for sca
14fa0 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75  lar subqueries u
14fb0 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65 72  sed as a subquer
14fc0 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58  y expression, EX
14fd0 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f  ISTS,.** or IN o
14fe0 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70  perators.  Examp
14ff0 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  les:.**.**     (
15000 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
15010 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62            -- sub
15020 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49  query.**     EXI
15030 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52  STS (SELECT a FR
15040 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54  OM b)   -- EXIST
15050 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  S subquery.**   
15060 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20    x IN (4,5,11) 
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
15080 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
15090 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68   list on right-h
150a0 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20  and side.**     
150b0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46  x IN (SELECT a F
150c0 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e  ROM b)     -- IN
150d0 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73   operator with s
150e0 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72  ubquery on the r
150f0 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ight.**.** The p
15100 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64  Expr parameter d
15110 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70  escribes the exp
15120 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e  ression that con
15130 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20  tains the IN.** 
15140 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71  operator or subq
15150 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  uery..**.** If p
15160 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64  arameter isRowid
15170 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
15180 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  en expression pE
15190 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  xpr is guarantee
151a0 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68  d.** to be of th
151b0 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20  e form "<rowid> 
151c0 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77  IN (?, ?, ?)", w
151d0 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20  here <rowid> is 
151e0 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74  a reference.** t
151f0 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b  o some integer k
15200 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74  ey column of a t
15210 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20  able B-Tree. In 
15220 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61  this case, use a
15230 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72  n.** intkey B-Tr
15240 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ee to store the 
15250 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76  set of IN(...) v
15260 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66  alues instead of
15270 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73   the usual.** (s
15280 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20  lower) variable 
15290 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72  length keys B-Tr
152a0 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61  ee..**.** If rMa
152b0 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e  yHaveNull is non
152c0 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e  -zero, that mean
152d0 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61  s that the opera
152e0 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a  tion is an IN.**
152f0 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f   (not a SELECT o
15300 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74 68  r EXISTS) and th
15310 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68 74  at the RHS might
15320 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e   contains NULLs.
15330 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75  .** All this rou
15340 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69  tine does is ini
15350 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69  tialize the regi
15360 73 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d  ster given by rM
15370 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f  ayHaveNull.** to
15380 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20   NULL.  Calling 
15390 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61  routines will ta
153a0 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67  ke care of chang
153b0 69 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65  ing this registe
153c0 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f  r.** value to no
153d0 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48  n-NULL if the RH
153e0 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a  S is NULL-free..
153f0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45  **.** For a SELE
15400 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  CT or EXISTS ope
15410 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68  rator, return th
15420 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  e register that 
15430 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73  holds the.** res
15440 75 6c 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74  ult.  For a mult
15450 69 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c  i-column SELECT,
15460 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
15470 74 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69  tored in a conti
15480 67 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f  guous.** array o
15490 66 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  f registers and 
154a0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
154b0 20 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72   is the register
154c0 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   of the left-mos
154d0 74 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75  t.** result colu
154e0 6d 6e 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f  mn.  Return 0 fo
154f0 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f  r IN operators o
15500 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
15510 63 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  curs..*/.#ifndef
15520 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
15530 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65  QUERY.int sqlite
15540 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a  3CodeSubselect(.
15550 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
15570 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
15580 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
15590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
155a0 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20   IN, SELECT, or 
155b0 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20  EXISTS operator 
155c0 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c  */.  int rHasNul
155d0 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20  lFlag,       /* 
155e0 52 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65  Register that re
155f0 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55  cords whether NU
15600 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53  LLs exist in RHS
15610 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69   */.  int isRowi
15620 64 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d             /*
15630 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66   If true, LHS of
15640 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
15650 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  a rowid */.){.  
15660 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  int jmpIfDynamic
15670 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
15680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15690 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64  ne-time test add
156a0 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52  ress */.  int rR
156b0 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
156c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156d0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74    /* Register st
156e0 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20  oring resulting 
156f0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
15700 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
15710 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56  arse);.  if( NEV
15720 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
15730 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  n 0;.  sqlite3Ex
15740 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
15750 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65  se);..  /* The e
15760 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  valuation of the
15770 20 49 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45 43   IN/EXISTS/SELEC
15780 54 20 6d 75 73 74 20 62 65 20 72 65 70 65 61 74  T must be repeat
15790 65 64 20 65 76 65 72 79 20 74 69 6d 65 20 69 74  ed every time it
157a0 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74  .  ** is encount
157b0 65 72 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74  ered if any of t
157c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
157d0 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
157e0 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
157f0 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63  hand side is a c
15800 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
15810 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  ry.  **    *  Th
15820 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
15830 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69  e is an expressi
15840 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  on list containi
15850 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  ng variables.  *
15860 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69  *    *  We are i
15870 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a  nside a trigger.
15880 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c    **.  ** If all
15890 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72   of the above ar
158a0 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65  e false, then we
158b0 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f   can run this co
158c0 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a  de just once.  *
158d0 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c  * save the resul
158e0 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68  ts, and reuse th
158f0 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e  e same result on
15900 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f   subsequent invo
15910 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  cations..  */.  
15920 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
15930 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56  erty(pExpr, EP_V
15940 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  arSelect) ){.   
15950 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20   jmpIfDynamic = 
15960 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15970 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
15980 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15990 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
159a0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
159b0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
159c0 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
159d0 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
159e0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
159f0 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54  rse->db, "EXECUT
15a00 45 20 25 73 25 73 20 53 55 42 51 55 45 52 59 20  E %s%s SUBQUERY 
15a10 25 64 22 2c 0a 20 20 20 20 20 20 20 20 6a 6d 70  %d",.        jmp
15a20 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a  IfDynamic>=0?"":
15a30 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a 20  "CORRELATED ",. 
15a40 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
15a50 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22  ==TK_IN?"LIST":"
15a60 53 43 41 4c 41 52 22 2c 0a 20 20 20 20 20 20 20  SCALAR",.       
15a70 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
15a80 6c 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20  lectId.    );.  
15a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15aa0 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
15ab0 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
15ac0 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
15ad0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
15ae0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69   }.#endif..  swi
15af0 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
15b00 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
15b10 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
15b20 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
15b30 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
15b40 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   of OP_OpenEphem
15b50 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
15b60 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
15b70 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
15b80 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53  Left; /* the LHS
15b90 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
15ba0 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79  tor */.      Key
15bb0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
15bc0 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20   0;      /* Key 
15bd0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
15be0 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20       int nVal;  
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c00 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74   /* Size of vect
15c10 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20 20 20  or pLeft */.    
15c20 20 20 0a 20 20 20 20 20 20 6e 56 61 6c 20 3d 20    .      nVal = 
15c30 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
15c40 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20  rSize(pLeft);.  
15c50 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52      assert( !isR
15c60 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20  owid || nVal==1 
15c70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
15c80 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
15c90 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
15ca0 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
15cb0 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
15cc0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
15cd0 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
15ce0 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65   same way.  An e
15cf0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
15d00 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c  s .      ** fill
15d10 65 64 20 77 69 74 68 20 69 6e 64 65 78 20 6b 65  ed with index ke
15d20 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ys representing 
15d30 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
15d40 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 53   the .      ** S
15d50 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78  ELECT or the <ex
15d60 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a  prlist>..      *
15d70 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
15d80 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e  e 'x' expression
15d90 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
15da0 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43  ue, or the SELEC
15db0 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  T....      ** st
15dc0 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
15dd0 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
15de0 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
15df0 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20  y of that.      
15e00 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
15e10 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
15e20 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
15e30 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20  th 'x' and the. 
15e40 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e       ** SELECT..
15e50 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
15e60 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
15e70 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
15e80 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  s used.      ** 
15e90 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e  if either column
15ea0 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20   has NUMERIC or 
15eb0 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79  INTEGER affinity
15ec0 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20  . If neither.   
15ed0 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68     ** 'x' nor th
15ee0 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  e SELECT... stat
15ef0 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
15f00 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
15f10 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a  affinity.      *
15f20 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  * is used..     
15f30 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
15f40 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
15f50 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
15f60 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
15f70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
15f80 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20  penEphemeral, . 
15f90 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
15fa0 69 54 61 62 6c 65 2c 20 28 69 73 52 6f 77 69 64  iTable, (isRowid
15fb0 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20 20 20  ?0:nVal));.     
15fc0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f   pKeyInfo = isRo
15fd0 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  wid ? 0 : sqlite
15fe0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50  3KeyInfoAlloc(pP
15ff0 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20  arse->db, nVal, 
16000 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45  1);..      if( E
16010 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16020 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
16030 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ct) ){.        /
16040 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
16050 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
16060 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .).        **.  
16070 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
16080 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  e code to write 
16090 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
160a0 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74  he select into t
160b0 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
160c0 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c       ** table al
160d0 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
160e0 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
160f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c    */.        Sel
16100 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70  ect *pSelect = p
16110 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
16120 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
16130 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  t *pEList = pSel
16140 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  ect->pEList;..  
16150 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69        assert( !i
16160 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20  sRowid );.      
16170 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20    /* If the LHS 
16180 61 6e 64 20 52 48 53 20 6f 66 20 74 68 65 20 49  and RHS of the I
16190 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f  N operator do no
161a0 74 20 6d 61 74 63 68 2c 20 74 68 61 74 0a 20 20  t match, that.  
161b0 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 77        ** error w
161c0 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61  ill have been ca
161d0 75 67 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65  ught long before
161e0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
161f0 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  oint. */.       
16200 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c 69   if( ALWAYS(pELi
16210 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c 29  st->nExpr==nVal)
16220 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65   ){.          Se
16230 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
16240 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
16250 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16260 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
16270 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20  &dest, SRT_Set, 
16280 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
16290 20 20 20 20 20 20 20 20 20 20 64 65 73 74 2e 7a            dest.z
162a0 41 66 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e  AffSdst = exprIN
162b0 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
162c0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
162d0 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d     pSelect->iLim
162e0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
162f0 20 20 74 65 73 74 63 61 73 65 28 20 70 53 65 6c    testcase( pSel
16300 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
16310 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
16320 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
16330 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29  e( pKeyInfo==0 )
16340 3b 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f  ; /* Caused by O
16350 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79  OM in sqlite3Key
16360 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20  InfoAlloc() */. 
16370 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
16380 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
16390 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73  e, pSelect, &des
163a0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
163b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
163c0 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74  pParse->db, dest
163d0 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20  .zAffSdst);.    
163e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b          sqlite3K
163f0 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
16400 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
16410 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
16420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16430 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16440 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73  (pParse->db, des
16450 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20  t.zAffSdst);.   
16460 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16470 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a  KeyInfo!=0 ); /*
16480 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20   OOM will cause 
16490 65 78 69 74 20 61 66 74 65 72 20 73 71 6c 69 74  exit after sqlit
164a0 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20  e3Select() */.  
164b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
164c0 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
164d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
164e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  EList->nExpr>0 )
164f0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
16500 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
16510 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
16520 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20  eyInfo) );.     
16530 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
16540 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVal; i++){.    
16550 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20          Expr *p 
16560 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
16570 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66  ieldSubexpr(pLef
16580 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
16590 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
165a0 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42  ll[i] = sqlite3B
165b0 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
165c0 53 65 71 28 0a 20 20 20 20 20 20 20 20 20 20 20  Seq(.           
165d0 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 2c 20       pParse, p, 
165e0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
165f0 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  pr.            )
16600 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
16620 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
16630 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  Expr->x.pList!=0
16640 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
16650 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
16660 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
16670 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
16680 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78    ** For each ex
16690 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20  pression, build 
166a0 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f  an index key fro
166b0 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  m the evaluation
166c0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
166d0 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20  store it in the 
166e0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
166f0 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20   If <expr> is a 
16700 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65  column, then use
16710 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
16720 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
16730 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  y when building 
16740 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c  index keys. If <
16750 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20  expr> is not.   
16760 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e       ** a column
16770 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66  , use numeric af
16780 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20  finity..        
16790 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
167a0 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20  affinity;       
167b0 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
167c0 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74   of the LHS of t
167d0 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  he IN */.       
167e0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
167f0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
16800 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
16810 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
16820 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
16830 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69  pItem;.        i
16840 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a  nt r1, r2, r3;..
16850 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
16860 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
16870 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20  finity(pLeft);. 
16880 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69         if( !affi
16890 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nity ){.        
168a0 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c    affinity = SQL
168b0 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
168c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
168d0 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
168e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
168f0 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
16900 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
16910 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20  Info) );.       
16920 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
16930 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[0] = sqlite3E
16940 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
16950 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
16960 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
16970 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
16980 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
16990 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73  sion in <exprlis
169a0 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  t>. */.        r
169b0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
169c0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
169d0 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
169e0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
169f0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
16a00 66 28 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c  f( isRowid ) sql
16a10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16a20 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32  , OP_Null, 0, r2
16a30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
16a40 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  =pList->nExpr, p
16a50 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
16a60 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
16a70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
16a80 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e  r *pE2 = pItem->
16a90 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
16aa0 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a   int iValToIns;.
16ab0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
16ac0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
16ad0 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
16ae0 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65  then we will nee
16af0 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  d to.          *
16b00 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
16b10 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
16b20 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
16b30 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
16b40 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
16b50 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73  de only executes
16b60 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20   once.  Because 
16b70 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61  for a non-consta
16b80 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
16b90 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65  expression we ne
16ba0 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73  ed to rerun this
16bb0 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e   code each time.
16bc0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
16bd0 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49          if( jmpI
16be0 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21  fDynamic>=0 && !
16bf0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
16c00 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
16c10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16c20 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
16c30 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69  p(v, jmpIfDynami
16c40 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  c);.            
16c50 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d  jmpIfDynamic = -
16c60 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  1;.          }..
16c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61            /* Eva
16c80 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
16c90 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20  sion and insert 
16ca0 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  it into the temp
16cb0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
16cc0 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
16cd0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
16ce0 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56  Integer(pE2, &iV
16cf0 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20  alToIns) ){.    
16d00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16d10 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16d20 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72  InsertInt, pExpr
16d30 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56  ->iTable, r2, iV
16d40 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20  alToIns);.      
16d50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16d60 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69         r3 = sqli
16d70 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
16d80 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72  t(pParse, pE2, r
16d90 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
16da0 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20  if( isRowid ){. 
16db0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
16dc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16dd0 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
16de0 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r3,.            
16df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16e10 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
16e20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
16e30 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
16e50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16e60 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
16e70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
16e80 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20  , r3);.         
16e90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16ea0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16eb0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
16ec0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20  MakeRecord, r3, 
16ed0 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79  1, r2, &affinity
16ee0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
16ef0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16f00 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
16f10 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31  ge(pParse, r3, 1
16f20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
16f30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16f40 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
16f50 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
16f60 61 62 6c 65 2c 20 72 32 2c 20 72 33 2c 20 31 29  able, r2, r3, 1)
16f70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
16f80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16f90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
16fa0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16fb0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
16fc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16fd0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
16fe0 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
16ff0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b    }.      if( pK
17000 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
17010 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
17020 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
17030 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c  void *)pKeyInfo,
17040 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
17050 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
17060 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
17070 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
17080 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
17090 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  :.    default: {
170a0 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33  .      /* Case 3
170b0 3a 20 20 20 20 28 53 45 4c 45 43 54 20 2e 2e 2e  :    (SELECT ...
170c0 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20   FROM ...).     
170d0 20 2a 2a 20 20 20 20 20 6f 72 3a 20 20 20 20 45   **     or:    E
170e0 58 49 53 54 53 28 53 45 4c 45 43 54 20 2e 2e 2e  XISTS(SELECT ...
170f0 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20   FROM ...).     
17100 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
17110 20 61 20 53 45 4c 45 43 54 2c 20 67 65 6e 65 72   a SELECT, gener
17120 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20  ate code to put 
17130 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61  the values for a
17140 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  ll columns of.  
17150 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
17160 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72   row into an arr
17170 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
17180 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 69  and return the i
17190 6e 64 65 78 20 6f 66 0a 20 20 20 20 20 20 2a 2a  ndex of.      **
171a0 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
171b0 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ter..      **.  
171c0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
171d0 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69  s an EXISTS, wri
171e0 74 65 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20  te an integer 0 
171f0 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20  (not exists) or 
17200 31 20 28 65 78 69 73 74 73 29 0a 20 20 20 20 20  1 (exists).     
17210 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73   ** into a regis
17220 74 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ter and return t
17230 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d  hat register num
17240 62 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ber..      **.  
17250 20 20 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20 63      ** In both c
17260 61 73 65 73 2c 20 74 68 65 20 71 75 65 72 79 20  ases, the query 
17270 69 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74  is augmented wit
17280 68 20 22 4c 49 4d 49 54 20 31 22 2e 20 20 41 6e  h "LIMIT 1".  An
17290 79 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 65  y .      ** pree
172a0 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 69 73  xisting limit is
172b0 20 64 69 73 63 61 72 64 65 64 20 69 6e 20 70 6c   discarded in pl
172c0 61 63 65 20 6f 66 20 74 68 65 20 6e 65 77 20 4c  ace of the new L
172d0 49 4d 49 54 20 31 2e 0a 20 20 20 20 20 20 2a 2f  IMIT 1..      */
172e0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
172f0 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sel;            
17300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17310 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
17320 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20   to encode */.  
17330 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
17340 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
17350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
17360 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45   to deal with SE
17370 4c 45 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20  LECT result */. 
17380 20 20 20 20 20 69 6e 74 20 6e 52 65 67 3b 20 20       int nReg;  
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
173b0 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
173c0 61 74 65 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65  ate */..      te
173d0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
173e0 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
173f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17400 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
17410 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73  LECT );.      as
17420 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
17430 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45  =TK_EXISTS || pE
17440 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
17450 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
17460 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
17470 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
17480 73 53 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20 20  sSelect) );..   
17490 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d     pSel = pExpr-
174a0 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
174b0 20 20 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e    nReg = pExpr->
174c0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f 20  op==TK_SELECT ? 
174d0 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSel->pEList->nE
174e0 78 70 72 20 3a 20 31 3b 0a 20 20 20 20 20 20 73  xpr : 1;.      s
174f0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
17500 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 70  Init(&dest, 0, p
17510 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a  Parse->nMem+1);.
17520 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
17530 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20  em += nReg;.    
17540 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
17550 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
17560 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
17570 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20   = SRT_Mem;.    
17580 20 20 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d      dest.iSdst =
17590 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
175a0 20 20 20 20 20 20 20 64 65 73 74 2e 6e 53 64 73         dest.nSds
175b0 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20  t = nReg;.      
175c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
175d0 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
175e0 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c  0, dest.iSDParm,
175f0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52   dest.iSDParm+nR
17600 65 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56  eg-1);.        V
17610 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
17620 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65  Init subquery re
17630 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
17640 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65  else{.        de
17650 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45  st.eDest = SRT_E
17660 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73  xists;.        s
17670 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17680 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
17690 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29  0, dest.iSDParm)
176a0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
176b0 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
176c0 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29  EXISTS result"))
176d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
176e0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
176f0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
17700 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20  el->pLimit);.   
17710 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20     pSel->pLimit 
17720 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
17730 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54  oc(pParse->db, T
17740 4b 5f 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20  K_INTEGER,.     
17750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 71               &sq
17770 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
17780 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 53 65  ], 0);.      pSe
17790 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  l->iLimit = 0;. 
177a0 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c       pSel->selFl
177b0 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69  ags &= ~SF_Multi
177c0 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 69 66 28  Value;.      if(
177d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
177e0 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65  Parse, pSel, &de
177f0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  st) ){.        r
17800 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
17810 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20 64 65  .      rReg = de
17820 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
17830 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
17840 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
17850 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
17860 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
17870 0a 0a 20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c  ..  if( rHasNull
17880 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  Flag ){.    sqli
17890 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
178a0 67 28 76 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  g(v, pExpr->iTab
178b0 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  le, rHasNullFlag
178c0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d  );.  }..  if( jm
178d0 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b  pIfDynamic>=0 ){
178e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
178f0 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 49  JumpHere(v, jmpI
17900 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20  fDynamic);.  }. 
17910 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
17920 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a 20  ePop(pParse);.. 
17930 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a   return rReg;.}.
17940 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
17950 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
17960 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
17970 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
17980 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20 69  /*.** Expr pIn i
17990 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70  s an IN(...) exp
179a0 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66 75  ression. This fu
179b0 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 68  nction checks th
179c0 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73  at the .** sub-s
179d0 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48 53  elect on the RHS
179e0 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70 65   of the IN() ope
179f0 72 61 74 6f 72 20 68 61 73 20 74 68 65 20 73 61  rator has the sa
17a00 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  me number of .**
17a10 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65 20   columns as the 
17a20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48  vector on the LH
17a30 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52 48  S. Or, if the RH
17a40 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69 73  S of the IN() is
17a50 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71   not .** a sub-q
17a60 75 65 72 79 2c 20 74 68 61 74 20 74 68 65 20 4c  uery, that the L
17a70 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 20 6f  HS is a vector o
17a80 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74  f size 1..*/.int
17a90 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
17aa0 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72 73  kIN(Parse *pPars
17ab0 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  e, Expr *pIn){. 
17ac0 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20 73   int nVector = s
17ad0 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
17ae0 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29  Size(pIn->pLeft)
17af0 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c  ;.  if( (pIn->fl
17b00 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
17b10 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ct) ){.    if( n
17b20 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70  Vector!=pIn->x.p
17b30 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
17b40 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73  nExpr ){.      s
17b50 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
17b60 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49 6e  rror(pParse, pIn
17b70 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
17b80 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63  ist->nExpr, nVec
17b90 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tor);.      retu
17ba0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rn 1;.    }.  }e
17bb0 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72 21  lse if( nVector!
17bc0 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
17bd0 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28  3VectorErrorMsg(
17be0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65  pParse, pIn->pLe
17bf0 66 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ft);.    return 
17c00 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
17c10 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
17c20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17c30 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
17c40 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
17c50 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69  r an IN expressi
17c60 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  on..**.**      x
17c70 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
17c80 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76  .**      x IN (v
17c90 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e  alue, value, ...
17ca0 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ).**.** The left
17cb0 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29  -hand side (LHS)
17cc0 20 69 73 20 61 20 73 63 61 6c 61 72 20 6f 72 20   is a scalar or 
17cd0 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f  vector expressio
17ce0 6e 2e 20 20 54 68 65 20 0a 2a 2a 20 72 69 67 68  n.  The .** righ
17cf0 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53  t-hand side (RHS
17d00 29 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66  ) is an array of
17d10 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63   zero or more sc
17d20 61 6c 61 72 20 76 61 6c 75 65 73 2c 20 6f 72 20  alar values, or 
17d30 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 2e 20 20  a.** subquery.  
17d40 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20  If the RHS is a 
17d50 73 75 62 71 75 65 72 79 2c 20 74 68 65 20 6e 75  subquery, the nu
17d60 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
17d70 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d  olumns must.** m
17d80 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
17d90 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
17da0 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20  e vector on the 
17db0 4c 48 53 2e 20 20 49 66 20 74 68 65 20 52 48 53  LHS.  If the RHS
17dc0 20 69 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66   is.** a list of
17dd0 20 76 61 6c 75 65 73 2c 20 74 68 65 20 4c 48 53   values, the LHS
17de0 20 6d 75 73 74 20 62 65 20 61 20 73 63 61 6c 61   must be a scala
17df0 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e  r. .**.** The IN
17e00 20 6f 70 65 72 61 74 6f 72 20 69 73 20 74 72 75   operator is tru
17e10 65 20 69 66 20 74 68 65 20 4c 48 53 20 76 61 6c  e if the LHS val
17e20 75 65 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ue is contained 
17e30 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 0a  within the RHS..
17e40 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  ** The result is
17e50 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48   false if the LH
17e60 53 20 69 73 20 64 65 66 69 6e 69 74 65 6c 79 20  S is definitely 
17e70 6e 6f 74 20 69 6e 20 74 68 65 20 52 48 53 2e 20  not in the RHS. 
17e80 20 54 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20   The .** result 
17e90 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  is NULL if the p
17ea0 72 65 73 65 6e 63 65 20 6f 66 20 74 68 65 20 4c  resence of the L
17eb0 48 53 20 69 6e 20 74 68 65 20 52 48 53 20 63 61  HS in the RHS ca
17ec0 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74 65  nnot be .** dete
17ed0 72 6d 69 6e 65 64 20 64 75 65 20 74 6f 20 4e 55  rmined due to NU
17ee0 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  LLs..**.** This 
17ef0 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
17f00 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70  s code that jump
17f10 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65  s to destIfFalse
17f20 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   if the LHS is n
17f30 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64  ot .** contained
17f40 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
17f50 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c    If due to NULL
17f60 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  s we cannot dete
17f70 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53  rmine if the LHS
17f80 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  .** is contained
17f90 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e   in the RHS then
17fa0 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e   jump to destIfN
17fb0 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53  ull.  If the LHS
17fc0 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a   is contained.**
17fd0 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20   within the RHS 
17fe0 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
17ff0 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65  h..**.** See the
18000 20 73 65 70 61 72 61 74 65 20 69 6e 2d 6f 70 65   separate in-ope
18010 72 61 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e  rator.md documen
18020 74 61 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74  tation file in t
18030 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20  he canonical.** 
18040 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74 72  SQLite source tr
18050 65 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ee for additiona
18060 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
18070 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
18080 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
18090 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
180a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
180b0 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
180c0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
180d0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
180e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
180f0 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  e IN expression 
18100 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46  */.  int destIfF
18110 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75  alse,      /* Ju
18120 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69  mp here if LHS i
18130 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
18140 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  in the RHS */.  
18150 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20  int destIfNull  
18160 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
18170 72 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  re if the result
18180 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75  s are unknown du
18190 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b  e to NULLs */.){
181a0 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75  .  int rRhsHasNu
181b0 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69  ll = 0;  /* Regi
181c0 73 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75  ster that is tru
181d0 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e  e if RHS contain
181e0 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f  s NULL values */
181f0 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20  .  int eType;   
18200 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
18210 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   of the RHS */. 
18220 20 69 6e 74 20 72 4c 68 73 3b 20 20 20 20 20 20   int rLhs;      
18230 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
18240 65 72 28 73 29 20 68 6f 6c 64 69 6e 67 20 74 68  er(s) holding th
18250 65 20 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a  e LHS values */.
18260 20 20 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20    int rLhsOrig; 
18270 20 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 76          /* LHS v
18280 61 6c 75 65 73 20 70 72 69 6f 72 20 74 6f 20 72  alues prior to r
18290 65 6f 72 64 65 72 69 6e 67 20 62 79 20 61 69 4d  eordering by aiM
182a0 61 70 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ap[] */.  Vdbe *
182b0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
182c0 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64  /* Statement und
182d0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
182e0 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20  */.  int *aiMap 
182f0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  = 0;       /* Ma
18300 70 20 66 72 6f 6d 20 76 65 63 74 6f 72 20 66 69  p from vector fi
18310 65 6c 64 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c  eld to index col
18320 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  umn */.  char *z
18330 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Aff = 0;       /
18340 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * Affinity strin
18350 67 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  g for comparison
18360 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74  s */.  int nVect
18370 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or;          /* 
18380 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 73 20  Size of vectors 
18390 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72  for this IN oper
183a0 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44  ator */.  int iD
183b0 75 6d 6d 79 3b 20 20 20 20 20 20 20 20 20 20 20  ummy;           
183c0 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61 6d 65 74  /* Dummy paramet
183d0 65 72 20 74 6f 20 65 78 70 72 43 6f 64 65 56 65  er to exprCodeVe
183e0 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70 72  ctor() */.  Expr
183f0 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20   *pLeft;        
18400 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20    /* The LHS of 
18410 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
18420 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
18430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
18440 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
18450 69 6e 74 20 64 65 73 74 53 74 65 70 32 3b 20 20  int destStep2;  
18460 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
18470 6f 20 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c  o jump when NULL
18480 73 20 73 65 65 6e 20 69 6e 20 73 74 65 70 20 32  s seen in step 2
18490 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74   */.  int destSt
184a0 65 70 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53  ep6 = 0;    /* S
184b0 74 61 72 74 20 6f 66 20 63 6f 64 65 20 66 6f 72  tart of code for
184c0 20 53 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74   Step 6 */.  int
184d0 20 61 64 64 72 54 72 75 74 68 4f 70 3b 20 20 20   addrTruthOp;   
184e0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
184f0 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 65 74   opcode that det
18500 65 72 6d 69 6e 65 73 20 74 68 65 20 49 4e 20 69  ermines the IN i
18510 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  s true */.  int 
18520 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20  destNotNull;    
18530 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
18540 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  f a comparison i
18550 73 20 6e 6f 74 20 74 72 75 65 20 69 6e 20 73 74  s not true in st
18560 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ep 6 */.  int ad
18570 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
18580 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 73 74  /* Top of the st
18590 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20  ep-6 loop */ .. 
185a0 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
185b0 70 4c 65 66 74 3b 0a 20 20 69 66 28 20 73 71 6c  pLeft;.  if( sql
185c0 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28  ite3ExprCheckIN(
185d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 20 29  pParse, pExpr) )
185e0 20 72 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20   return;.  zAff 
185f0 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79  = exprINAffinity
18600 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
18610 0a 20 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c  .  nVector = sql
18620 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
18630 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ze(pExpr->pLeft)
18640 3b 0a 20 20 61 69 4d 61 70 20 3d 20 28 69 6e 74  ;.  aiMap = (int
18650 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
18660 63 5a 65 72 6f 28 0a 20 20 20 20 20 20 70 50 61  cZero(.      pPa
18670 72 73 65 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72  rse->db, nVector
18680 2a 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20  *(sizeof(int) + 
18690 73 69 7a 65 6f 66 28 63 68 61 72 29 29 20 2b 20  sizeof(char)) + 
186a0 31 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 50 61  1.  );.  if( pPa
186b0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
186c0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 71 6c  ailed ) goto sql
186d0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f  ite3ExprCodeIN_o
186e0 6f 6d 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  om_error;..  /* 
186f0 41 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75  Attempt to compu
18700 74 65 20 74 68 65 20 52 48 53 2e 20 41 66 74 65  te the RHS. Afte
18710 72 20 74 68 69 73 20 73 74 65 70 2c 20 69 66 20  r this step, if 
18720 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74  anything other t
18730 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45  han.  ** IN_INDE
18740 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e  X_NOOP is return
18750 65 64 2c 20 74 68 65 20 74 61 62 6c 65 20 6f 70  ed, the table op
18760 65 6e 65 64 20 69 74 68 20 63 75 72 73 6f 72 20  ened ith cursor 
18770 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20  pExpr->iTable . 
18780 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
18790 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b   values that mak
187a0 65 20 75 70 20 74 68 65 20 52 48 53 2e 20 49 66  e up the RHS. If
187b0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
187c0 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a  s returned,.  **
187d0 20 74 68 65 20 52 48 53 20 68 61 73 20 6e 6f 74   the RHS has not
187e0 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 2e   yet been coded.
187f0 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73    */.  v = pPars
18800 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
18810 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
18820 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65    /* OOM detecte
18830 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  d prior to this 
18840 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62  routine */.  Vdb
18850 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
18860 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22   "begin IN expr"
18870 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71  ));.  eType = sq
18880 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
18890 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a  (pParse, pExpr,.
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188b0 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f               IN_
188c0 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
188d0 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50   | IN_INDEX_NOOP
188e0 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _OK,.           
188f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18900 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64    destIfFalse==d
18910 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20  estIfNull ? 0 : 
18920 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69  &rRhsHasNull, ai
18930 4d 61 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  Map);..  assert(
18940 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
18950 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65   nVector==1 || e
18960 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45  Type==IN_INDEX_E
18970 50 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  PH.       || eTy
18980 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe==IN_INDEX_IND
18990 45 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65 3d  EX_ASC || eType=
189a0 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
189b0 44 45 53 43 20 0a 20 20 29 3b 0a 23 69 66 64 65  DESC .  );.#ifde
189c0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
189d0 20 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61 74   /* Confirm that
189e0 20 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e   aiMap[] contain
189f0 73 20 6e 56 65 63 74 6f 72 20 69 6e 74 65 67 65  s nVector intege
18a00 72 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  r values between
18a10 20 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63   0 and.  ** nVec
18a20 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28  tor-1. */.  for(
18a30 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
18a40 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c  i++){.    int j,
18a50 20 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e   cnt;.    for(cn
18a60 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72  t=j=0; j<nVector
18a70 3b 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61 70  ; j++) if( aiMap
18a80 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a  [j]==i ) cnt++;.
18a90 20 20 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d      assert( cnt=
18aa0 3d 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  =1 );.  }.#endif
18ab0 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20  ..  /* Code the 
18ac0 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20  LHS, the <expr> 
18ad0 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20  from "<expr> IN 
18ae0 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20 4c  (...)". If the L
18af0 48 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76 65  HS is a .  ** ve
18b00 63 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69 73  ctor, then it is
18b10 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72   stored in an ar
18b20 72 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20 72  ray of nVector r
18b30 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
18b40 67 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20  g .  ** at r1.. 
18b50 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   **.  ** sqlite3
18b60 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d 69  FindInIndex() mi
18b70 67 68 74 20 68 61 76 65 20 72 65 6f 72 64 65 72  ght have reorder
18b80 65 64 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66  ed the fields of
18b90 20 74 68 65 20 4c 48 53 20 76 65 63 74 6f 72 0a   the LHS vector.
18ba0 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65    ** so that the
18bb0 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 20 74   fields are in t
18bc0 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73  he same order as
18bd0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64   an existing ind
18be0 65 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20 61  ex.   The.  ** a
18bf0 69 4d 61 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e  iMap[] array con
18c00 74 61 69 6e 73 20 61 20 6d 61 70 70 69 6e 67 20  tains a mapping 
18c10 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61  from the origina
18c20 6c 20 4c 48 53 20 66 69 65 6c 64 20 6f 72 64 65  l LHS field orde
18c30 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69  r to.  ** the fi
18c40 65 6c 64 20 6f 72 64 65 72 20 74 68 61 74 20 6d  eld order that m
18c50 61 74 63 68 65 73 20 74 68 65 20 52 48 53 20 69  atches the RHS i
18c60 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndex..  */.  sql
18c70 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
18c80 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72 4c 68  h(pParse);.  rLh
18c90 73 4f 72 69 67 20 3d 20 65 78 70 72 43 6f 64 65  sOrig = exprCode
18ca0 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70  Vector(pParse, p
18cb0 4c 65 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a  Left, &iDummy);.
18cc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
18cd0 63 74 6f 72 20 26 26 20 61 69 4d 61 70 5b 69 5d  ctor && aiMap[i]
18ce0 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41  ==i; i++){} /* A
18cf0 72 65 20 4c 48 53 20 66 69 65 6c 64 73 20 72 65  re LHS fields re
18d00 6f 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66  ordered? */.  if
18d10 28 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a  ( i==nVector ){.
18d20 20 20 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64      /* LHS field
18d30 73 20 61 72 65 20 6e 6f 74 20 72 65 6f 72 64 65  s are not reorde
18d40 72 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20  red */.    rLhs 
18d50 3d 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65  = rLhsOrig;.  }e
18d60 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  lse{.    /* Need
18d70 20 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65 20   to reorder the 
18d80 4c 48 53 20 66 69 65 6c 64 73 20 61 63 63 6f 72  LHS fields accor
18d90 64 69 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f  ding to aiMap */
18da0 0a 20 20 20 20 72 4c 68 73 20 3d 20 73 71 6c 69  .    rLhs = sqli
18db0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
18dc0 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72 29  pParse, nVector)
18dd0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
18de0 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
18df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18e00 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
18e10 70 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20  py, rLhsOrig+i, 
18e20 72 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30  rLhs+aiMap[i], 0
18e30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
18e40 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e  /* If sqlite3Fin
18e50 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e  dInIndex() did n
18e60 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  ot find or creat
18e70 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  e an index that 
18e80 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  is.  ** suitable
18e90 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
18ea0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c  the IN operator,
18eb0 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75   then evaluate u
18ec0 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75  sing a.  ** sequ
18ed0 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  ence of comparis
18ee0 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ons..  **.  ** T
18ef0 68 69 73 20 69 73 20 73 74 65 70 20 28 31 29 20  his is step (1) 
18f00 69 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72 61 74  in the in-operat
18f10 6f 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20  or.md optimized 
18f20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a  algorithm..  */.
18f30 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
18f40 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20  INDEX_NOOP ){.  
18f50 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
18f60 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
18f70 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  st;.    CollSeq 
18f80 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
18f90 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
18fa0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
18fb0 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65 6c  );.    int label
18fc0 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Ok = sqlite3Vdbe
18fd0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
18fe0 20 20 69 6e 74 20 72 32 2c 20 72 65 67 54 6f 46    int r2, regToF
18ff0 72 65 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  ree;.    int reg
19000 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  CkNull = 0;.    
19010 69 6e 74 20 69 69 3b 0a 20 20 20 20 61 73 73 65  int ii;.    asse
19020 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
19030 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
19040 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
19050 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 21   if( destIfNull!
19060 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
19070 20 20 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20        regCkNull 
19080 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
19090 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
190a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
190b0 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e  dOp3(v, OP_BitAn
190c0 64 2c 20 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72  d, rLhs, rLhs, r
190d0 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d  egCkNull);.    }
190e0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
190f0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
19100 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20  ii++){.      r2 
19110 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
19120 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
19130 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  ist->a[ii].pExpr
19140 2c 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20  , &regToFree);. 
19150 20 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75       if( regCkNu
19160 6c 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  ll && sqlite3Exp
19170 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74  rCanBeNull(pList
19180 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29  ->a[ii].pExpr) )
19190 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
191a0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
191b0 50 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e  P_BitAnd, regCkN
191c0 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75  ull, r2, regCkNu
191d0 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
191e0 20 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d     if( ii<pList-
191f0 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74  >nExpr-1 || dest
19200 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61  IfNull!=destIfFa
19210 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  lse ){.        s
19220 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
19230 28 76 2c 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c  (v, OP_Eq, rLhs,
19240 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20   labelOk, r2,.  
19250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19260 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
19270 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
19280 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
19290 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3c  overageIf(v, ii<
192a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b  pList->nExpr-1);
192b0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
192c0 65 72 61 67 65 49 66 28 76 2c 20 69 69 3d 3d 70  erageIf(v, ii==p
192d0 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  List->nExpr-1);.
192e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
192f0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a  dbeChangeP5(v, z
19300 41 66 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  Aff[0]);.      }
19310 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
19320 73 65 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c  sert( destIfNull
19330 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b  ==destIfFalse );
19340 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19350 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
19360 5f 4e 65 2c 20 72 4c 68 73 2c 20 64 65 73 74 49  _Ne, rLhs, destI
19370 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20  fFalse, r2,.    
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19390 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f        (void*)pCo
193a0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
193b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
193c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
193d0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
193e0 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54   zAff[0] | SQLIT
193f0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
19400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
19410 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
19420 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f  eg(pParse, regTo
19430 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Free);.    }.   
19440 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29   if( regCkNull )
19450 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
19460 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19470 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c  IsNull, regCkNul
19480 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20  l, destIfNull); 
19490 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
194a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
194b0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66  beGoto(v, destIf
194c0 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  False);.    }.  
194d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
194e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
194f0 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  elOk);.    sqlit
19500 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19510 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75  (pParse, regCkNu
19520 6c 6c 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71  ll);.    goto sq
19530 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
19540 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20  finished;.  }.. 
19550 20 2f 2a 20 53 74 65 70 20 32 3a 20 43 68 65 63   /* Step 2: Chec
19560 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
19570 4c 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  LHS contains any
19580 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20   NULL columns.  
19590 49 66 20 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20  If the.  ** LHS 
195a0 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c  does contain NUL
195b0 4c 73 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  Ls then the resu
195c0 6c 74 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  lt must be eithe
195d0 72 20 46 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e  r FALSE or NULL.
195e0 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68  .  ** We will th
195f0 65 6e 20 73 6b 69 70 20 74 68 65 20 62 69 6e 61  en skip the bina
19600 72 79 20 73 65 61 72 63 68 20 6f 66 20 74 68 65  ry search of the
19610 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   RHS..  */.  if(
19620 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
19630 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
19640 64 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74  destStep2 = dest
19650 49 66 46 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65  IfFalse;.  }else
19660 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70 32 20  {.    destStep2 
19670 3d 20 64 65 73 74 53 74 65 70 36 20 3d 20 73 71  = destStep6 = sq
19680 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
19690 65 6c 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  el(v);.  }.  for
196a0 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
196b0 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
196c0 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  *p = sqlite3Vect
196d0 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
196e0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b  Expr->pLeft, i);
196f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
19700 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29  ExprCanBeNull(p)
19710 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19720 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19730 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69  P_IsNull, rLhs+i
19740 2c 20 64 65 73 74 53 74 65 70 32 29 3b 0a 20 20  , destStep2);.  
19750 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
19760 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  (v);.    }.  }..
19770 20 20 2f 2a 20 53 74 65 70 20 33 2e 20 20 54 68    /* Step 3.  Th
19780 65 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f  e LHS is now kno
19790 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c  wn to be non-NUL
197a0 4c 2e 20 20 44 6f 20 74 68 65 20 62 69 6e 61 72  L.  Do the binar
197b0 79 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66  y search.  ** of
197c0 20 74 68 65 20 52 48 53 20 75 73 69 6e 67 20 74   the RHS using t
197d0 68 65 20 4c 48 53 20 61 73 20 61 20 70 72 6f 62  he LHS as a prob
197e0 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20 74 68  e.  If found, th
197f0 65 20 72 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a  e result is.  **
19800 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   true..  */.  if
19810 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
19820 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f  X_ROWID ){.    /
19830 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
19840 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52  the RHS is the R
19850 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d  OWID of table b-
19860 74 72 65 65 20 61 6e 64 20 73 6f 20 77 65 20 61  tree and so we a
19870 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20  lso.    ** know 
19880 74 68 61 74 20 74 68 65 20 52 48 53 20 69 73 20  that the RHS is 
19890 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65  non-NULL.  Hence
198a0 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20 73 74 65  , we combine ste
198b0 70 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20 2a  ps 3 and 4.    *
198c0 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  * into a single 
198d0 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73  opcode. */.    s
198e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
198f0 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64  (v, OP_SeekRowid
19900 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
19910 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 4c   destIfFalse, rL
19920 68 73 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  hs);.    VdbeCov
19930 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64  erage(v);.    ad
19940 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69  drTruthOp = sqli
19950 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
19960 20 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52   OP_Goto);  /* R
19970 65 74 75 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20  eturn True */.  
19980 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
19990 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
199a0 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 4c 68  OP_Affinity, rLh
199b0 73 2c 20 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a  s, nVector, 0, z
199c0 41 66 66 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  Aff, nVector);. 
199d0 20 20 20 69 66 28 20 64 65 73 74 49 66 46 61 6c     if( destIfFal
199e0 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29  se==destIfNull )
199f0 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69  {.      /* Combi
19a00 6e 65 20 53 74 65 70 20 33 20 61 6e 64 20 53 74  ne Step 3 and St
19a10 65 70 20 35 20 69 6e 74 6f 20 61 20 73 69 6e 67  ep 5 into a sing
19a20 6c 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  le opcode */.   
19a30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19a40 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
19a50 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  tFound, pExpr->i
19a60 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
19a70 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
19a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
19a90 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56  Lhs, nVector); V
19aa0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19ab0 20 20 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74        goto sqlit
19ac0 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
19ad0 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ished;.    }.   
19ae0 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65   /* Ordinary Ste
19af0 70 20 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73  p 3, for the cas
19b00 65 20 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e  e where FALSE an
19b10 64 20 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69  d NULL are disti
19b20 6e 63 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54  nct */.    addrT
19b30 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33  ruthOp = sqlite3
19b40 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
19b50 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
19b60 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 0a 20 20 20  ->iTable, 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 20 20 20 20 20                  
19b90 20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72     rLhs, nVector
19ba0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
19bb0 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  v);.  }..  /* St
19bc0 65 70 20 34 2e 20 20 49 66 20 74 68 65 20 52 48  ep 4.  If the RH
19bd0 53 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65  S is known to be
19be0 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65   non-NULL and we
19bf0 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20   did not find.  
19c00 2a 2a 20 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74  ** an match on t
19c10 68 65 20 73 65 61 72 63 68 20 61 62 6f 76 65 2c  he search above,
19c20 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
19c30 20 6d 75 73 74 20 62 65 20 46 41 4c 53 45 2e 0a   must be FALSE..
19c40 20 20 2a 2f 0a 20 20 69 66 28 20 72 52 68 73 48    */.  if( rRhsH
19c50 61 73 4e 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f  asNull && nVecto
19c60 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==1 ){.    sqli
19c70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19c80 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68   OP_NotNull, rRh
19c90 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66  sHasNull, destIf
19ca0 46 61 6c 73 65 29 3b 0a 20 20 20 20 56 64 62 65  False);.    Vdbe
19cb0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
19cc0 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35 2e 20 20  ..  /* Step 5.  
19cd0 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  If we do not car
19ce0 65 20 61 62 6f 75 74 20 74 68 65 20 64 69 66 66  e about the diff
19cf0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 4e  erence between N
19d00 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c  ULL and.  ** FAL
19d10 53 45 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  SE, then just re
19d20 74 75 72 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a  turn false. .  *
19d30 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 46 61  /.  if( destIfFa
19d40 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
19d50 29 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74  ) sqlite3VdbeGot
19d60 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  o(v, destIfFalse
19d70 29 3b 0a 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a  );..  /* Step 6:
19d80 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 72 6f   Loop through ro
19d90 77 73 20 6f 66 20 74 68 65 20 52 48 53 2e 20 20  ws of the RHS.  
19da0 43 6f 6d 70 61 72 65 20 65 61 63 68 20 72 6f 77  Compare each row
19db0 20 74 6f 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a   to the LHS..  *
19dc0 2a 20 49 66 20 61 6e 79 20 63 6f 6d 70 61 72 69  * If any compari
19dd0 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  son is NULL, the
19de0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
19df0 4e 55 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20  NULL.  If all.  
19e00 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61  ** comparisons a
19e10 72 65 20 46 41 4c 53 45 20 74 68 65 6e 20 74 68  re FALSE then th
19e20 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 69  e final result i
19e30 73 20 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20  s FALSE..  **.  
19e40 2a 2a 20 46 6f 72 20 61 20 73 63 61 6c 61 72 20  ** For a scalar 
19e50 4c 48 53 2c 20 69 74 20 69 73 20 73 75 66 66 69  LHS, it is suffi
19e60 63 69 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a  cient to check j
19e70 75 73 74 20 74 68 65 20 66 69 72 73 74 20 72 6f  ust the first ro
19e80 77 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48  w.  ** of the RH
19e90 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  S..  */.  if( de
19ea0 73 74 53 74 65 70 36 20 29 20 73 71 6c 69 74 65  stStep6 ) sqlite
19eb0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
19ec0 6c 28 76 2c 20 64 65 73 74 53 74 65 70 36 29 3b  l(v, destStep6);
19ed0 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
19ee0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19ef0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78  , OP_Rewind, pEx
19f00 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
19f10 49 66 46 61 6c 73 65 29 3b 0a 20 20 56 64 62 65  IfFalse);.  Vdbe
19f20 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69  Coverage(v);.  i
19f30 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a  f( nVector>1 ){.
19f40 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20      destNotNull 
19f50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19f60 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 65 6c  eLabel(v);.  }el
19f70 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e  se{.    /* For n
19f80 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69  Vector==1, combi
19f90 6e 65 20 73 74 65 70 73 20 36 20 61 6e 64 20 37  ne steps 6 and 7
19fa0 20 62 79 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   by immediately 
19fb0 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a  returning.    **
19fc0 20 46 41 4c 53 45 20 69 66 20 74 68 65 20 66 69   FALSE if the fi
19fd0 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  rst comparison i
19fe0 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20  s not NULL */.  
19ff0 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20    destNotNull = 
1a000 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d  destIfFalse;.  }
1a010 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
1a020 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
1a030 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f   Expr *p;.    Co
1a040 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
1a050 20 20 69 6e 74 20 72 33 20 3d 20 73 71 6c 69 74    int r3 = sqlit
1a060 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
1a070 72 73 65 29 3b 0a 20 20 20 20 70 20 3d 20 73 71  rse);.    p = sq
1a080 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
1a090 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69  Subexpr(pLeft, i
1a0a0 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  );.    pColl = s
1a0b0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1a0c0 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
1a0d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a0e0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
1a0f0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
1a100 20 69 2c 20 72 33 29 3b 0a 20 20 20 20 73 71 6c   i, r3);.    sql
1a110 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1a120 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c  , OP_Ne, rLhs+i,
1a130 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33   destNotNull, r3
1a140 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a150 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
1a160 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
1a170 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1a180 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1a190 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1a1a0 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20  g(pParse, r3);. 
1a1b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1a1c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1a1d0 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c  o, 0, destIfNull
1a1e0 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72  );.  if( nVector
1a1f0 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >1 ){.    sqlite
1a200 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1a210 6c 28 76 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  l(v, destNotNull
1a220 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1a230 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1a240 65 78 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ext, pExpr->iTab
1a250 6c 65 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a  le, addrTop+1);.
1a260 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a270 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65  (v);..    /* Ste
1a280 70 20 37 3a 20 20 49 66 20 77 65 20 72 65 61 63  p 7:  If we reac
1a290 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65  h this point, we
1a2a0 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 72   know that the r
1a2b0 65 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a  esult must.    *
1a2c0 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20  * be false. */. 
1a2d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a2e0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1a2f0 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29   0, destIfFalse)
1a300 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  ;.  }..  /* Jump
1a310 73 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20  s here in order 
1a320 74 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20  to return true. 
1a330 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1a340 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1a350 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74  TruthOp);..sqlit
1a360 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
1a370 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c 68  ished:.  if( rLh
1a380 73 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73 71  s!=rLhsOrig ) sq
1a390 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a3a0 52 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68 73  Reg(pParse, rLhs
1a3b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1a3c0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
1a3d0 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
1a3e0 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72  (v, "end IN expr
1a3f0 22 29 29 3b 0a 73 71 6c 69 74 65 33 45 78 70 72  "));.sqlite3Expr
1a400 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72  CodeIN_oom_error
1a410 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
1a420 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69  e(pParse->db, ai
1a430 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Map);.  sqlite3D
1a440 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
1a450 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69  , zAff);.}.#endi
1a460 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1a470 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
1a480 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a490 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
1a4a0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1a4b0 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
1a4c0 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
1a4d0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
1a4e0 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  ** value describ
1a4f0 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  ed by z[0..n-1] 
1a500 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
1a510 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
1a520 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
1a530 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
1a540 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
1a550 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
1a560 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
1a570 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
1a580 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
1a590 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
1a5a0 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
1a5b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
1a5c0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1a5d0 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65  id codeReal(Vdbe
1a5e0 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
1a5f0 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c  *z, int negateFl
1a600 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
1a610 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30   if( ALWAYS(z!=0
1a620 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ) ){.    double 
1a630 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  value;.    sqlit
1a640 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65  e3AtoF(z, &value
1a650 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
1a660 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  0(z), SQLITE_UTF
1a670 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  8);.    assert( 
1a680 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61  !sqlite3IsNaN(va
1a690 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e  lue) ); /* The n
1a6a0 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65  ew AtoF never re
1a6b0 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20  turns NaN */.   
1a6c0 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20   if( negateFlag 
1a6d0 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
1a6e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a6f0 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
1a700 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c  P_Real, 0, iMem,
1a710 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c   0, (u8*)&value,
1a720 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d   P4_REAL);.  }.}
1a730 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1a740 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
1a750 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
1a760 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65  l put the intege
1a770 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a  r describe by.**
1a780 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20   text z[0..n-1] 
1a790 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
1a7a0 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75  em..**.** Expr.u
1a7b0 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79  .zToken is alway
1a7c0 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d  s UTF8 and zero-
1a7d0 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73  terminated..*/.s
1a7e0 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
1a7f0 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50  nteger(Parse *pP
1a800 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1a810 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20  r, int negFlag, 
1a820 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62  int iMem){.  Vdb
1a830 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1a840 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70  Vdbe;.  if( pExp
1a850 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
1a860 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  tValue ){.    in
1a870 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69  t i = pExpr->u.i
1a880 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72  Value;.    asser
1a890 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69  t( i>=0 );.    i
1a8a0 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d  f( negFlag ) i =
1a8b0 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -i;.    sqlite3
1a8c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a8d0 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65  _Integer, i, iMe
1a8e0 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
1a8f0 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20   int c;.    i64 
1a900 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74  value;.    const
1a910 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72   char *z = pExpr
1a920 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1a930 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
1a940 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44      c = sqlite3D
1a950 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20  ecOrHexToI64(z, 
1a960 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28  &value);.    if(
1a970 20 63 3d 3d 31 20 7c 7c 20 28 63 3d 3d 32 20 26   c==1 || (c==2 &
1a980 26 20 21 6e 65 67 46 6c 61 67 29 20 7c 7c 20 28  & !negFlag) || (
1a990 6e 65 67 46 6c 61 67 20 26 26 20 76 61 6c 75 65  negFlag && value
1a9a0 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ==SMALLEST_INT64
1a9b0 29 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  )){.#ifdef SQLIT
1a9c0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1a9d0 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69  POINT.      sqli
1a9e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1a9f0 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69  se, "oversized i
1aa00 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e  nteger: %s%s", n
1aa10 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22  egFlag ? "-" : "
1aa20 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66  ", z);.#else.#if
1aa30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1aa40 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20  _HEX_INTEGER.   
1aa50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
1aa60 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32  trnicmp(z,"0x",2
1aa70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1aa80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1aa90 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74  pParse, "hex lit
1aaa0 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73  eral too big: %s
1aab0 25 73 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22  %s", negFlag?"-"
1aac0 3a 22 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65  :"",z);.      }e
1aad0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
1aae0 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52   {.        codeR
1aaf0 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61  eal(v, z, negFla
1ab00 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  g, iMem);.      
1ab10 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
1ab20 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  se{.      if( ne
1ab30 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d  gFlag ){ value =
1ab40 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54   c==2 ? SMALLEST
1ab50 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b  _INT64 : -value;
1ab60 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1ab70 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
1ab80 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69  , OP_Int64, 0, i
1ab90 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61  Mem, 0, (u8*)&va
1aba0 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  lue, P4_INT64);.
1abb0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1abc0 2a 2a 20 45 72 61 73 65 20 63 6f 6c 75 6d 6e 2d  ** Erase column-
1abd0 63 61 63 68 65 20 65 6e 74 72 79 20 6e 75 6d 62  cache entry numb
1abe0 65 72 20 69 0a 2a 2f 0a 73 74 61 74 69 63 20 76  er i.*/.static v
1abf0 6f 69 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c  oid cacheEntryCl
1ac00 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ear(Parse *pPars
1ac10 65 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 66 28  e, int i){.  if(
1ac20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
1ac30 68 65 5b 69 5d 2e 74 65 6d 70 52 65 67 20 29 7b  he[i].tempReg ){
1ac40 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1ac50 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
1ac60 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
1ac70 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70  pReg) ){.      p
1ac80 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
1ac90 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
1aca0 2b 2b 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43  ++] = pParse->aC
1acb0 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b  olCache[i].iReg;
1acc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61  .    }.  }.  pPa
1acd0 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 2d  rse->nColCache--
1ace0 3b 0a 20 20 69 66 28 20 69 3c 70 50 61 72 73 65  ;.  if( i<pParse
1acf0 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20  ->nColCache ){. 
1ad00 20 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43     pParse->aColC
1ad10 61 63 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65  ache[i] = pParse
1ad20 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72  ->aColCache[pPar
1ad30 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a  se->nColCache];.
1ad40 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65    }.}.../*.** Re
1ad50 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  cord in the colu
1ad60 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20 61 20  mn cache that a 
1ad70 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d  particular colum
1ad80 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74  n from a.** part
1ad90 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20  icular table is 
1ada0 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74  stored in a part
1adb0 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e  icular register.
1adc0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1add0 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 50  ExprCacheStore(P
1ade0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1adf0 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c  t iTab, int iCol
1ae00 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
1ae10 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c  nt i;.  int minL
1ae20 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75  ru;.  int idxLru
1ae30 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
1ae40 61 63 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55  ache *p;..  /* U
1ae50 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68  nless an error h
1ae60 61 73 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67  as occurred, reg
1ae70 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72  ister numbers ar
1ae80 65 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76  e always positiv
1ae90 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
1aea0 69 52 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65  iReg>0 || pParse
1aeb0 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65  ->nErr || pParse
1aec0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1aed0 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ed );.  assert( 
1aee0 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c  iCol>=-1 && iCol
1aef0 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69  <32768 );  /* Fi
1af00 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  nite column numb
1af10 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ers */..  /* The
1af20 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61   SQLITE_ColumnCa
1af30 63 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65  che flag disable
1af40 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  s the column cac
1af50 68 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  he.  This is use
1af60 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69  d.  ** for testi
1af70 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72  ng only - to ver
1af80 69 66 79 20 74 68 61 74 20 53 51 4c 69 74 65 20  ify that SQLite 
1af90 61 6c 77 61 79 73 20 67 65 74 73 20 74 68 65 20  always gets the 
1afa0 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a  same answer.  **
1afb0 20 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75   with and withou
1afc0 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  t the column cac
1afd0 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f  he..  */.  if( O
1afe0 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
1aff0 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  led(pParse->db, 
1b000 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63  SQLITE_ColumnCac
1b010 68 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  he) ) return;.. 
1b020 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63   /* First replac
1b030 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65  e any existing e
1b040 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ntry..  **.  ** 
1b050 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61  Actually, the wa
1b060 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  y the column cac
1b070 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  he is currently 
1b080 75 73 65 64 2c 20 77 65 20 61 72 65 20 67 75 61  used, we are gua
1b090 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61  ranteed.  ** tha
1b0a0 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c  t the object wil
1b0b0 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20  l never already 
1b0c0 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65  be in cache.  Ve
1b0d0 72 69 66 79 20 74 68 69 73 20 67 75 61 72 61 6e  rify this guaran
1b0e0 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  tee..  */.#ifnde
1b0f0 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69  f NDEBUG.  for(i
1b100 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
1b110 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73  olCache; i<pPars
1b120 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
1b130 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73  +, p++){.    ass
1b140 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d  ert( p->iTable!=
1b150 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75  iTab || p->iColu
1b160 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a  mn!=iCol );.  }.
1b170 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1b180 74 68 65 20 63 61 63 68 65 20 69 73 20 61 6c 72  the cache is alr
1b190 65 61 64 79 20 66 75 6c 6c 2c 20 64 65 6c 65 74  eady full, delet
1b1a0 65 20 74 68 65 20 6c 65 61 73 74 20 72 65 63 65  e the least rece
1b1b0 6e 74 6c 79 20 75 73 65 64 20 65 6e 74 72 79 20  ntly used entry 
1b1c0 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
1b1d0 3e 6e 43 6f 6c 43 61 63 68 65 3e 3d 53 51 4c 49  >nColCache>=SQLI
1b1e0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 20 29 7b  TE_N_COLCACHE ){
1b1f0 0a 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78  .    minLru = 0x
1b200 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 69 64  7fffffff;.    id
1b210 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 20 20 66  xLru = -1;.    f
1b220 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
1b230 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
1b240 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
1b250 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
1b260 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69     if( p->lru<mi
1b270 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 20 20  nLru ){.        
1b280 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20  idxLru = i;.    
1b290 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e      minLru = p->
1b2a0 6c 72 75 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lru;.      }.   
1b2b0 20 7d 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72   }.    p = &pPar
1b2c0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64  se->aColCache[id
1b2d0 78 4c 72 75 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xLru];.  }else{.
1b2e0 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
1b2f0 3e 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73  >aColCache[pPars
1b300 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 5d 3b  e->nColCache++];
1b310 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74  .  }..  /* Add t
1b320 68 65 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20  he new entry to 
1b330 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63  the end of the c
1b340 61 63 68 65 20 2a 2f 0a 20 20 70 2d 3e 69 4c 65  ache */.  p->iLe
1b350 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
1b360 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 70 2d 3e  acheLevel;.  p->
1b370 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
1b380 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
1b390 6f 6c 3b 0a 20 20 70 2d 3e 69 52 65 67 20 3d 20  ol;.  p->iReg = 
1b3a0 69 52 65 67 3b 0a 20 20 70 2d 3e 74 65 6d 70 52  iReg;.  p->tempR
1b3b0 65 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 6c 72 75  eg = 0;.  p->lru
1b3c0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
1b3d0 65 43 6e 74 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eCnt++;.}../*.**
1b3e0 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72   Indicate that r
1b3f0 65 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e  egisters between
1b400 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67   iReg..iReg+nReg
1b410 2d 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65  -1 are being ove
1b420 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72  rwritten..** Pur
1b430 67 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20  ge the range of 
1b440 72 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74  registers from t
1b450 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
1b460 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b470 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
1b480 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1b490 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65  nt iReg, int nRe
1b4a0 67 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  g){.  int i = 0;
1b4b0 0a 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72  .  while( i<pPar
1b4c0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b  se->nColCache ){
1b4d0 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c  .    struct yCol
1b4e0 43 61 63 68 65 20 2a 70 20 3d 20 26 70 50 61 72  Cache *p = &pPar
1b4f0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
1b500 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  ;.    if( p->iRe
1b510 67 20 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e  g >= iReg && p->
1b520 69 52 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67  iReg < iReg+nReg
1b530 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
1b540 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
1b550 2c 20 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , i);.    }else{
1b560 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
1b570 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
1b580 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72  emember the curr
1b590 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  ent column cache
1b5a0 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e   context.  Any n
1b5b0 65 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64  ew entries added
1b5c0 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65  .** added to the
1b5d0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66   column cache af
1b5e0 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72  ter this call ar
1b5f0 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74  e removed when t
1b600 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
1b610 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a  ing pop occurs..
1b620 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1b630 78 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72  xprCachePush(Par
1b640 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
1b650 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1b660 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c  el++;.#ifdef SQL
1b670 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
1b680 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
1b690 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
1b6a0 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
1b6b0 20 70 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f   printf("PUSH to
1b6c0 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e   %d\n", pParse->
1b6d0 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20  iCacheLevel);.  
1b6e0 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
1b6f0 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68  * Remove from th
1b700 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61  e column cache a
1b710 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ny entries that 
1b720 77 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65  were added since
1b730 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76   the.** the prev
1b740 69 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70 72  ious sqlite3Expr
1b750 43 61 63 68 65 50 75 73 68 20 6f 70 65 72 61 74  CachePush operat
1b760 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
1b770 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a  ords, restore.**
1b780 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68   the cache to th
1b790 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
1b7a0 6e 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74  n prior the most
1b7b0 20 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f   recent Push..*/
1b7c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1b7d0 72 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20  rCachePop(Parse 
1b7e0 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
1b7f0 69 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  i = 0;.  assert(
1b800 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1b810 65 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61  evel>=1 );.  pPa
1b820 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1b830 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  --;.#ifdef SQLIT
1b840 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
1b850 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
1b860 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
1b870 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70  opTrace ){.    p
1b880 72 69 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25  rintf("POP  to %
1b890 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43  d\n", pParse->iC
1b8a0 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a  acheLevel);.  }.
1b8b0 23 65 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 20  #endif.  while( 
1b8c0 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
1b8d0 63 68 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  che ){.    if( p
1b8e0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1b8f0 5b 69 5d 2e 69 4c 65 76 65 6c 3e 70 50 61 72 73  [i].iLevel>pPars
1b900 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29  e->iCacheLevel )
1b910 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
1b920 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
1b930 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i);.    }else{. 
1b940 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a       i++;.    }.
1b950 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
1b960 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d  n a cached colum
1b970 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b  n is reused, mak
1b980 65 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20  e sure that its 
1b990 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e  register is.** n
1b9a0 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62  o longer availab
1b9b0 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67  le as a temp reg
1b9c0 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23  ister.  ticket #
1b9d0 33 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65  3879:  that same
1b9e0 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67  .** register mig
1b9f0 68 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ht be in the cac
1ba00 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70  he in multiple p
1ba10 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72  laces, so be sur
1ba20 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d  e to.** get them
1ba30 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   all..*/.static 
1ba40 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1ba50 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
1ba60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ba70 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
1ba80 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1ba90 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
1baa0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1bab0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61  aColCache; i<pPa
1bac0 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
1bad0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
1bae0 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
1baf0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d   ){.      p->tem
1bb00 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
1bb10 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61    }.}../* Genera
1bb20 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1bb30 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69  l load into regi
1bb40 73 74 65 72 20 72 65 67 4f 75 74 20 61 20 76 61  ster regOut a va
1bb50 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61  lue that is.** a
1bb60 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
1bb70 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f  he iIdxCol-th co
1bb80 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
1bb90 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  dx..*/.void sqli
1bba0 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49  te3ExprCodeLoadI
1bbb0 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  ndexColumn(.  Pa
1bbc0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a  rse *pParse,  /*
1bbd0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1bbe0 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
1bbf0 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65  *pIdx,    /* The
1bc00 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c   index whose col
1bc10 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61  umn is to be loa
1bc20 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ded */.  int iTa
1bc30 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73  bCur,    /* Curs
1bc40 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  or pointing to a
1bc50 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20   table row */.  
1bc60 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20  int iIdxCol,    
1bc70 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  /* The column of
1bc80 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   the index to be
1bc90 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74   loaded */.  int
1bca0 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20   regOut      /* 
1bcb0 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20  Store the index 
1bcc0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
1bcd0 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
1bce0 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f  .){.  i16 iTabCo
1bcf0 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
1bd00 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69  mn[iIdxCol];.  i
1bd10 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45  f( iTabCol==XN_E
1bd20 58 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72  XPR ){.    asser
1bd30 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  t( pIdx->aColExp
1bd40 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
1bd50 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
1bd60 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29  >nExpr>iIdxCol )
1bd70 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53  ;.    pParse->iS
1bd80 65 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75 72  elfTab = iTabCur
1bd90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1bda0 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65  rCodeCopy(pParse
1bdb0 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  , pIdx->aColExpr
1bdc0 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78  ->a[iIdxCol].pEx
1bdd0 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  pr, regOut);.  }
1bde0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1bdf0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1be00 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65  mnOfTable(pParse
1be10 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70  ->pVdbe, pIdx->p
1be20 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a  Table, iTabCur,.
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 20 20 20 20                  
1be50 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67      iTabCol, reg
1be60 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
1be70 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1be80 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   to extract the 
1be90 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f  value of the iCo
1bea0 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  l-th column of a
1beb0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   table..*/.void 
1bec0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1bed0 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
1bee0 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
1bef0 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75     /* The VDBE u
1bf00 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1bf10 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  n */.  Table *pT
1bf20 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ab,    /* The ta
1bf30 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
1bf40 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  he value */.  in
1bf50 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a  t iTabCur,    /*
1bf60 20 54 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   The table curso
1bf70 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75  r.  Or the PK cu
1bf80 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54  rsor for WITHOUT
1bf90 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20   ROWID */.  int 
1bfa0 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49  iCol,       /* I
1bfb0 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
1bfc0 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f  mn to extract */
1bfd0 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20  .  int regOut   
1bfe0 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
1bff0 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69  e value into thi
1c000 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
1c010 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
1c020 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1c030 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
1c040 6c 75 6d 6e 2c 20 69 54 61 62 43 75 72 2c 20 69  lumn, iTabCur, i
1c050 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1c060 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1c070 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43  if( iCol<0 || iC
1c080 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  ol==pTab->iPKey 
1c090 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1c0a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
1c0b0 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72  owid, iTabCur, r
1c0c0 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  egOut);.  }else{
1c0d0 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73  .    int op = Is
1c0e0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20  Virtual(pTab) ? 
1c0f0 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f  OP_VColumn : OP_
1c100 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20  Column;.    int 
1c110 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66  x = iCol;.    if
1c120 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
1c130 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  ) && !IsVirtual(
1c140 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 78  pTab) ){.      x
1c150 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
1c160 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33 50  OfIndex(sqlite3P
1c170 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
1c180 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Tab), iCol);.   
1c190 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1c1a0 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
1c1b0 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67 4f  iTabCur, x, regO
1c1c0 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ut);.  }.  if( i
1c1d0 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  Col>=0 ){.    sq
1c1e0 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75  lite3ColumnDefau
1c1f0 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c  lt(v, pTab, iCol
1c200 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d  , regOut);.  }.}
1c210 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1c220 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1c230 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c  extract the iCol
1c240 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72  umn-th column fr
1c250 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62  om.** table pTab
1c260 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63   and store the c
1c270 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61  olumn value in a
1c280 20 72 65 67 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a   register. .**.*
1c290 2a 20 41 6e 20 65 66 66 6f 72 74 20 69 73 20 6d  * An effort is m
1c2a0 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ade to store the
1c2b0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
1c2c0 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 20   register iReg. 
1c2d0 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20   This.** is not 
1c2e0 67 61 72 61 6e 74 65 65 65 64 20 66 6f 72 20 47  garanteeed for G
1c2f0 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20 74 68 65  etColumn() - the
1c300 20 72 65 73 75 6c 74 20 63 61 6e 20 62 65 20 73   result can be s
1c310 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61 6e 79 20  tored in.** any 
1c320 72 65 67 69 73 74 65 72 2e 20 20 42 75 74 20 74  register.  But t
1c330 68 65 20 72 65 73 75 6c 74 20 69 73 20 67 75 61  he result is gua
1c340 72 61 6e 74 65 65 64 20 74 6f 20 6c 61 6e 64 20  ranteed to land 
1c350 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
1c360 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d  .** for GetColum
1c370 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20  nToReg()..**.** 
1c380 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
1c390 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20   open cursor to 
1c3a0 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77  pTab in iTable w
1c3b0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1c3c0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  .** is called.  
1c3d0 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65  If iColumn<0 the
1c3e0 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  n code is genera
1c3f0 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63 74  ted that extract
1c400 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a  s the rowid..*/.
1c410 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1c420 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20  odeGetColumn(.  
1c430 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1c440 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
1c450 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
1c460 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
1c470 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a  le *pTab,     /*
1c480 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1c490 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
1c4a0 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f   reading from */
1c4b0 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
1c4c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1c4d0 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
1c4e0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1c4f0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ,      /* The cu
1c500 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
1c510 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
1c520 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20  int iReg,       
1c530 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
1c540 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70  s here */.  u8 p
1c550 35 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  5            /* 
1c560 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P5 value for OP_
1c570 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a  Column + FLAGS *
1c580 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
1c590 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1c5a0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1c5b0 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
1c5c0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
1c5d0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1c5e0 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
1c5f0 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ache; i++, p++){
1c600 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
1c610 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d  le==iTable && p-
1c620 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  >iColumn==iColum
1c630 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72  n ){.      p->lr
1c640 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  u = pParse->iCac
1c650 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  heCnt++;.      s
1c660 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1c670 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72 73  inRegister(pPars
1c680 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20  e, p->iReg);.   
1c690 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65     return p->iRe
1c6a0 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20  g;.    }.  }  . 
1c6b0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
1c6c0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
1c6d0 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
1c6e0 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62  le(v, pTab, iTab
1c6f0 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
1c700 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a  g);.  if( p5 ){.
1c710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1c720 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a  hangeP5(v, p5);.
1c730 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20    }else{   .    
1c740 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1c750 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54  Store(pParse, iT
1c760 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
1c770 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Reg);.  }.  retu
1c780 72 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20  rn iReg;.}.void 
1c790 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1c7a0 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20  etColumnToReg(. 
1c7b0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1c7c0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1c7d0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1c7e0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
1c7f0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
1c800 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1c810 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
1c820 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
1c830 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
1c840 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1c850 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
1c860 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
1c870 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
1c880 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1c890 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
1c8a0 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20   int iReg       
1c8b0 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
1c8c0 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
1c8d0 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
1c8e0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1c8f0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
1c900 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c  iColumn, iTable,
1c910 20 69 52 65 67 2c 20 30 29 3b 0a 20 20 69 66 28   iReg, 0);.  if(
1c920 20 72 31 21 3d 69 52 65 67 20 29 20 73 71 6c 69   r1!=iReg ) sqli
1c930 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
1c940 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1c950 53 43 6f 70 79 2c 20 72 31 2c 20 69 52 65 67 29  SCopy, r1, iReg)
1c960 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}.../*.** Clea
1c970 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63  r all column cac
1c980 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76  he entries..*/.v
1c990 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1c9a0 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20  acheClear(Parse 
1c9b0 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
1c9c0 69 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  i;..#ifdef SQLIT
1c9d0 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
1c9e0 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
1c9f0 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
1ca00 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70  opTrace ){.    p
1ca10 72 69 6e 74 66 28 22 43 4c 45 41 52 5c 6e 22 29  rintf("CLEAR\n")
1ca20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66  ;.  }.#endif.  f
1ca30 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
1ca40 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
1ca50 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
1ca60 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
1ca70 74 65 6d 70 52 65 67 0a 20 20 20 20 20 26 26 20  tempReg.     && 
1ca80 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
1ca90 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
1caa0 65 2d 3e 61 54 65 6d 70 52 65 67 29 0a 20 20 20  e->aTempReg).   
1cab0 20 29 7b 0a 20 20 20 20 20 20 20 70 50 61 72 73   ){.       pPars
1cac0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
1cad0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
1cae0 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  = pParse->aColCa
1caf0 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20  che[i].iReg;.   
1cb00 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d   }.  }.  pParse-
1cb10 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a  >nColCache = 0;.
1cb20 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
1cb30 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e  the fact that an
1cb40 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65   affinity change
1cb50 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e   has occurred on
1cb60 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73   iCount.** regis
1cb70 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69  ters starting wi
1cb80 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f  th iStart..*/.vo
1cb90 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1cba0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1cbb0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1cbc0 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74   int iStart, int
1cbd0 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69   iCount){.  sqli
1cbe0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
1cbf0 76 65 28 70 50 61 72 73 65 2c 20 69 53 74 61 72  ve(pParse, iStar
1cc00 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f  t, iCount);.}../
1cc10 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1cc20 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65  de to move conte
1cc30 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  nt from register
1cc40 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b  s iFrom...iFrom+
1cc50 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74  nReg-1.** over t
1cc60 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d  o iTo..iTo+nReg-
1cc70 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75  1. Keep the colu
1cc80 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64  mn cache up-to-d
1cc90 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ate..*/.void sql
1cca0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
1ccb0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ccc0 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
1ccd0 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  To, int nReg){. 
1cce0 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d   assert( iFrom>=
1ccf0 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f  iTo+nReg || iFro
1cd00 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20  m+nReg<=iTo );. 
1cd10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cd20 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p3(pParse->pVdbe
1cd30 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d  , OP_Move, iFrom
1cd40 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20  , iTo, nReg);.  
1cd50 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1cd60 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
1cd70 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a  From, nReg);.}..
1cd80 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1cd90 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
1cda0 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
1cdb0 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  RAGE_TEST)./*.**
1cdc0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1cdd0 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20  any register in 
1cde0 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e  the range iFrom.
1cdf0 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29  .iTo (inclusive)
1ce00 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70  .** is used as p
1ce10 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  art of the colum
1ce20 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  n cache..**.** T
1ce30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1ce40 73 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72  sed within asser
1ce50 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65  t() and testcase
1ce60 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a  () macros only.*
1ce70 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61  * and does not a
1ce80 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61  ppear in a norma
1ce90 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  l build..*/.stat
1cea0 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c  ic int usedAsCol
1ceb0 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a  umnCache(Parse *
1cec0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
1ced0 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69  m, int iTo){.  i
1cee0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
1cef0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
1cf00 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
1cf10 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70  ->aColCache; i<p
1cf20 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1cf30 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
1cf40 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67   int r = p->iReg
1cf50 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72  ;.    if( r>=iFr
1cf60 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72  om && r<=iTo ) r
1cf70 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f  eturn 1;    /*NO
1cf80 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65  _TEST*/.  }.  re
1cf90 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1cfa0 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1cfb0 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52   || SQLITE_COVER
1cfc0 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a  AGE_TEST */.../*
1cfd0 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63  .** Convert a sc
1cfe0 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  alar expression 
1cff0 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47  node to a TK_REG
1d000 49 53 54 45 52 20 72 65 66 65 72 65 6e 63 69 6e  ISTER referencin
1d010 67 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 52  g.** register iR
1d020 65 67 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20  eg.  The caller 
1d030 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
1d040 20 69 52 65 67 20 61 6c 72 65 61 64 79 20 63 6f   iReg already co
1d050 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f  ntains.** the co
1d060 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
1d070 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
1d080 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1d090 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78  xprToRegister(Ex
1d0a0 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29  pr *p, int iReg)
1d0b0 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e  {.  p->op2 = p->
1d0c0 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  op;.  p->op = TK
1d0d0 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e  _REGISTER;.  p->
1d0e0 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20  iTable = iReg;. 
1d0f0 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
1d100 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a  ty(p, EP_Skip);.
1d110 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74  }../*.** Evaluat
1d120 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
1d130 28 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72  (either a vector
1d140 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70   or a scalar exp
1d150 72 65 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f  ression) and sto
1d160 72 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  re.** the result
1d170 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20   in continguous 
1d180 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1d190 65 72 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ers.  Return the
1d1a0 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
1d1b0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
1d1c0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
1d1d0 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
1d1e0 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  If the returned 
1d1f0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
1d200 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73  is a temporary s
1d210 63 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f  calar, then also
1d220 20 77 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72   write.** that r
1d230 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69  egister number i
1d240 6e 74 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e  nto *piFreeable.
1d250 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65    If the returne
1d260 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  d result registe
1d270 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65  r.** is not a te
1d280 6d 70 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68  mporary or if th
1d290 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1d2a0 61 20 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69  a vector set *pi
1d2b0 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30  Freeable.** to 0
1d2c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d2d0 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50  exprCodeVector(P
1d2e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1d2f0 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72  pr *p, int *piFr
1d300 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  eeable){.  int i
1d310 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52  Result;.  int nR
1d320 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45  esult = sqlite3E
1d330 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29  xprVectorSize(p)
1d340 3b 0a 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d  ;.  if( nResult=
1d350 3d 31 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c  =1 ){.    iResul
1d360 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
1d370 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1d380 70 2c 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a  p, piFreeable);.
1d390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69    }else{.    *pi
1d3a0 46 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20  Freeable = 0;.  
1d3b0 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
1d3c0 53 45 4c 45 43 54 20 29 7b 0a 23 69 66 20 53 51  SELECT ){.#if SQ
1d3d0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1d3e0 52 59 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74  RY.      iResult
1d3f0 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20   = 0;.#else.    
1d400 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69    iResult = sqli
1d410 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
1d420 28 70 50 61 72 73 65 2c 20 70 2c 20 30 2c 20 30  (pParse, p, 0, 0
1d430 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  );.#endif.    }e
1d440 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
1d450 3b 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  ;.      iResult 
1d460 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
1d470 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1d480 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b  nMem += nResult;
1d490 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1d4a0 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b  i<nResult; i++){
1d4b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d4c0 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62  ExprCodeFactorab
1d4d0 6c 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e  le(pParse, p->x.
1d4e0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1d4f0 72 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20  r, i+iResult);. 
1d500 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d510 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73 75 6c  .  return iResul
1d520 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  t;.}.../*.** Gen
1d530 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
1d540 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
1d550 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
1d560 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
1d570 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74  sion.  Attempt t
1d580 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
1d590 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
1d5a0 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74  "target"..** Ret
1d5b0 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
1d5c0 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61   where results a
1d5d0 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
1d5e0 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69   With this routi
1d5f0 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ne, there is no 
1d600 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72  guarantee that r
1d610 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62  esults will.** b
1d620 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67  e stored in targ
1d630 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  et.  The result 
1d640 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20  might be stored 
1d650 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  in some other.**
1d660 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20   register if it 
1d670 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  is convenient to
1d680 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c   do so.  The cal
1d690 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
1d6a0 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
1d6b0 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
1d6c0 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  move the results
1d6d0 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a   to the desired.
1d6e0 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ** register..*/.
1d6f0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1d700 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20  odeTarget(Parse 
1d710 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1d720 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
1d730 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1d740 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f  Parse->pVdbe;  /
1d750 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63  * The VM under c
1d760 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1d770 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
1d780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d790 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63  e opcode being c
1d7a0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  oded */.  int in
1d7b0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20  Reg = target;   
1d7c0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73      /* Results s
1d7d0 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
1d7e0 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74  r inReg */.  int
1d7f0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20   regFree1 = 0;  
1d800 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
1d810 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
1d820 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1d830 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  er */.  int regF
1d840 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ree2 = 0;       
1d850 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
1d860 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
1d870 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
1d880 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 20 20  .  int r1, r2;  
1d890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d8a0 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72  Various register
1d8b0 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78   numbers */.  Ex
1d8c0 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20  pr tempX;       
1d8d0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
1d8e0 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  rary expression 
1d8f0 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35  node */.  int p5
1d900 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1d910 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
1d920 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
1d930 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  m );.  if( v==0 
1d940 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1d950 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1d960 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
1d970 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
1d980 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
1d990 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c      op = TK_NULL
1d9a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
1d9b0 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
1d9c0 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20   }.  switch( op 
1d9d0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1d9e0 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  GG_COLUMN: {.   
1d9f0 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67     AggInfo *pAgg
1da00 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
1da10 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74  ggInfo;.      st
1da20 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
1da30 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e   *pCol = &pAggIn
1da40 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  fo->aCol[pExpr->
1da50 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28  iAgg];.      if(
1da60 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65   !pAggInfo->dire
1da70 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  ctMode ){.      
1da80 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
1da90 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20  iMem>0 );.      
1daa0 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d 3e 69    return pCol->i
1dab0 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Mem;.      }else
1dac0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75   if( pAggInfo->u
1dad0 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a  seSortingIdx ){.
1dae0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1daf0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1db00 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f  Column, pAggInfo
1db10 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62  ->sortingIdxPTab
1db20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1db30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db40 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1db50 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
1db60 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1db70 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  get;.      }.   
1db80 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c     /* Otherwise,
1db90 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20   fall thru into 
1dba0 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61  the TK_COLUMN ca
1dbb0 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
1dbc0 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
1dbd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62  {.      int iTab
1dbe0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
1dbf0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62  ;.      if( iTab
1dc00 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  <0 ){.        if
1dc10 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65  ( pParse->ckBase
1dc20 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
1dc30 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48  /* Generating CH
1dc40 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
1dc50 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74  or inserting int
1dc60 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  o partial index 
1dc70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
1dc80 75 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  urn pExpr->iColu
1dc90 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42  mn + pParse->ckB
1dca0 61 73 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ase;.        }el
1dcb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1dcc0 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72 65   Coding an expre
1dcd0 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70 61  ssion that is pa
1dce0 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 77  rt of an index w
1dcf0 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  here column name
1dd00 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  s.          ** i
1dd10 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66 65  n the index refe
1dd20 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 74  r to the table t
1dd30 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65  o which the inde
1dd40 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20  x belongs */.   
1dd50 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70 50         iTab = pP
1dd60 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a  arse->iSelfTab;.
1dd70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dd80 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  }.      return s
1dd90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1dda0 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
1ddb0 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20  pExpr->pTab,.   
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1dde0 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62  r->iColumn, iTab
1ddf0 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
1de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de10 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1de20 6f 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  op2);.    }.    
1de30 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
1de40 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74   {.      codeInt
1de50 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78  eger(pParse, pEx
1de60 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  pr, 0, target);.
1de70 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1de80 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  get;.    }.#ifnd
1de90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1dea0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
1deb0 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
1dec0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1ded0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1dee0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1def0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63  alue) );.      c
1df00 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72  odeReal(v, pExpr
1df10 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74  ->u.zToken, 0, t
1df20 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65  arget);.      re
1df30 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1df40 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
1df50 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
1df60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1df70 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1df80 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1df90 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e) );.      sqli
1dfa0 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
1dfb0 67 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78  g(v, target, pEx
1dfc0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1dfd0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1dfe0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  et;.    }.    ca
1dff0 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
1e000 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e010 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1e020 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1e030 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1e040 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  t;.    }.#ifndef
1e050 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
1e060 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
1e070 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
1e080 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
1e090 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
1e0a0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f        char *zBlo
1e0b0 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  b;.      assert(
1e0c0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1e0d0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1e0e0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
1e0f0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1e100 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c  zToken[0]=='x' |
1e110 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  | pExpr->u.zToke
1e120 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20  n[0]=='X' );.   
1e130 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1e140 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27  ->u.zToken[1]=='
1e150 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d  \'' );.      z =
1e160 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65   &pExpr->u.zToke
1e170 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20  n[2];.      n = 
1e180 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1e190 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73  z) - 1;.      as
1e1a0 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27  sert( z[n]=='\''
1e1b0 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20   );.      zBlob 
1e1c0 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c  = sqlite3HexToBl
1e1d0 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62  ob(sqlite3VdbeDb
1e1e0 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  (v), z, n);.    
1e1f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e200 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20  Op4(v, OP_Blob, 
1e210 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20  n/2, target, 0, 
1e220 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49  zBlob, P4_DYNAMI
1e230 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  C);.      return
1e240 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
1e250 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
1e260 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
1e270 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1e280 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1e290 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1e2a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e2b0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1e2c0 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  n!=0 );.      as
1e2d0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1e2e0 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20  Token[0]!=0 );. 
1e2f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e300 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72  AddOp2(v, OP_Var
1e310 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  iable, pExpr->iC
1e320 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
1e330 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1e340 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20  >u.zToken[1]!=0 
1e350 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1e360 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
1e370 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65  e3VListNumToName
1e380 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c  (pParse->pVList,
1e390 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
1e3a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e3b0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1e3c0 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74 72  n[0]=='?' || str
1e3d0 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  cmp(pExpr->u.zTo
1e3e0 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20 20  ken, z)==0 );.  
1e3f0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56        pParse->pV
1e400 4c 69 73 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20  List[0] = 0; /* 
1e410 49 6e 64 69 63 61 74 65 20 56 4c 69 73 74 20 6d  Indicate VList m
1e420 61 79 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  ay no longer be 
1e430 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 20 20  enlarged */.    
1e440 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e450 70 70 65 6e 64 50 34 28 76 2c 20 28 63 68 61 72  ppendP4(v, (char
1e460 2a 29 7a 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  *)z, P4_STATIC);
1e470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1e480 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1e490 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e4a0 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
1e4b0 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
1e4c0 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 23 69  iTable;.    }.#i
1e4d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e4e0 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
1e4f0 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
1e500 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
1e510 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
1e520 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
1e530 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52  en) */.      inR
1e540 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
1e550 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
1e560 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1e570 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1e580 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
1e590 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1e5a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e5b0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
1e5c0 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
1e5d0 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
1e5e0 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
1e5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e600 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20  Op2(v, OP_Cast, 
1e610 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
1e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e630 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
1e640 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ype(pExpr->u.zTo
1e650 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ken, 0));.      
1e660 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73  testcase( usedAs
1e670 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
1e680 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67  se, inReg, inReg
1e690 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
1e6a0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1e6b0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
1e6c0 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20  , inReg, 1);.   
1e6d0 20 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b     return inReg;
1e6e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1e6f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
1e700 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
1e710 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
1e720 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70  _ISNOT:.      op
1e730 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
1e740 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
1e750 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54        p5 = SQLIT
1e760 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
1e770 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20  /* fall-through 
1e780 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
1e790 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1e7a0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1e7b0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1e7c0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1e7d0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1e7e0 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  Q: {.      Expr 
1e7f0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
1e800 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28  pLeft;.      if(
1e810 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
1e820 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20  ctor(pLeft) ){. 
1e830 20 20 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f         codeVecto
1e840 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
1e850 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
1e860 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d  op, p5);.      }
1e870 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
1e880 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e890 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1e8a0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1e8b0 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
1e8c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e8d0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e8e0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1e8f0 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ee2);.        co
1e900 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1e910 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  , pLeft, pExpr->
1e920 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1e930 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1e940 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
1e950 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20  OREP2 | p5);.   
1e960 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1e970 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
1e980 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
1e990 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e9a0 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
1e9b0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1e9c0 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
1e9d0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
1e9e0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e9f0 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
1ea00 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1ea10 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
1ea20 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
1ea30 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1ea40 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
1ea50 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1ea60 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
1ea70 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
1ea80 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1ea90 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
1eaa0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
1eab0 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
1eac0 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20  ase(op==OP_Eq); 
1ead0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1eae0 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  ,op==OP_Eq);.   
1eaf0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
1eb00 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
1eb10 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
1eb20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1eb30 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
1eb40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1eb50 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1eb60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1eb70 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1eb80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1eb90 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1eba0 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63  se TK_AND:.    c
1ebb0 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
1ebc0 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
1ebd0 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20   case TK_STAR:. 
1ebe0 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
1ebf0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
1ec00 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  M:.    case TK_B
1ec10 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  ITAND:.    case 
1ec20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61  TK_BITOR:.    ca
1ec30 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20  se TK_SLASH:.   
1ec40 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
1ec50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
1ec60 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54  IFT: .    case T
1ec70 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20  K_CONCAT: {.    
1ec80 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44    assert( TK_AND
1ec90 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20  ==OP_And );     
1eca0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ecb0 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20   op==TK_AND );. 
1ecc0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1ecd0 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20  OR==OP_Or );    
1ece0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1ecf0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  se( op==TK_OR );
1ed00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1ed10 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29  K_PLUS==OP_Add )
1ed20 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;           test
1ed30 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55  case( op==TK_PLU
1ed40 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  S );.      asser
1ed50 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f  t( TK_MINUS==OP_
1ed60 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20 20  Subtract );     
1ed70 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ed80 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20  _MINUS );.      
1ed90 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d  assert( TK_REM==
1eda0 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20  OP_Remainder ); 
1edb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1edc0 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20  p==TK_REM );.   
1edd0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
1ede0 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  TAND==OP_BitAnd 
1edf0 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
1ee00 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20  ( op==TK_BITAND 
1ee10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ee20 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69   TK_BITOR==OP_Bi
1ee30 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74 65  tOr );        te
1ee40 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
1ee50 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  ITOR );.      as
1ee60 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d  sert( TK_SLASH==
1ee70 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20  OP_Divide );    
1ee80 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ee90 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20  =TK_SLASH );.   
1eea0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53     assert( TK_LS
1eeb0 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  HIFT==OP_ShiftLe
1eec0 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ft );   testcase
1eed0 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20  ( op==TK_LSHIFT 
1eee0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1eef0 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
1ef00 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74 65  hiftRight );  te
1ef10 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
1ef20 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61  SHIFT );.      a
1ef30 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54  ssert( TK_CONCAT
1ef40 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20  ==OP_Concat );  
1ef50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1ef60 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20  ==TK_CONCAT );. 
1ef70 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1ef80 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1ef90 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1efa0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1efb0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1efc0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1efd0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1efe0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1eff0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f000 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
1f010 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
1f020 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f030 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1f040 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f050 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1f060 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f070 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
1f080 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
1f090 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
1f0a0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1f0b0 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
1f0c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
1f0d0 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
1f0e0 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  R ){.        cod
1f0f0 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c  eInteger(pParse,
1f100 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65   pLeft, 1, targe
1f110 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
1f120 72 6e 20 74 61 72 67 65 74 3b 0a 23 69 66 6e 64  rn target;.#ifnd
1f130 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1f140 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
1f150 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
1f160 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
1f170 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  T ){.        ass
1f180 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1f190 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1f1a0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1f1b0 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
1f1c0 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e   pLeft->u.zToken
1f1d0 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
1f1e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1f1f0 67 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  get;.#endif.    
1f200 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f210 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49   tempX.op = TK_I
1f220 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20  NTEGER;.        
1f230 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50  tempX.flags = EP
1f240 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b  _IntValue|EP_Tok
1f250 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20  enOnly;.        
1f260 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d  tempX.u.iValue =
1f270 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d   0;.        r1 =
1f280 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f290 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65  Temp(pParse, &te
1f2a0 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b  mpX, &regFree1);
1f2b0 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
1f2c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f2d0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f2e0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1f2f0 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
1f300 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1f310 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32   OP_Subtract, r2
1f320 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
1f330 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f340 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1f350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1f360 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f370 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20  ase TK_BITNOT:. 
1f380 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
1f390 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1f3a0 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69  TK_BITNOT==OP_Bi
1f3b0 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61  tNot );   testca
1f3c0 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f  se( op==TK_BITNO
1f3d0 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
1f3e0 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f  t( TK_NOT==OP_No
1f3f0 74 20 29 3b 20 20 20 20 20 20 20 20 20 74 65 73  t );         tes
1f400 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1f410 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
1f420 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f430 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f440 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1f450 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
1f460 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1f470 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1f480 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1f490 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a  op, r1, inReg);.
1f4a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f4b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1f4c0 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
1f4d0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
1f4e0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
1f4f0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
1f500 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
1f510 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1f520 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
1f530 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f540 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
1f550 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
1f560 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
1f570 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  L );.      sqlit
1f580 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1f590 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
1f5a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31  arget);.      r1
1f5b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f5c0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f5d0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1f5e0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
1f5f0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f600 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64  1==0 );.      ad
1f610 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1f620 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31  AddOp1(v, op, r1
1f630 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1f640 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1f650 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
1f660 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f670 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
1f680 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
1f690 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1f6a0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61  P_Integer, 0, ta
1f6b0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
1f6c0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1f6d0 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
1f6e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f6f0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
1f700 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
1f710 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  AggInfo *pInfo =
1f720 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
1f730 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
1f740 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
1f750 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1f760 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1f770 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1f780 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1f790 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1f7a0 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
1f7b0 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78  gate: %s()", pEx
1f7c0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1f7d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f7e0 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f      return pInfo
1f7f0 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69  ->aFunc[pExpr->i
1f800 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20  Agg].iMem;.     
1f810 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1f820 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f830 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
1f840 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46      ExprList *pF
1f850 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  arg;       /* Li
1f860 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  st of function a
1f870 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
1f880 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20    int nFarg;    
1f890 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f8a0 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  er of function a
1f8b0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
1f8c0 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
1f8d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f8e0 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
1f8f0 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ion object */.  
1f900 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1f910 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  zId;       /* Th
1f920 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
1f930 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e  */.      u32 con
1f940 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  stMask = 0;     
1f950 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74  /* Mask of funct
1f960 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68  ion arguments th
1f970 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20  at are constant 
1f980 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9a0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1f9b0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1f9c0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1f9d0 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  b;  /* The datab
1f9e0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1f9f0 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  /.      u8 enc =
1fa00 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f   ENC(db);      /
1fa10 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64  * The text encod
1fa20 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73  ing used by this
1fa30 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
1fa40 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
1fa50 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63  l = 0;    /* A c
1fa60 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1fa70 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  e */..      if( 
1fa80 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
1fa90 61 72 73 65 29 20 26 26 20 73 71 6c 69 74 65 33  arse) && sqlite3
1faa0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
1fab0 74 4a 6f 69 6e 28 70 45 78 70 72 29 20 29 7b 0a  tJoin(pExpr) ){.
1fac0 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 66          /* SQL f
1fad0 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20  unctions can be 
1fae0 65 78 70 65 6e 73 69 76 65 2e 20 53 6f 20 74 72  expensive. So tr
1faf0 79 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 73 74 61  y to move consta
1fb00 6e 74 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20  nt functions.   
1fb10 20 20 20 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74       ** out of t
1fb20 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65  he inner loop, e
1fb30 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
1fb40 73 20 61 6e 20 65 78 74 72 61 20 4f 50 5f 43 6f  s an extra OP_Co
1fb50 70 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  py. */.        r
1fb60 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
1fb70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
1fb80 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a  se, pExpr, -1);.
1fb90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1fba0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1fbb0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1fbc0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1fbd0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1fbe0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1fbf0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
1fc00 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1fc10 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1fc20 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1fc30 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1fc40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
1fc50 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70  Farg = pFarg ? p
1fc60 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  Farg->nExpr : 0;
1fc70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1fc80 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1fc90 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1fca0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64  ue) );.      zId
1fcb0 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
1fcc0 65 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  en;.      pDef =
1fcd0 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
1fce0 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46  tion(db, zId, nF
1fcf0 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69  arg, enc, 0);.#i
1fd00 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1fd10 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46  LE_UNKNOWN_SQL_F
1fd20 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66  UNCTION.      if
1fd30 28 20 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61  ( pDef==0 && pPa
1fd40 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
1fd50 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
1fd60 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
1fd70 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22  on(db, "unknown"
1fd80 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
1fd90 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1fda0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
1fdb0 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e  =0 || pDef->xFin
1fdc0 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20  alize!=0 ){.    
1fdd0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1fde0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
1fdf0 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25  nown function: %
1fe00 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20  s()", zId);.    
1fe10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1fe20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74   }..      /* Att
1fe30 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d  empt a direct im
1fe40 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1fe50 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41  the built-in COA
1fe60 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20  LESCE() and.    
1fe70 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75    ** IFNULL() fu
1fe80 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61  nctions.  This a
1fe90 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72  voids unnecessar
1fea0 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a  y evaluation of.
1feb0 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e        ** argumen
1fec0 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73  ts past the firs
1fed0 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d  t non-NULL argum
1fee0 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
1fef0 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
1ff00 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
1ff10 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29  _FUNC_COALESCE )
1ff20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e  {.        int en
1ff30 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69  dCoalesce = sqli
1ff40 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1ff50 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  (v);.        ass
1ff60 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b  ert( nFarg>=2 );
1ff70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ff80 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1ff90 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
1ffa0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
1ffb0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
1ffc0 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
1ffd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ffe0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1fff0 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20  otNull, target, 
20000 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20  endCoalesce);.  
20010 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
20020 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
20030 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
20040 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
20050 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20  , target, 1);.  
20060 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20070 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
20080 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
20090 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
200a0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
200b0 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [i].pExpr, targe
200c0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
200d0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
200e0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
200f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
20100 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
20110 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65  abel(v, endCoale
20120 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  sce);.        br
20130 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
20140 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b      /* The UNLIK
20150 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ELY() function i
20160 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20  s a no-op.  The 
20170 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 61  result is the va
20180 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  lue.      ** of 
20190 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
201a0 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
201b0 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
201c0 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
201d0 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b  FUNC_UNLIKELY ){
201e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
201f0 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20   nFarg>=1 );.   
20200 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
20210 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
20220 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  t(pParse, pFarg-
20230 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[0].pExpr, tar
20240 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 23  get);.      }..#
20250 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
20260 55 47 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  UG.      /* The 
20270 41 46 46 49 4e 49 54 59 28 29 20 66 75 6e 63 74  AFFINITY() funct
20280 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
20290 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
202a0 65 73 63 72 69 62 65 73 0a 20 20 20 20 20 20 2a  escribes.      *
202b0 2a 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e  * the type affin
202c0 69 74 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d  ity of the argum
202d0 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20 75 73  ent.  This is us
202e0 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f  ed for testing o
202f0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53  f.      ** the S
20300 51 4c 69 74 65 20 74 79 70 65 20 6c 6f 67 69 63  QLite type logic
20310 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
20320 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
20330 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
20340 4e 43 5f 41 46 46 49 4e 49 54 59 20 29 7b 0a 20  NC_AFFINITY ){. 
20350 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
20360 72 20 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b 20 22  r *azAff[] = { "
20370 62 6c 6f 62 22 2c 20 22 74 65 78 74 22 2c 20 22  blob", "text", "
20380 6e 75 6d 65 72 69 63 22 2c 20 22 69 6e 74 65 67  numeric", "integ
20390 65 72 22 2c 20 22 72 65 61 6c 22 20 7d 3b 0a 20  er", "real" };. 
203a0 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66 3b         char aff;
203b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
203c0 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20   nFarg==1 );.   
203d0 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74       aff = sqlit
203e0 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
203f0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
20400 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20410 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
20420 28 76 2c 20 74 61 72 67 65 74 2c 20 0a 20 20 20  (v, target, .   
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 20 20 20 20 20 20 20 20 20 20 20 61 66 66 20 3f             aff ?
20450 20 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c 49 54   azAff[aff-SQLIT
20460 45 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a 20 22 6e  E_AFF_BLOB] : "n
20470 6f 6e 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72  one");.        r
20480 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
20490 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
204a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
204b0 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
204c0 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20      if( i<32 && 
204d0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
204e0 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69  stant(pFarg->a[i
204f0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
20500 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20510 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20  i==31 );.       
20520 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20     constMask |= 
20530 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20  MASKBIT32(i);.  
20540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20550 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
20560 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
20570 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20  NC_NEEDCOLL)!=0 
20580 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  && !pColl ){.   
20590 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
205a0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
205b0 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  q(pParse, pFarg-
205c0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
205d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
205e0 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20        if( pFarg 
205f0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
20600 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20  onstMask ){.    
20610 20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73        r1 = pPars
20620 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
20630 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
20640 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20  m += nFarg;.    
20650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20660 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
20670 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
20680 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20  arse, nFarg);.  
20690 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
206a0 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29   /* For length()
206b0 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75   and typeof() fu
206c0 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63  nctions with a c
206d0 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a  olumn argument,.
206e0 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74          ** set t
206f0 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20  he P5 parameter 
20700 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e  to the OP_Column
20710 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41   opcode to OPFLA
20720 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20  G_LENGTHARG.    
20730 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47      ** or OPFLAG
20740 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65  _TYPEOFARG respe
20750 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69  ctively, to avoi
20760 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61  d unnecessary da
20770 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  ta.        ** lo
20780 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a  ading..        *
20790 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  /.        if( (p
207a0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
207b0 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45   (SQLITE_FUNC_LE
207c0 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43  NGTH|SQLITE_FUNC
207d0 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a  _TYPEOF))!=0 ){.
207e0 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70            u8 exp
207f0 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61  rOp;.          a
20800 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20  ssert( nFarg==1 
20810 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
20820 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d  ert( pFarg->a[0]
20830 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  .pExpr!=0 );.   
20840 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20         exprOp = 
20850 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
20860 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  r->op;.         
20870 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f   if( exprOp==TK_
20880 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70  COLUMN || exprOp
20890 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
208a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
208b0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
208c0 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41  NC_LENGTH==OPFLA
208d0 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20  G_LENGTHARG );. 
208e0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
208f0 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  t( SQLITE_FUNC_T
20900 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59  YPEOF==OPFLAG_TY
20910 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20  PEOFARG );.     
20920 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20930 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
20940 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48   & OPFLAG_LENGTH
20950 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
20960 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70     pFarg->a[0].p
20970 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20  Expr->op2 = .   
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
20990 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
209a0 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41   (OPFLAG_LENGTHA
209b0 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  RG|OPFLAG_TYPEOF
209c0 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ARG);.          
209d0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
209e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
209f0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
20a00 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74  );     /* Ticket
20a10 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f   2ea2425d34be */
20a20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20a30 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
20a40 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20  (pParse, pFarg, 
20a50 72 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  r1, 0,.         
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a70 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
20a80 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43  EL_DUP|SQLITE_EC
20a90 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20  EL_FACTOR);.    
20aa0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20ab0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
20ac0 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
20ad0 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a  2ea2425d34be */.
20ae0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20af0 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20       r1 = 0;.   
20b00 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
20b10 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
20b20 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50  TABLE.      /* P
20b30 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64  ossibly overload
20b40 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66   the function if
20b50 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
20b60 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ent is.      ** 
20b70 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
20b80 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a  column..      **
20b90 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e  .      ** For in
20ba0 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c  fix functions (L
20bb0 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58  IKE, GLOB, REGEX
20bc0 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73  P, and MATCH) us
20bd0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  e the.      ** s
20be0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
20bf0 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61  not the first, a
20c00 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  s the argument t
20c10 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20  o test to.      
20c20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
20c30 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69  a column in a vi
20c40 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68  rtual table.  Th
20c50 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75  is is done becau
20c60 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  se.      ** the 
20c70 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  left operand of 
20c80 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20  infix functions 
20c90 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20  (the operand we 
20ca0 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  want to.      **
20cb0 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61   control overloa
20cc0 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73  ding) ends up as
20cd0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
20ce0 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20  ment to the.    
20cf0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20    ** function.  
20d00 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  The expression "
20d10 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75  A glob B" is equ
20d20 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20  ivalent to .    
20d30 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e    ** "glob(B,A).
20d40 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65    We want to use
20d50 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f   the A in "A glo
20d60 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20  b B" to test.   
20d70 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69     ** for functi
20d80 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20  on overloading. 
20d90 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20   But we use the 
20da0 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28  B term in "glob(
20db0 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  B,A)"..      */.
20dc0 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e        if( nFarg>
20dd0 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c  =2 && (pExpr->fl
20de0 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75  ags & EP_InfixFu
20df0 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  nc) ){.        p
20e00 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
20e10 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
20e20 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
20e30 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70  g, pFarg->a[1].p
20e40 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
20e50 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29  se if( nFarg>0 )
20e60 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
20e70 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
20e80 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
20e90 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
20ea0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  arg->a[0].pExpr)
20eb0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
20ec0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
20ed0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
20ee0 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
20ef0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  L ){.        if(
20f00 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
20f10 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
20f20 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
20f30 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
20f40 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
20f50 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
20f60 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
20f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
20f80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
20f90 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c  v, OP_Function0,
20fa0 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20   constMask, r1, 
20fb0 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
20fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fd0 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f  (char*)pDef, P4_
20fe0 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
20ff0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
21000 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67  eP5(v, (u8)nFarg
21010 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  );.      if( nFa
21020 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d  rg && constMask=
21030 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
21040 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
21050 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
21060 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
21070 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  }.      return t
21080 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66  arget;.    }.#if
21090 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
210a0 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
210b0 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
210c0 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
210d0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  : {.      int nC
210e0 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ol;.      testca
210f0 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  se( op==TK_EXIST
21100 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
21110 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45  ase( op==TK_SELE
21120 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  CT );.      if( 
21130 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
21140 20 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e   (nCol = pExpr->
21150 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
21160 74 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a  t->nExpr)!=1 ){.
21170 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
21180 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50  ubselectError(pP
21190 61 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a  arse, nCol, 1);.
211a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
211b0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
211c0 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
211d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
211e0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
211f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21200 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  }.    case TK_SE
21210 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  LECT_COLUMN: {. 
21220 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
21230 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
21240 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b  ft->iTable==0 ){
21250 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
21260 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20  pLeft->iTable = 
21270 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
21280 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
21290 70 72 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30 29  pr->pLeft, 0, 0)
212a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
212b0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
212c0 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70  Table==0 || pExp
212d0 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  r->pLeft->op==TK
212e0 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
212f0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
21300 6c 65 0a 20 20 20 20 20 20 20 26 26 20 70 45 78  le.       && pEx
21310 70 72 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20 3d  pr->iTable!=(n =
21320 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
21330 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c  orSize(pExpr->pL
21340 65 66 74 29 29 20 0a 20 20 20 20 20 20 29 7b 0a  eft)) .      ){.
21350 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
21360 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
21370 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69  "%d columns assi
21380 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c  gned %d values",
21390 0a 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 20 20 20 20 20 20 20                  
213b0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
213c0 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
213d0 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
213e0 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20  pLeft->iTable + 
213f0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
21400 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
21410 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
21420 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
21430 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
21440 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
21450 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
21460 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
21470 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
21480 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21490 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
214a0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
214b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
214c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
214d0 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
214e0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
214f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21500 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
21510 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
21520 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
21530 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
21540 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
21550 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21560 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
21570 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20  , target, 0);.  
21580 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
21590 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
215a0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
215b0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
215c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
215d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
215e0 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f  QUERY */...    /
215f0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45  *.    **    x BE
21600 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20  TWEEN y AND z.  
21610 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
21620 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
21630 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  o.    **.    ** 
21640 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
21650 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
21660 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
21670 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
21680 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69  ** Y is stored i
21690 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
216a0 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[0].pExpr..    
216b0 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69  ** Z is stored i
216c0 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
216d0 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[1].pExpr..    
216e0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  */.    case TK_B
216f0 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
21700 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
21710 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
21720 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20  arget, 0, 0);.  
21730 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
21740 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  t;.    }.    cas
21750 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63  e TK_SPAN:.    c
21760 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20  ase TK_COLLATE: 
21770 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
21780 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  US: {.      retu
21790 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
217a0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
217b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
217c0 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  arget);.    }.. 
217d0 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47     case TK_TRIGG
217e0 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ER: {.      /* I
217f0 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20  f the opcode is 
21800 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e  TK_TRIGGER, then
21810 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
21820 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20  is a reference. 
21830 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c       ** to a col
21840 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
21850 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f   or old.* pseudo
21860 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c  -tables availabl
21870 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72  e to.      ** tr
21880 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20  igger programs. 
21890 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70  In this case Exp
218a0 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20  r.iTable is set 
218b0 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20  to 1 for the.   
218c0 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75     ** new.* pseu
218d0 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66  do-table, or 0 f
218e0 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  or the old.* pse
218f0 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e  udo-table. Expr.
21900 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a  iColumn.      **
21910 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
21920 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65  olumn of the pse
21930 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61  udo-table to rea
21940 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20  d, or to -1 to. 
21950 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65       ** read the
21960 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20   rowid field..  
21970 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21980 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
21990 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  s implemented us
219a0 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20  ing an OP_Param 
219b0 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20  opcode. The p1. 
219c0 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65       ** paramete
219d0 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f  r is set to 0 fo
219e0 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72  r an old.rowid r
219f0 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20  eference, or to 
21a00 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74  (i+1).      ** t
21a10 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74  o reference anot
21a20 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  her column of th
21a30 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
21a40 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20  able, where .   
21a50 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69     ** i is the i
21a60 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
21a70 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f  mn. For a new.ro
21a80 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70  wid reference, p
21a90 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65  1 is.      ** se
21aa0 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72  t to (n+1), wher
21ab0 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e n is the numbe
21ac0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
21ad0 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c  each pseudo-tabl
21ae0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  e..      ** For 
21af0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
21b00 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20  ny other column 
21b10 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65  in the new.* pse
21b20 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20  udo-table, p1.  
21b30 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
21b40 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20   (n+2+i), where 
21b50 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64  n and i are as d
21b60 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c  efined previousl
21b70 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20  y. For.      ** 
21b80 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
21b90 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74  table on which t
21ba0 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e  riggers are bein
21bb0 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20  g fired is.     
21bc0 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a   ** declared as:
21bd0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
21be0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
21bf0 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
21c00 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
21c10 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72  en p1 is interpr
21c20 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
21c30 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
21c40 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20  **   p1==0   -> 
21c50 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20     old.rowid    
21c60 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e   p1==3   ->    n
21c70 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a  ew.rowid.      *
21c80 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20  *   p1==1   ->  
21c90 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20    old.a         
21ca0 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65  p1==4   ->    ne
21cb0 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  w.a.      **   p
21cc0 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==2   ->    old
21cd0 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35  .b         p1==5
21ce0 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20     ->    new.b  
21cf0 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20       .      */. 
21d00 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
21d10 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
21d20 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70        int p1 = p
21d30 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28  Expr->iTable * (
21d40 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20  pTab->nCol+1) + 
21d50 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  1 + pExpr->iColu
21d60 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  mn;..      asser
21d70 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t( pExpr->iTable
21d80 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  ==0 || pExpr->iT
21d90 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
21da0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
21db0 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70  iColumn>=-1 && p
21dc0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54  Expr->iColumn<pT
21dd0 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
21de0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
21df0 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72  iPKey<0 || pExpr
21e00 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d  ->iColumn!=pTab-
21e10 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  >iPKey );.      
21e20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26  assert( p1>=0 &&
21e30 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a   p1<(pTab->nCol*
21e40 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73  2+2) );..      s
21e50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21e60 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31  (v, OP_Param, p1
21e70 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
21e80 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
21e90 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c   "%s.%s -> $%d",
21ea0 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d  .        (pExpr-
21eb0 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20  >iTable ? "new" 
21ec0 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20  : "old"),.      
21ed0 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d    (pExpr->iColum
21ee0 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  n<0 ? "rowid" : 
21ef0 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f  pExpr->pTab->aCo
21f00 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
21f10 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  ].zName),.      
21f20 20 20 74 61 72 67 65 74 0a 20 20 20 20 20 20 29    target.      )
21f30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
21f40 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
21f50 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20  _POINT.      /* 
21f60 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  If the column ha
21f70 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c  s REAL affinity,
21f80 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c   it may currentl
21f90 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
21fa0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67  n.      ** integ
21fb0 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41  er. Use OP_RealA
21fc0 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20  ffinity to make 
21fd0 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c  sure it is reall
21fe0 79 20 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a  y real..      **
21ff0 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
22000 43 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35  CE-OF: R-60985-5
22010 37 36 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c  7662 SQLite will
22020 20 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c   convert the val
22030 75 65 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20  ue back to.     
22040 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69   ** floating poi
22050 6e 74 20 77 68 65 6e 20 65 78 74 72 61 63 74 69  nt when extracti
22060 6e 67 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72  ng it from the r
22070 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20  ecord.  */.     
22080 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
22090 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26  umn>=0 .       &
220a0 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  & pTab->aCol[pEx
220b0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  pr->iColumn].aff
220c0 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
220d0 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a  F_REAL.      ){.
220e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
220f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
22100 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61  RealAffinity, ta
22110 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  rget);.      }.#
22120 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
22130 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
22140 73 65 20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a  se TK_VECTOR: {.
22150 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
22160 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
22170 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
22180 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
22190 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
221a0 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a   TK_IF_NULL_ROW:
221b0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
221c0 72 49 4e 52 3b 0a 20 20 20 20 20 20 61 64 64 72  rINR;.      addr
221d0 49 4e 52 20 3d 20 73 71 6c 69 74 65 33 56 64 62  INR = sqlite3Vdb
221e0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
221f0 4e 75 6c 6c 52 6f 77 2c 20 70 45 78 70 72 2d 3e  NullRow, pExpr->
22200 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73  iTable);.      s
22210 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
22220 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
22230 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
22240 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
22250 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
22260 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
22270 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22280 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
22290 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
222a0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
222b0 61 64 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20  addrINR);.      
222c0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
222d0 65 50 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20  eP3(v, addrINR, 
222e0 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
222f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
22300 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  /*.    ** Form A
22310 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
22320 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  x WHEN e1 THEN r
22330 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
22340 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
22350 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
22360 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
22370 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20  orm B:.    **   
22380 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45  CASE WHEN e1 THE
22390 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
223a0 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
223b0 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
223c0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
223d0 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20  * Form A is can 
223e0 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  be transformed i
223f0 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65  nto the equivale
22400 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c  nt form B as fol
22410 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43  lows:.    **   C
22420 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48  ASE WHEN x=e1 TH
22430 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20  EN r1 WHEN x=e2 
22440 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20  THEN r2 ....    
22450 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78  **        WHEN x
22460 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45  =eN THEN rN ELSE
22470 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
22480 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78    ** X (if it ex
22490 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70  ists) is in pExp
224a0 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
224b0 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73   Y is in the las
224c0 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78  t element of pEx
224d0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70  pr->x.pList if p
224e0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
224f0 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f  Expr is.    ** o
22500 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c  dd.  The Y is al
22510 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66  so optional.  If
22520 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
22530 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69  lements in x.pLi
22540 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65  st.    ** is eve
22550 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69  n, then Y is omi
22560 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74  tted and the "ot
22570 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20  herwise" result 
22580 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20  is NULL..    ** 
22590 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  Ei is in pExpr->
225a0 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e  pList->a[i*2] an
225b0 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70  d Ri is pExpr->p
225c0 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a  List->a[i*2+1]..
225d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
225e0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
225f0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
22600 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72  e Ri for the fir
22610 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a  st matching Ei,.
22620 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65      ** or if the
22630 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e  re is no matchin
22640 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74  g Ei, the ELSE t
22650 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65  erm Y, or if the
22660 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20  re is.    ** no 
22670 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e  ELSE term, NULL.
22680 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
22690 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d  ult: assert( op=
226a0 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20  =TK_CASE ); {.  
226b0 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c      int endLabel
226c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
226d0 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
226e0 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43  bel for end of C
226f0 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20  ASE stmt */.    
22700 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20    int nextCase; 
22710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22720 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
22730 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20  l for next WHEN 
22740 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
22750 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20  int nExpr;      
22760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22770 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f    /* 2x number o
22780 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
22790 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
227c0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
227d0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
227e0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
227f0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48     /* List of WH
22800 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
22810 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
22820 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
22830 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  m;  /* Array of 
22840 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
22850 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61      Expr opCompa
22860 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
22870 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d        /* The X==
22880 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  Ei expression */
22890 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
228c0 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  X expression */.
228d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73        Expr *pTes
228e0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
228f0 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69          /* X==Ei
22900 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73   (form A) or jus
22910 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f  t Ei (form B) */
22920 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  .      VVA_ONLY(
22930 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c   int iCacheLevel
22940 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
22950 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20  eLevel; )..     
22960 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
22970 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
22980 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26   EP_xIsSelect) &
22990 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
229a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
229b0 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
229c0 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
229d0 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
229e0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
229f0 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
22a00 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
22a10 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
22a20 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
22a30 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
22a40 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
22a50 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20        if( (pX = 
22a60 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30  pExpr->pLeft)!=0
22a70 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70   ){.        temp
22a80 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  X = *pX;.       
22a90 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f   testcase( pX->o
22aa0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
22ab0 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65          exprToRe
22ac0 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65  gister(&tempX, e
22ad0 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
22ae0 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72  arse, &tempX, &r
22af0 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20  egFree1));.     
22b00 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
22b10 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
22b20 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f      memset(&opCo
22b30 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66  mpare, 0, sizeof
22b40 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20  (opCompare));.  
22b50 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
22b60 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20  op = TK_EQ;.    
22b70 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c      opCompare.pL
22b80 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20  eft = &tempX;.  
22b90 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f        pTest = &o
22ba0 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20  pCompare;.      
22bb0 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31    /* Ticket b351
22bc0 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39  d95f9cd5ef17e9d9
22bd0 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39  dbae18f5ca861119
22be0 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a  0001:.        **
22bf0 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   The value in re
22c00 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74  gFree1 might get
22c10 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74   SCopy-ed into t
22c20 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a  he file result..
22c30 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61          ** So ma
22c40 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
22c50 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74   regFree1 regist
22c60 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64  er is not reused
22c70 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20   for other.     
22c80 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61     ** purposes a
22c90 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72  nd possibly over
22ca0 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
22cb0 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20       regFree1 = 
22cc0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
22cd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
22ce0 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  r-1; i=i+2){.   
22cf0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22d00 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
22d10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
22d20 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  X ){.          a
22d30 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20  ssert( pTest!=0 
22d40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43  );.          opC
22d50 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20  ompare.pRight = 
22d60 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
22d70 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  pr;.        }els
22d80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  e{.          pTe
22d90 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  st = aListelem[i
22da0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
22db0 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43   }.        nextC
22dc0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
22dd0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
22de0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
22df0 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pTest->op==TK_C
22e00 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
22e10 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
22e20 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73  lse(pParse, pTes
22e30 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c  t, nextCase, SQL
22e40 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
22e50 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
22e60 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e( aListelem[i+1
22e70 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
22e80 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
22e90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
22ea0 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
22eb0 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20  lem[i+1].pExpr, 
22ec0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
22ed0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
22ee0 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
22ef0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
22f00 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
22f10 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
22f20 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
22f30 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29  bel(v, nextCase)
22f40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22f50 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30  if( (nExpr&1)!=0
22f60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22f70 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
22f80 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
22f90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
22fa0 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  e(pParse, pEList
22fb0 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78  ->a[nExpr-1].pEx
22fc0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
22fd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22fe0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
22ff0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
23000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23010 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
23020 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
23030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
23040 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
23050 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
23060 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
23070 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0 .           ||
23080 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
23090 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65  evel==iCacheLeve
230a0 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
230b0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
230c0 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b  el(v, endLabel);
230d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
230e0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
230f0 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
23100 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53      case TK_RAIS
23110 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
23120 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  t( pExpr->affini
23130 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20  ty==OE_Rollback 
23140 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
23150 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
23160 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20  OE_Abort.       
23170 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
23180 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a  finity==OE_Fail.
23190 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
231a0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
231b0 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29  E_Ignore.      )
231c0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
231d0 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
231e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
231f0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
23200 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
23210 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53             "RAIS
23220 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
23230 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
23240 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b  igger-program");
23250 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
23260 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
23270 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
23280 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  nity==OE_Abort )
23290 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
232a0 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
232b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
232c0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
232d0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
232e0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
232f0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
23300 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49  ->affinity==OE_I
23310 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
23320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23330 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  p4(.            
23340 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
23350 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65  TE_OK, OE_Ignore
23360 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  , 0, pExpr->u.zT
23370 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20  oken,0);.       
23380 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
23390 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
233a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
233b0 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
233c0 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rse, SQLITE_CONS
233d0 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a  TRAINT_TRIGGER,.
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
23400 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70  xpr->affinity, p
23410 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
23420 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  0, 0);.      }..
23430 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23440 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
23450 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
23460 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
23470 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
23480 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
23490 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
234a0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52  2);.  return inR
234b0 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63  eg;.}../*.** Fac
234c0 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65  tor out the code
234d0 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
234e0 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74  pression to init
234f0 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e  ialization time.
23500 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65 73  .**.** If regDes
23510 74 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 72 65  t>=0 then the re
23520 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20 73  sult is always s
23530 74 6f 72 65 64 20 69 6e 20 74 68 61 74 20 72 65  tored in that re
23540 67 69 73 74 65 72 20 61 6e 64 20 74 68 65 0a 2a  gister and the.*
23550 2a 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20  * result is not 
23560 72 65 75 73 61 62 6c 65 2e 20 20 49 66 20 72 65  reusable.  If re
23570 67 44 65 73 74 3c 30 20 74 68 65 6e 20 74 68 69  gDest<0 then thi
23580 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66 72 65  s routine is fre
23590 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20 74  e to .** store t
235a0 68 65 20 76 61 6c 75 65 20 77 68 65 72 65 65 76  he value whereev
235b0 65 72 20 69 74 20 77 61 6e 74 73 2e 20 20 54 68  er it wants.  Th
235c0 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65  e register where
235d0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
235e0 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 73  .** is stored is
235f0 20 72 65 74 75 72 6e 65 64 2e 20 20 57 68 65 6e   returned.  When
23600 20 72 65 67 44 65 73 74 3c 30 2c 20 74 77 6f 20   regDest<0, two 
23610 69 64 65 6e 74 69 63 61 6c 20 65 78 70 72 65 73  identical expres
23620 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f  sions will.** co
23630 64 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72  de to the same r
23640 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  egister..*/.int 
23650 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
23660 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a  tInit(.  Parse *
23670 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
23680 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
23690 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
236a0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
236b0 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77  ession to code w
236c0 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69  hen the VDBE ini
236d0 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e  tializes */.  in
236e0 74 20 72 65 67 44 65 73 74 20 20 20 20 20 20 20  t regDest       
236f0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c  /* Store the val
23700 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ue in this regis
23710 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ter */.){.  Expr
23720 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72  List *p;.  asser
23730 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  t( ConstFactorOk
23740 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20  (pParse) );.  p 
23750 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  = pParse->pConst
23760 45 78 70 72 3b 0a 20 20 69 66 28 20 72 65 67 44  Expr;.  if( regD
23770 65 73 74 3c 30 20 26 26 20 70 20 29 7b 0a 20 20  est<0 && p ){.  
23780 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
23790 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
237a0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
237b0 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d  r(pItem=p->a, i=
237c0 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70  p->nExpr; i>0; p
237d0 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20  Item++, i--){.  
237e0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72      if( pItem->r
237f0 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74  eusable && sqlit
23800 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c  e3ExprCompare(0,
23810 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78  pItem->pExpr,pEx
23820 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  pr,-1)==0 ){.   
23830 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65       return pIte
23840 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52  m->u.iConstExprR
23850 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  eg;.      }.    
23860 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20  }.  }.  pExpr = 
23870 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
23880 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
23890 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  , 0);.  p = sqli
238a0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
238b0 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78  d(pParse, p, pEx
238c0 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  pr);.  if( p ){.
238d0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
238e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
238f0 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70   = &p->a[p->nExp
23900 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d  r-1];.     pItem
23910 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 67  ->reusable = reg
23920 44 65 73 74 3c 30 3b 0a 20 20 20 20 20 69 66 28  Dest<0;.     if(
23930 20 72 65 67 44 65 73 74 3c 30 20 29 20 72 65 67   regDest<0 ) reg
23940 44 65 73 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Dest = ++pParse-
23950 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74 65  >nMem;.     pIte
23960 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52  m->u.iConstExprR
23970 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20  eg = regDest;.  
23980 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  }.  pParse->pCon
23990 73 74 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65  stExpr = p;.  re
239a0 74 75 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d 0a  turn regDest;.}.
239b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
239c0 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
239d0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   an expression a
239e0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
239f0 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72  ults.** into a r
23a00 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e  egister.  Return
23a10 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
23a20 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72  mber where the r
23a30 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74  esults.** are st
23a40 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
23a50 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61  he register is a
23a60 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
23a70 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20  ter that can be 
23a80 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20  deallocated,.** 
23a90 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e  then write its n
23aa0 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67  umber into *pReg
23ab0 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
23ac0 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
23ad0 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c  .** a temporary,
23ae0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20   then set *pReg 
23af0 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49  to zero..**.** I
23b00 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e  f pExpr is a con
23b10 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  stant, then this
23b20 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67   routine might g
23b30 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20  enerate this.** 
23b40 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65  code to fill the
23b50 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
23b60 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
23b70 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  section of the.*
23b80 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20  * VDBE program, 
23b90 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74  in order to fact
23ba0 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65  or it out of the
23bb0 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70   evaluation loop
23bc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23bd0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72  ExprCodeTemp(Par
23be0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
23bf0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52   *pExpr, int *pR
23c00 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20  eg){.  int r2;. 
23c10 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
23c20 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
23c30 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f  pExpr);.  if( Co
23c40 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
23c50 73 65 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d  se).   && pExpr-
23c60 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
23c70 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
23c80 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
23c90 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a  oin(pExpr).  ){.
23ca0 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a      *pReg  = 0;.
23cb0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
23cc0 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
23cd0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31  Parse, pExpr, -1
23ce0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23cf0 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
23d00 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
23d10 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c  e);.    r2 = sql
23d20 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
23d30 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
23d40 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72  , r1);.    if( r
23d50 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a  2==r1 ){.      *
23d60 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d  pReg = r1;.    }
23d70 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
23d80 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
23d90 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
23da0 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a       *pReg = 0;.
23db0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
23dc0 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn r2;.}../*.** 
23dd0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
23de0 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
23df0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
23e00 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
23e10 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
23e20 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
23e30 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
23e40 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70  guaranteed to ap
23e50 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73  pear.** in regis
23e60 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76  ter target..*/.v
23e70 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
23e80 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ode(Parse *pPars
23e90 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
23ea0 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
23eb0 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73  nt inReg;..  ass
23ec0 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26  ert( target>0 &&
23ed0 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d   target<=pParse-
23ee0 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70  >nMem );.  if( p
23ef0 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f  Expr && pExpr->o
23f00 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
23f10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
23f20 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
23f30 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20  pVdbe, OP_Copy, 
23f40 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74  pExpr->iTable, t
23f50 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  arget);.  }else{
23f60 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c  .    inReg = sql
23f70 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
23f80 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
23f90 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61  , target);.    a
23fa0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
23fb0 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73  Vdbe!=0 || pPars
23fc0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
23fd0 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69  led );.    if( i
23fe0 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20  nReg!=target && 
23ff0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b  pParse->pVdbe ){
24000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
24010 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
24020 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79  >pVdbe, OP_SCopy
24030 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
24040 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
24050 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e  *.** Make a tran
24060 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78  sient copy of ex
24070 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
24080 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20  nd then code it 
24090 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
240a0 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69  ExprCode().  Thi
240b0 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
240c0 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65  just like sqlite
240d0 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65  3ExprCode().** e
240e0 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 69  xcept that the i
240f0 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20  nput expression 
24100 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
24110 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   be unchanged..*
24120 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
24130 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65  prCodeCopy(Parse
24140 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
24150 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
24160 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  t){.  sqlite3 *d
24170 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
24180 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
24190 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
241a0 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64  pr, 0);.  if( !d
241b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
241c0 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  ) sqlite3ExprCod
241d0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
241e0 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69   target);.  sqli
241f0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
24200 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
24210 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
24220 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
24230 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ate expression p
24240 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
24250 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
24260 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
24270 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
24280 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
24290 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65   appear.** in re
242a0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
242b0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
242c0 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74  n is constant, t
242d0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
242e0 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65  .** might choose
242f0 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70   to code the exp
24300 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69  ression at initi
24310 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a  alization time..
24320 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
24330 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c  xprCodeFactorabl
24340 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
24350 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
24360 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28  t target){.  if(
24370 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74   pParse->okConst
24380 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65  Factor && sqlite
24390 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
243a0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71  pExpr) ){.    sq
243b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
243c0 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
243d0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65  r, target);.  }e
243e0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
243f0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
24400 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
24410 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
24420 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
24430 20 65 76 61 6c 75 61 74 65 73 20 74 68 65 20 67   evaluates the g
24440 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
24450 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73  and puts the res
24460 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ult.** in regist
24470 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  er target..**.**
24480 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70   Also make a cop
24490 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
244a0 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ion results into
244b0 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22   another "cache"
244c0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64   register.** and
244d0 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72   modify the expr
244e0 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74  ession so that t
244f0 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20  he next time it 
24500 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a  is evaluated,.**
24510 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
24520 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63   copy of the cac
24530 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a  he register..**.
24540 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24550 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72  is used for expr
24560 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
24570 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a   used multiple .
24580 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20  ** times.  They 
24590 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  are evaluated on
245a0 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c  ce and the resul
245b0 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ts of the expres
245c0 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73  sion.** are reus
245d0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
245e0 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61  te3ExprCodeAndCa
245f0 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
24600 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
24610 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
24620 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
24630 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d  >pVdbe;.  int iM
24640 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  em;..  assert( t
24650 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73  arget>0 );.  ass
24660 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
24670 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
24680 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24690 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
246a0 74 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20  target);.  iMem 
246b0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
246c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
246d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
246e0 2c 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b  , target, iMem);
246f0 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65  .  exprToRegiste
24700 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a  r(pExpr, iMem);.
24710 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
24720 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68  e code that push
24730 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
24740 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66  every element of
24750 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
24760 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e  pression list in
24770 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  to a sequence of
24780 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
24790 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a  ning at target..
247a0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
247b0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
247c0 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a  nts evaluated..*
247d0 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
247e0 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72  ECEL_DUP flag pr
247f0 65 76 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d  events the argum
24800 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a  ents from being.
24810 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20  ** filled using 
24820 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f  OP_SCopy.  OP_Co
24830 70 79 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  py must be used 
24840 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  instead..**.** T
24850 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  he SQLITE_ECEL_F
24860 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61  ACTOR argument a
24870 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61  llows constant a
24880 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a  rguments to be.*
24890 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69  * factored out i
248a0 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  nto initializati
248b0 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  on code..**.** T
248c0 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  he SQLITE_ECEL_R
248d0 45 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68  EF flag means th
248e0 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  at expressions i
248f0 6e 20 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a  n the list with.
24900 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  ** ExprList.a[].
24910 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
24920 30 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  0 have already b
24930 65 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e  een evaluated an
24940 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72  d stored.** in r
24950 65 67 69 73 74 65 72 73 20 61 74 20 73 72 63 52  egisters at srcR
24960 65 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76  eg, and so the v
24970 61 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69  alue can be copi
24980 65 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a  ed from there..*
24990 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
249a0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20  rCodeExprList(. 
249b0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
249c0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
249d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
249e0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
249f0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
24a00 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65   list to be code
24a10 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65  d */.  int targe
24a20 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  t,        /* Whe
24a30 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75  re to write resu
24a40 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  lts */.  int src
24a50 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53  Reg,        /* S
24a60 6f 75 72 63 65 20 72 65 67 69 73 74 65 72 73 20  ource registers 
24a70 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  if SQLITE_ECEL_R
24a80 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73  EF */.  u8 flags
24a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
24aa0 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67  LITE_ECEL_* flag
24ab0 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  s */.){.  struct
24ac0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
24ad0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pItem;.  int i, 
24ae0 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f  j, n;.  u8 copyO
24af0 70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c  p = (flags & SQL
24b00 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20  ITE_ECEL_DUP) ? 
24b10 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f  OP_Copy : OP_SCo
24b20 70 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  py;.  Vdbe *v = 
24b30 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
24b40 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
24b50 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  0 );.  assert( t
24b60 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73  arget>0 );.  ass
24b70 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
24b80 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76  be!=0 );  /* Nev
24b90 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72  er gets this far
24ba0 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
24bb0 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
24bc0 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61  ;.  if( !ConstFa
24bd0 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29  ctorOk(pParse) )
24be0 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
24bf0 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20  E_ECEL_FACTOR;. 
24c00 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
24c10 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69  ->a, i=0; i<n; i
24c20 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
24c30 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
24c40 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
24c50 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53    if( (flags & S
24c60 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21  QLITE_ECEL_REF)!
24c70 3d 30 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d  =0 && (j = pItem
24c80 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
24c90 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  l)>0 ){.      if
24ca0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
24cb0 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b  _ECEL_OMITREF ){
24cc0 0a 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20  .        i--;.  
24cd0 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20        n--;.     
24ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24cf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24d00 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73  2(v, copyOp, j+s
24d10 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b  rcReg-1, target+
24d20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
24d30 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
24d40 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46   & SQLITE_ECEL_F
24d50 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c  ACTOR)!=0 && sql
24d60 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
24d70 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  nt(pExpr) ){.   
24d80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
24d90 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
24da0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
24db0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
24dc0 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20      int inReg = 
24dd0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
24de0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
24df0 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
24e00 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
24e10 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20  =target+i ){.   
24e20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
24e30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
24e40 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  pyOp==OP_Copy.  
24e50 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73         && (pOp=s
24e60 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
24e70 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d  v, -1))->opcode=
24e80 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
24e90 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70    && pOp->p1+pOp
24ea0 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20  ->p3+1==inReg.  
24eb0 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
24ec0 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72  2+pOp->p3+1==tar
24ed0 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b  get+i.        ){
24ee0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
24ef0 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  p3++;.        }e
24f00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
24f10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24f20 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65  (v, copyOp, inRe
24f30 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  g, target+i);.  
24f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
24f50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24f60 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
24f70 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
24f80 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61   a BETWEEN opera
24f90 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20  tor..**.**    x 
24fa0 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
24fb0 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
24fc0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
24fd0 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20   .**.**    x>=y 
24fe0 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43  AND x<=z.**.** C
24ff0 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
25000 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
25010 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
25020 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c  expression.** el
25030 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a  imination of x..
25040 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49  **.** The xJumpI
25050 66 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65  f parameter dete
25060 72 6d 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a  rmines details:.
25070 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20  **.**    NULL:  
25080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25090 20 53 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65   Store the boole
250a0 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  an result in reg
250b0 5b 64 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c  [dest].**    sql
250c0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 3a 20  ite3ExprIfTrue: 
250d0 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73       Jump to des
250e0 74 20 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20  t if true.**    
250f0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
25100 73 65 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20  se:     Jump to 
25110 64 65 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a  dest if false.**
25120 0a 2a 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75  .** The jumpIfNu
25130 6c 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ll parameter is 
25140 69 67 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70  ignored if xJump
25150 49 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  If is NULL..*/.s
25160 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
25170 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61  odeBetween(.  Pa
25180 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
25190 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
251a0 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
251b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
251c0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
251d0 20 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70   The BETWEEN exp
251e0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
251f0 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
25200 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
25210 6f 6e 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f  on or storage lo
25220 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  cation */.  void
25230 20 28 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a   (*xJump)(Parse*
25240 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c  ,Expr*,int,int),
25250 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61   /* Action to ta
25260 6b 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  ke */.  int jump
25270 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b  IfNull    /* Tak
25280 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
25290 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c  e BETWEEN is NUL
252a0 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78  L */.){. Expr ex
252b0 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68  prAnd;     /* Th
252c0 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69  e AND operator i
252d0 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a  n  x>=y AND x<=z
252e0 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70    */.  Expr comp
252f0 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  Left;    /* The 
25300 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20   x>=y  term */. 
25310 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b   Expr compRight;
25320 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20     /* The  x<=z 
25330 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
25340 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20  exprX;       /* 
25350 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65  The  x  subexpre
25360 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ssion */.  int r
25370 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20  egFree1 = 0; /* 
25380 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
25390 67 69 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65  gister */...  me
253a0 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20  mset(&compLeft, 
253b0 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
253c0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70  ;.  memset(&comp
253d0 52 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66  Right, 0, sizeof
253e0 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65  (Expr));.  memse
253f0 74 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20 73  t(&exprAnd, 0, s
25400 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20  izeof(Expr));.. 
25410 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
25420 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
25430 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
25440 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78  ;.  exprX = *pEx
25450 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70  pr->pLeft;.  exp
25460 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  rAnd.op = TK_AND
25470 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66  ;.  exprAnd.pLef
25480 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
25490 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20   exprAnd.pRight 
254a0 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20  = &compRight;.  
254b0 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
254c0 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  _GE;.  compLeft.
254d0 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
254e0 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
254f0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
25500 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
25510 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
25520 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69   TK_LE;.  compRi
25530 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
25540 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  rX;.  compRight.
25550 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
25560 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
25570 78 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67  xpr;.  exprToReg
25580 69 73 74 65 72 28 26 65 78 70 72 58 2c 20 65 78  ister(&exprX, ex
25590 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
255a0 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65  rse, &exprX, &re
255b0 67 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20  gFree1));.  if( 
255c0 78 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75  xJump ){.    xJu
255d0 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  mp(pParse, &expr
255e0 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  And, dest, jumpI
255f0 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  fNull);.  }else{
25600 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  .    /* Mark the
25610 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 62   expression is b
25620 65 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e  eing from the ON
25630 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
25640 20 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a   of a join.    *
25650 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 71  * so that the sq
25660 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
25670 67 65 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69  get() routine wi
25680 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
25690 6f 20 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74  o move.    ** it
256a0 20 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e   into the Parse.
256b0 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 2e  pConstExpr list.
256c0 20 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65 20    We should use 
256d0 61 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74 68  a new bit for th
256e0 69 73 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63  is,.    ** for c
256f0 6c 61 72 69 74 79 2c 20 62 75 74 20 77 65 20 61  larity, but we a
25700 72 65 20 6f 75 74 20 6f 66 20 62 69 74 73 20 69  re out of bits i
25710 6e 20 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73  n the Expr.flags
25720 20 66 69 65 6c 64 20 73 6f 20 77 65 0a 20 20 20   field so we.   
25730 20 2a 2a 20 68 61 76 65 20 74 6f 20 72 65 75 73   ** have to reus
25740 65 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  e the EP_FromJoi
25750 6e 20 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20  n bit.  Bummer. 
25760 2a 2f 0a 20 20 20 20 65 78 70 72 58 2e 66 6c 61  */.    exprX.fla
25770 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69  gs |= EP_FromJoi
25780 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  n;.    sqlite3Ex
25790 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
257a0 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
257b0 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  est);.  }.  sqli
257c0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
257d0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
257e0 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  e1);..  /* Ensur
257f0 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20  e adequate test 
25800 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65  coverage */.  te
25810 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
25820 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
25830 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d    && jumpIfNull=
25840 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
25850 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
25860 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
25870 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
25880 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
25890 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
258a0 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
258b0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72  =sqlite3ExprIfTr
258c0 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ue  && jumpIfNul
258d0 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
258e0 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
258f0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
25900 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
25910 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
25920 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
25930 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
25940 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
25950 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
25960 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
25970 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
25980 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
25990 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
259a0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
259b0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
259c0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
259d0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
259e0 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49  IfFalse && jumpI
259f0 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
25a00 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
25a10 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
25a20 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
25a30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
25a40 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
25a50 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
25a60 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  xJump==0 );.}../
25a70 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
25a80 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
25a90 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
25aa0 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
25ab0 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
25ac0 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
25ad0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
25ae0 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
25af0 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
25b00 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
25b10 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
25b20 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
25b30 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
25b40 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
25b50 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
25b60 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
25b70 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
25b80 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
25b90 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53  IfNull flag is S
25ba0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
25bb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64  ..**.** This cod
25bc0 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
25bd0 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61   fact that certa
25be0 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  in token values 
25bf0 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61  (ex: TK_EQ).** a
25c00 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f  re the same as o
25c10 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78  pcode values (ex
25c20 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d  : OP_Eq) that im
25c30 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72  plement the corr
25c40 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65  esponding.** ope
25c50 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c  ration.  Special
25c60 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62   comments in vdb
25c70 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70  e.c and the mkop
25c80 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74  codeh.awk script
25c90 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20   in.** the make 
25ca0 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68  process cause th
25cb0 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c  ese values to al
25cc0 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20  ign.  Assert()s 
25cd0 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62  in the code.** b
25ce0 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74  elow verify that
25cf0 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65   the numbers are
25d00 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74   aligned correct
25d10 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
25d20 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61  te3ExprIfTrue(Pa
25d30 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
25d40 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
25d50 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
25d60 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
25d70 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
25d80 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
25d90 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
25da0 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
25db0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
25dc0 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
25dd0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
25de0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
25df0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
25e00 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
25e10 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b  0) )     return;
25e20 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f    /* Existence o
25e30 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
25e40 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
25e50 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
25e60 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
25e70 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20  No way this can 
25e80 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d  happen */.  op =
25e90 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
25ea0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
25eb0 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
25ec0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
25ed0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
25ee0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
25ef0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
25f00 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
25f10 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
25f20 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
25f30 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66  pLeft, d2,jumpIf
25f40 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
25f50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
25f60 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
25f70 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
25f80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
25f90 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
25fa0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
25fb0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
25fc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25fd0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
25fe0 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d2);.      sqlit
25ff0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
26000 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
26010 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
26020 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
26030 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
26040 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26050 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26060 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
26070 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
26080 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
26090 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
260a0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
260b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
260c0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
260d0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
260e0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
260f0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
26100 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
26110 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
26120 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
26130 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
26140 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26150 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26160 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26170 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
26180 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
26190 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
261a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
261b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
261c0 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
261d0 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73  ISNOT:.      tes
261e0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
261f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
26200 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  se( op==TK_ISNOT
26210 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
26220 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
26230 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20  EQ : TK_NE;.    
26240 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53    jumpIfNull = S
26250 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20  QLITE_NULLEQ;.  
26260 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
26270 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
26280 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
26290 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
262a0 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
262b0 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
262c0 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
262d0 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EQ: {.      if( 
262e0 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
262f0 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  tor(pExpr->pLeft
26300 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74  ) ) goto default
26310 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73  _expr;.      tes
26320 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
26330 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
26340 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
26350 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
26360 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
26370 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
26380 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
26390 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
263a0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
263b0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
263c0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
263d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
263e0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
263f0 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
26400 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
26410 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
26420 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26430 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
26440 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
26450 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
26460 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
26470 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
26480 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
26490 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
264a0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
264b0 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
264c0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
264d0 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
264e0 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
264f0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
26500 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
26510 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
26520 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
26530 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
26540 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
26550 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
26560 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
26570 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
26580 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
26590 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
265a0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
265b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
265c0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
265d0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
265e0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
265f0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
26600 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
26610 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
26620 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
26630 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  se(op==OP_Ne);. 
26640 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
26650 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
26660 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
26670 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
26680 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
26690 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
266a0 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  e && jumpIfNull!
266b0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
266c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
266d0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
266e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
266f0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
26700 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26710 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
26720 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
26730 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
26740 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
26750 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
26760 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
26770 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
26780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
26790 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
267a0 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65  Null ); testcase
267b0 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
267c0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
267d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
267e0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
267f0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
26800 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
26810 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
26820 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
26830 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
26840 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
26850 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62  NULL);.      Vdb
26860 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
26870 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
26880 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26890 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
268a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
268b0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
268c0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
268d0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
268e0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
268f0 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
26900 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
26910 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72  est, sqlite3Expr
26920 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75  IfTrue, jumpIfNu
26930 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
26940 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
26950 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
26960 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
26970 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
26980 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
26990 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
269a0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
269b0 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a  t destIfNull = j
269c0 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74  umpIfNull ? dest
269d0 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   : destIfFalse;.
269e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
269f0 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
26a00 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
26a10 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
26a20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26a30 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
26a40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26a50 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
26a60 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
26a70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26a80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
26a90 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66  fault: {.    def
26aa0 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20  ault_expr:.     
26ab0 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
26ac0 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
26ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26ae0 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
26af0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
26b00 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
26b10 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
26b20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* No-op */.  
26b30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26b40 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
26b50 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
26b60 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
26b70 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
26b80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
26b90 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64  (v, OP_If, r1, d
26ba0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
26bb0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
26bc0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
26bd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26be0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
26bf0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
26c00 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
26c10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26c20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
26c30 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
26c40 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
26c50 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
26c60 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
26c70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
26c80 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ree2);  .}../*.*
26c90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
26ca0 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
26cb0 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
26cc0 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
26cd0 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
26ce0 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
26cf0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
26d00 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
26d10 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
26d20 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
26d30 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
26d40 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
26d50 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
26d60 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
26d70 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
26d80 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
26d90 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
26da0 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f  fNull is SQLITE_
26db0 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61  JUMPIFNULL or fa
26dc0 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
26dd0 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30  mpIfNull.** is 0
26de0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
26df0 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72  3ExprIfFalse(Par
26e00 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
26e10 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
26e20 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
26e30 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
26e40 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
26e50 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
26e60 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
26e70 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
26e80 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
26e90 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
26ea0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
26eb0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
26ec0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26ed0 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
26ee0 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45  ) ) return; /* E
26ef0 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
26f00 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
26f10 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  er */.  if( pExp
26f20 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e  r==0 )    return
26f30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
26f40 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
26f50 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
26f60 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
26f70 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
26f80 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
26f90 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
26fa0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
26fb0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
26fc0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
26fd0 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
26fe0 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
26ff0 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
27000 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
27010 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
27020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
27030 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
27040 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
27050 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
27060 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
27070 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
27080 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
27090 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
270a0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
270c0 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
270d0 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
270e0 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
270f0 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
27100 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
27110 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
27120 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
27130 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
27140 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
27150 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
27160 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
27170 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
27180 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
27190 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
271a0 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
271b0 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
271c0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
271d0 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
271e0 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
271f0 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
27200 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
27210 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
27220 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
27230 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
27240 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
27250 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
27260 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
27270 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
27280 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
27290 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
272a0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
272b0 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
272c0 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
272d0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
272e0 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
272f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
27300 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
27310 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
27320 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27330 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
27340 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
27350 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27360 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
27370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27380 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
27390 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
273a0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
273b0 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
273c0 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
273d0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
273e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
273f0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
27400 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
27410 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
27420 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
27430 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
27440 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
27450 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
27460 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
27470 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
27480 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
27490 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
274a0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
274b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
274c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
274d0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
274e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
274f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27500 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
27510 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
27520 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
27530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
27540 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
27550 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27560 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
27570 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
27580 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49   jumpIfNull^SQLI
27590 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
275a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
275b0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
275c0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
275d0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
275e0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
275f0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
27600 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
27610 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
27620 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
27630 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
27640 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
27650 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27660 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
27670 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
27680 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
27690 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
276a0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
276b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
276c0 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
276d0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
276e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
276f0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
27700 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
27710 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
27720 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
27730 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27740 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
27750 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f  ISNOT );.      o
27760 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d  p = (pExpr->op==
27770 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a  TK_IS) ? TK_NE :
27780 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75   TK_EQ;.      ju
27790 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54  mpIfNull = SQLIT
277a0 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
277b0 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
277c0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
277d0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
277e0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
277f0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
27800 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
27810 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
27820 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
27830 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
27840 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20  pExpr->pLeft) ) 
27850 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70  goto default_exp
27860 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  r;.      testcas
27870 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
27880 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
27890 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
278a0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
278b0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
278c0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
278d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
278e0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
278f0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
27900 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
27910 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
27920 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
27930 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
27940 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27950 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
27960 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27970 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
27980 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
27990 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
279a0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
279b0 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
279c0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
279d0 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
279e0 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
279f0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
27a00 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
27a10 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
27a20 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
27a30 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
27a40 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
27a50 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Gt);.      a
27a60 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
27a70 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
27a80 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
27a90 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
27aa0 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Ge);.      ass
27ab0 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
27ac0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
27ad0 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64  OP_Eq);.      Vd
27ae0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27af0 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
27b00 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
27b10 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
27b20 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27b30 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
27b40 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
27b50 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
27b60 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50  assert(TK_NE==OP
27b70 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ne); testcase(o
27b80 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
27b90 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27ba0 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
27bb0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
27bc0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
27bd0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
27be0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
27bf0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
27c00 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
27c10 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
27c20 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
27c30 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27c40 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
27c50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27c60 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
27c70 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
27c80 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72  TNULL: {.      r
27c90 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
27ca0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
27cb0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
27cc0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
27cd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27ce0 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
27cf0 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
27d00 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
27d10 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72  L );   VdbeCover
27d20 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
27d30 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  ISNULL);.      t
27d40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
27d50 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65  NOTNULL );  Vdbe
27d60 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
27d70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
27d80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
27d90 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
27da0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
27db0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
27dc0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
27dd0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
27de0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
27df0 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
27e00 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
27e10 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49  st, sqlite3ExprI
27e20 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75  fFalse, jumpIfNu
27e30 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
27e40 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
27e50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
27e60 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
27e70 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _IN: {.      if(
27e80 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20   jumpIfNull ){. 
27e90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
27ea0 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
27eb0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
27ec0 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
27ed0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 65  {.        int de
27ee0 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
27ef0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
27f00 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
27f10 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
27f20 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
27f30 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  t, destIfNull);.
27f40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27f50 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
27f60 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
27f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
27f80 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
27f90 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
27fa0 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70  .    default_exp
27fb0 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65 78  r: .      if( ex
27fc0 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45  prAlwaysFalse(pE
27fd0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
27fe0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
27ff0 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  v, dest);.      
28000 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c  }else if( exprAl
28010 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
28020 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  ){.        /* no
28030 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  -op */.      }el
28040 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
28050 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
28060 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
28070 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
28080 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28090 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
280a0 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c  IfNot, r1, dest,
280b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
280c0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
280d0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
280e0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
280f0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
28100 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
28110 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28120 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
28130 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
28140 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
28150 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
28160 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
28170 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
28180 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
28190 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65  );.}../*.** Like
281a0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
281b0 6c 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61  lse() except tha
281c0 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65  t a copy is made
281d0 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65   of pExpr before
281e0 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74  .** code generat
281f0 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f  ion, and that co
28200 70 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66  py is deleted af
28210 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ter code generat
28220 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73  ion. This.** ens
28230 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72  ures that the or
28240 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20  iginal pExpr is 
28250 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f  unchanged..*/.vo
28260 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
28270 46 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a  FalseDup(Parse *
28280 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
28290 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e  xpr, int dest,in
282a0 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
282b0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
282c0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
282d0 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74  r *pCopy = sqlit
282e0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
282f0 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  xpr, 0);.  if( d
28300 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
28310 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
28320 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
28330 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74  rse, pCopy, dest
28340 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
28350 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
28360 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79  Delete(db, pCopy
28370 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72  );.}../*.** Expr
28380 65 73 73 69 6f 6e 20 70 56 61 72 20 69 73 20 67  ession pVar is g
28390 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
283a0 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65 2e  an SQL variable.
283b0 20 70 45 78 70 72 20 6d 61 79 20 62 65 20 61 6e   pExpr may be an
283c0 79 0a 2a 2a 20 74 79 70 65 20 6f 66 20 65 78 70  y.** type of exp
283d0 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  ression..**.** I
283e0 66 20 70 45 78 70 72 20 69 73 20 61 20 73 69 6d  f pExpr is a sim
283f0 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 2d 20  ple SQL value - 
28400 61 6e 20 69 6e 74 65 67 65 72 2c 20 72 65 61 6c  an integer, real
28410 2c 20 73 74 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a  , string, blob.*
28420 2a 20 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65 20  * or NULL value 
28430 2d 20 74 68 65 6e 20 74 68 65 20 56 44 42 45 20  - then the VDBE 
28440 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
28450 70 72 65 70 61 72 65 64 20 69 73 20 63 6f 6e 66  prepared is conf
28460 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 72 65 2d  igured.** to re-
28470 70 72 65 70 61 72 65 20 65 61 63 68 20 74 69 6d  prepare each tim
28480 65 20 61 20 6e 65 77 20 76 61 6c 75 65 20 69 73  e a new value is
28490 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61 62   bound to variab
284a0 6c 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41  le pVar..**.** A
284b0 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20  dditionally, if 
284c0 70 45 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c  pExpr is a simpl
284d0 65 20 53 51 4c 20 76 61 6c 75 65 20 61 6e 64 20  e SQL value and 
284e0 74 68 65 20 76 61 6c 75 65 20 69 73 20 74 68 65  the value is the
284f0 0a 2a 2a 20 73 61 6d 65 20 61 73 20 74 68 61 74  .** same as that
28500 20 63 75 72 72 65 6e 74 6c 79 20 62 6f 75 6e 64   currently bound
28510 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70 56 61   to variable pVa
28520 72 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  r, non-zero is r
28530 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65  eturned..** Othe
28540 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 76 61  rwise, if the va
28550 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 74 68 65  lues are not the
28560 20 73 61 6d 65 20 6f 72 20 69 66 20 70 45 78 70   same or if pExp
28570 72 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c  r is not a simpl
28580 65 0a 2a 2a 20 53 51 4c 20 76 61 6c 75 65 2c 20  e.** SQL value, 
28590 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
285a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
285b0 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61  exprCompareVaria
285c0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
285d0 65 2c 20 45 78 70 72 20 2a 70 56 61 72 2c 20 45  e, Expr *pVar, E
285e0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
285f0 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 6e  nt res = 0;.  in
28600 74 20 69 56 61 72 3b 0a 20 20 73 71 6c 69 74 65  t iVar;.  sqlite
28610 33 5f 76 61 6c 75 65 20 2a 70 4c 2c 20 2a 70 52  3_value *pL, *pR
28620 20 3d 20 30 3b 0a 20 20 0a 20 20 73 71 6c 69 74   = 0;.  .  sqlit
28630 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  e3ValueFromExpr(
28640 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
28650 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  r, SQLITE_UTF8, 
28660 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2c  SQLITE_AFF_BLOB,
28670 20 26 70 52 29 3b 0a 20 20 69 66 28 20 70 52 20   &pR);.  if( pR 
28680 29 7b 0a 20 20 20 20 69 56 61 72 20 3d 20 70 56  ){.    iVar = pV
28690 61 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ar->iColumn;.   
286a0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
286b0 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70  armask(pParse->p
286c0 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20 20  Vdbe, iVar);.   
286d0 20 70 4c 20 3d 20 73 71 6c 69 74 65 33 56 64 62   pL = sqlite3Vdb
286e0 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 70  eGetBoundValue(p
286f0 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72  Parse->pReprepar
28700 65 2c 20 69 56 61 72 2c 20 53 51 4c 49 54 45 5f  e, iVar, SQLITE_
28710 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20 20 69  AFF_BLOB);.    i
28720 66 28 20 70 4c 20 29 7b 0a 20 20 20 20 20 20 69  f( pL ){.      i
28730 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
28740 5f 74 79 70 65 28 70 4c 29 3d 3d 53 51 4c 49 54  _type(pL)==SQLIT
28750 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
28760 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
28770 74 65 78 74 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b  text(pL); /* Mak
28780 65 20 73 75 72 65 20 74 68 65 20 65 6e 63 6f 64  e sure the encod
28790 69 6e 67 20 69 73 20 55 54 46 2d 38 20 2a 2f 0a  ing is UTF-8 */.
287a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
287b0 73 20 3d 20 20 30 3d 3d 73 71 6c 69 74 65 33 4d  s =  0==sqlite3M
287c0 65 6d 43 6f 6d 70 61 72 65 28 70 4c 2c 20 70 52  emCompare(pL, pR
287d0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
287e0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
287f0 28 70 52 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (pR);.    sqlite
28800 33 56 61 6c 75 65 46 72 65 65 28 70 4c 29 3b 0a  3ValueFree(pL);.
28810 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65    }..  return re
28820 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  s;.}../*.** Do a
28830 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
28840 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
28850 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
28860 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  n 0 if the two.*
28870 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
28880 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65  e completely ide
28890 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20  ntical.  Return 
288a0 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  1 if they differ
288b0 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f   only.** by a CO
288c0 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61  LLATE operator a
288d0 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e  t the top level.
288e0 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68    Return 2 if th
288f0 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
28900 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61  ces.** other tha
28910 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  n the top-level 
28920 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
28930 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
28940 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
28950 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
28960 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
28970 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
28980 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
28990 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
289a0 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
289b0 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
289c0 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41  ab..**.** The pA
289d0 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75   side might be u
289e0 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
289f0 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
28a00 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73  e case and pB is
28a10 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b  .** not using TK
28a20 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73  _REGISTER but is
28a30 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76   otherwise equiv
28a40 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c  alent, then stil
28a50 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a  l return 0..**.*
28a60 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
28a70 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
28a80 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74  turn 2 even if t
28a90 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
28aa0 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
28ab0 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
28ac0 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
28ad0 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
28ae0 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
28af0 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
28b00 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73  n 2 just to be s
28b10 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
28b20 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
28b30 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20  rns 2, then you 
28b40 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
28b50 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
28b60 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
28b70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
28b80 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
28b90 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20  ou get a 0 or 1 
28ba0 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
28bb0 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
28bc0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
28bd0 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
28be0 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
28bf0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
28c00 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
28c10 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
28c20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d  get an extra 2 -
28c30 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
28c40 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
28c50 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
28c60 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
28c70 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
28c80 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63  correct 0 or 1 c
28c90 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
28ca0 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  alfunction..**.*
28cb0 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20 6e  * If pParse is n
28cc0 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 54 4b 5f  ot NULL then TK_
28cd0 56 41 52 49 41 42 4c 45 20 74 65 72 6d 73 20 69  VARIABLE terms i
28ce0 6e 20 70 41 20 77 69 74 68 20 62 69 6e 64 69 6e  n pA with bindin
28cf0 67 73 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  gs in.** pParse-
28d00 3e 70 52 65 70 72 65 70 61 72 65 20 63 61 6e 20  >pReprepare can 
28d10 62 65 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e  be matched again
28d20 73 74 20 6c 69 74 65 72 61 6c 73 20 69 6e 20 70  st literals in p
28d30 42 2e 20 20 54 68 65 20 0a 2a 2a 20 70 50 61 72  B.  The .** pPar
28d40 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61  se->pVdbe->expma
28d50 73 6b 20 62 69 74 6d 61 73 6b 20 69 73 20 75 70  sk bitmask is up
28d60 64 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 76  dated for each v
28d70 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63  ariable referenc
28d80 65 64 2e 0a 2a 2a 20 49 66 20 70 50 61 72 73 65  ed..** If pParse
28d90 20 69 73 20 4e 55 4c 4c 20 28 74 68 65 20 6e 6f   is NULL (the no
28da0 72 6d 61 6c 20 63 61 73 65 29 20 74 68 65 6e 20  rmal case) then 
28db0 61 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c 45 20  any TK_VARIABLE 
28dc0 74 65 72 6d 20 69 6e 20 0a 2a 2a 20 41 72 67 75  term in .** Argu
28dd0 6d 65 6e 74 20 70 50 61 72 73 65 20 73 68 6f 75  ment pParse shou
28de0 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 4e  ld normally be N
28df0 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ULL. If it is no
28e00 74 20 4e 55 4c 4c 20 61 6e 64 20 70 41 20 6f 72  t NULL and pA or
28e10 0a 2a 2a 20 70 42 20 63 61 75 73 65 73 20 61 20  .** pB causes a 
28e20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
28e30 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  2..*/.int sqlite
28e40 33 45 78 70 72 43 6f 6d 70 61 72 65 28 50 61 72  3ExprCompare(Par
28e50 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
28e60 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20   *pA, Expr *pB, 
28e70 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32  int iTab){.  u32
28e80 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a   combinedFlags;.
28e90 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
28ea0 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  B==0 ){.    retu
28eb0 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20  rn pB==pA ? 0 : 
28ec0 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  2;.  }.  if( pPa
28ed0 72 73 65 20 26 26 20 70 41 2d 3e 6f 70 3d 3d 54  rse && pA->op==T
28ee0 4b 5f 56 41 52 49 41 42 4c 45 20 26 26 20 65 78  K_VARIABLE && ex
28ef0 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c  prCompareVariabl
28f00 65 28 70 50 61 72 73 65 2c 20 70 41 2c 20 70 42  e(pParse, pA, pB
28f10 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
28f20 30 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65  0;.  }.  combine
28f30 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61  dFlags = pA->fla
28f40 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a  gs | pB->flags;.
28f50 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c    if( combinedFl
28f60 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
28f70 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41  e ){.    if( (pA
28f80 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67  ->flags&pB->flag
28f90 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d  s&EP_IntValue)!=
28fa0 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75  0 && pA->u.iValu
28fb0 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20  e==pB->u.iValue 
28fc0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
28fd0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  0;.    }.    ret
28fe0 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
28ff0 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20   pA->op!=pB->op 
29000 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  ){.    if( pA->o
29010 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
29020 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
29030 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e  are(pParse, pA->
29040 70 4c 65 66 74 2c 70 42 2c 69 54 61 62 29 3c 32  pLeft,pB,iTab)<2
29050 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
29060 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
29070 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pB->op==TK_COL
29080 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
29090 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
290a0 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65 66 74 2c  e, pA,pB->pLeft,
290b0 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
290c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
290d0 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
290e0 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
290f0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
29100 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
29110 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f  UMN && pA->u.zTo
29120 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ken ){.    if( p
29130 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  A->op==TK_FUNCTI
29140 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ON ){.      if( 
29150 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
29160 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
29170 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72  u.zToken)!=0 ) r
29180 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c  eturn 2;.    }el
29190 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 70 41  se if( strcmp(pA
291a0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
291b0 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20  .zToken)!=0 ){. 
291c0 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e       return pA->
291d0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f  op==TK_COLLATE ?
291e0 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20   1 : 2;.    }.  
291f0 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61  }.  if( (pA->fla
29200 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
29210 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20  )!=(pB->flags & 
29220 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72  EP_Distinct) ) r
29230 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41  eturn 2;.  if( A
29240 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46  LWAYS((combinedF
29250 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f  lags & EP_TokenO
29260 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nly)==0) ){.    
29270 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  if( combinedFlag
29280 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
29290 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
292a0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
292b0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
292c0 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70  pA->pLeft, pB->p
292d0 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20 72 65  Left, iTab) ) re
292e0 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
292f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
29300 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70  re(pParse, pA->p
29310 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
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 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
29350 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c  are(pA->x.pList,
29360 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54   pB->x.pList, iT
29370 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
29380 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 28      if( ALWAYS((
29390 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
293a0 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20  EP_Reduced)==0) 
293b0 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54  && pA->op!=TK_ST
293c0 52 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66  RING ){.      if
293d0 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  ( pA->iColumn!=p
293e0 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74  B->iColumn ) ret
293f0 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28  urn 2;.      if(
29400 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
29410 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20  >iTable .       
29420 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d  && (pA->iTable!=
29430 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42  iTab || NEVER(pB
29440 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20  ->iTable>=0)) ) 
29450 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
29460 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
29470 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
29480 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
29490 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30  jects.  Return 0
294a0 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
294b0 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e  ntical and .** n
294c0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20  on-zero if they 
294d0 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
294e0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  y..**.** If any 
294f0 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
29500 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
29510 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
29520 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
29530 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
29540 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
29550 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
29560 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
29570 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Tab..**.** This 
29580 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
29590 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  turn non-zero fo
295a0 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70  r equivalent Exp
295b0 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20  rLists.  The.** 
295c0 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65  only consequence
295d0 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65   will be disable
295e0 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  d optimizations.
295f0 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
29600 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72  ne.** must never
29610 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
29620 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
29630 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72  jects are differ
29640 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c  ent, or.** a mal
29650 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
29660 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  sult..**.** Two 
29670 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72  NULL pointers ar
29680 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
29690 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  be the same.  Bu
296a0 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
296b0 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65  .** always diffe
296c0 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55  rs from a non-NU
296d0 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69  LL pointer..*/.i
296e0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  nt sqlite3ExprLi
296f0 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69  stCompare(ExprLi
29700 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74  st *pA, ExprList
29710 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
29720 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
29730 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29  pA==0 && pB==0 )
29740 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
29750 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
29760 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
29770 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  ( pA->nExpr!=pB-
29780 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
29790 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
297a0 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  pA->nExpr; i++){
297b0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
297c0 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78  A = pA->a[i].pEx
297d0 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  pr;.    Expr *pE
297e0 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e  xprB = pB->a[i].
297f0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
29800 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  A->a[i].sortOrde
29810 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74  r!=pB->a[i].sort
29820 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31  Order ) return 1
29830 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
29840 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
29850 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20  pExprA, pExprB, 
29860 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31  iTab) ) return 1
29870 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
29880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  ;.}../*.** Like 
29890 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
298a0 72 65 28 29 20 65 78 63 65 70 74 20 43 4f 4c 4c  re() except COLL
298b0 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 74  ATE operators at
298c0 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a   the top-level.*
298d0 2a 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a  * are ignored..*
298e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
298f0 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 45 78 70  rCompareSkip(Exp
29900 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c  r *pA, Expr *pB,
29910 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 72 65   int iTab){.  re
29920 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
29930 43 6f 6d 70 61 72 65 28 30 2c 0a 20 20 20 20 20  Compare(0,.     
29940 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
29950 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
29960 41 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  A),.            
29970 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
29980 43 6f 6c 6c 61 74 65 28 70 42 29 2c 0a 20 20 20  Collate(pB),.   
29990 20 20 20 20 20 20 20 20 20 20 69 54 61 62 29 3b            iTab);
299a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
299b0 20 74 72 75 65 20 69 66 20 77 65 20 63 61 6e 20   true if we can 
299c0 70 72 6f 76 65 20 74 68 65 20 70 45 32 20 77 69  prove the pE2 wi
299d0 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72 75  ll always be tru
299e0 65 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74  e if pE1 is.** t
299f0 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  rue.  Return fal
29a00 73 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  se if we cannot 
29a10 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f  complete the pro
29a20 6f 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67  of or if pE2 mig
29a30 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20  ht.** be false. 
29a40 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
29a50 20 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20       pE1: x==5  
29a60 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20       pE2: x==5  
29a70 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c             Resul
29a80 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
29a90 45 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70  E1: x>0        p
29aa0 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
29ab0 20 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c       Result: fal
29ac0 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  se.**     pE1: x
29ad0 3d 32 31 20 20 20 20 20 20 20 70 45 32 3a 20 78  =21       pE2: x
29ae0 3d 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20  =21 OR y=43     
29af0 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
29b00 20 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20      pE1: x!=123 
29b10 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
29b20 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
29b30 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
29b40 31 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45  1: x!=?1      pE
29b50 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
29b60 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
29b70 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
29b80 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49  S NULL  pE2: x I
29b90 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
29ba0 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20  sult: false.**  
29bb0 20 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20     pE1: x IS ?2 
29bc0 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
29bd0 20 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a   NULL    Reuslt:
29be0 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65   false.**.** Whe
29bf0 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43  n comparing TK_C
29c00 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77  OLUMN nodes betw
29c10 65 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c  een pE1 and pE2,
29c20 20 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45   if pE2 has.** E
29c30 78 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65  xpr.iTable<0 the
29c40 6e 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65  n assume a table
29c50 20 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79   number given by
29c60 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   iTab..**.** If 
29c70 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e 55  pParse is not NU
29c80 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  LL, then the val
29c90 75 65 73 20 6f 66 20 62 6f 75 6e 64 20 76 61 72  ues of bound var
29ca0 69 61 62 6c 65 73 20 69 6e 20 70 45 31 20 61 72  iables in pE1 ar
29cb0 65 20 0a 2a 2a 20 63 6f 6d 70 61 72 65 64 20 61  e .** compared a
29cc0 67 61 69 6e 73 74 20 6c 69 74 65 72 61 6c 20 76  gainst literal v
29cd0 61 6c 75 65 73 20 69 6e 20 70 45 32 20 61 6e 64  alues in pE2 and
29ce0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e   pParse->pVdbe->
29cf0 65 78 70 6d 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f  expmask is.** mo
29d00 64 69 66 69 65 64 20 74 6f 20 72 65 63 6f 72 64  dified to record
29d10 20 77 68 69 63 68 20 62 6f 75 6e 64 20 76 61 72   which bound var
29d20 69 61 62 6c 65 73 20 61 72 65 20 72 65 66 65 72  iables are refer
29d30 65 6e 63 65 64 2e 20 20 49 66 20 70 50 61 72 73  enced.  If pPars
29d40 65 20 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74  e .** is NULL, t
29d50 68 65 6e 20 66 61 6c 73 65 20 77 69 6c 6c 20 62  hen false will b
29d60 65 20 72 65 74 75 72 6e 65 64 20 69 66 20 70 45  e returned if pE
29d70 31 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 62  1 contains any b
29d80 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 2e 0a  ound variables..
29d90 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f  **.** When in do
29da0 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73  ubt, return fals
29db0 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72  e.  Returning tr
29dc0 75 65 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  ue might give a 
29dd0 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
29de0 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74  mprovement.  Ret
29df0 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67  urning false mig
29e00 68 74 20 63 61 75 73 65 20 61 20 70 65 72 66 6f  ht cause a perfo
29e10 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
29e20 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c  , but.** it will
29e30 20 61 6c 77 61 79 73 20 67 69 76 65 20 74 68 65   always give the
29e40 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
29e50 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77  and is hence alw
29e60 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74  ays safe..*/.int
29e70 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
29e80 69 65 73 45 78 70 72 28 50 61 72 73 65 20 2a 70  iesExpr(Parse *p
29e90 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 31  Parse, Expr *pE1
29ea0 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74  , Expr *pE2, int
29eb0 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71   iTab){.  if( sq
29ec0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
29ed0 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45  (pParse, pE1, pE
29ee0 32 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20  2, iTab)==0 ){. 
29ef0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
29f00 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
29f10 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c  TK_OR.   && (sql
29f20 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
29f30 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c  xpr(pParse, pE1,
29f40 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61   pE2->pLeft, iTa
29f50 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b).             
29f60 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  || sqlite3ExprIm
29f70 70 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65  pliesExpr(pParse
29f80 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67  , pE1, pE2->pRig
29f90 68 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b  ht, iTab) ).  ){
29fa0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
29fb0 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70   }.  if( pE2->op
29fc0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 26 26 20  ==TK_NOTNULL && 
29fd0 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55  pE1->op!=TK_ISNU
29fe0 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54  LL && pE1->op!=T
29ff0 4b 5f 49 53 20 29 7b 0a 20 20 20 20 45 78 70 72  K_IS ){.    Expr
2a000 20 2a 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78   *pX = sqlite3Ex
2a010 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
2a020 31 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 74  1->pLeft);.    t
2a030 65 73 74 63 61 73 65 28 20 70 58 21 3d 70 45 31  estcase( pX!=pE1
2a040 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 69  ->pLeft );.    i
2a050 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2a060 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 58  mpare(pParse, pX
2a070 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54  , pE2->pLeft, iT
2a080 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ab)==0 ) return 
2a090 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
2a0a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  0;.}../*.** An i
2a0b0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
2a0c0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2a0d0 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
2a0e0 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
2a0f0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
2a100 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63   an expression c
2a110 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  an be evaluated 
2a120 62 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  by reference to 
2a130 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c  the.** index onl
2a140 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  y, without havin
2a150 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72 63 68  g to do a search
2a160 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
2a170 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20  onding.** table 
2a180 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64 78 43  entry.  The IdxC
2a190 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c 64 20  over.pIdx field 
2a1a0 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  is the index.  I
2a1b0 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20  dxCover.iCur.** 
2a1c0 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f  is the cursor fo
2a1d0 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  r the table..*/.
2a1e0 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20  struct IdxCover 
2a1f0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  {.  Index *pIdx;
2a200 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2a210 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 66  x to be tested f
2a220 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20  or coverage */. 
2a230 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
2a240 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
2a250 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
2a260 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2a270 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d  o the index */.}
2a280 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ;../*.** Check t
2a290 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
2a2a0 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
2a2b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c   columns in tabl
2a2c0 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75  e .** pWalker->u
2a2d0 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72  .pIdxCover->iCur
2a2e0 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65   can be satisfie
2a2f0 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65  d using the inde
2a300 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  x.** pWalker->u.
2a310 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e  pIdxCover->pIdx.
2a320 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
2a330 78 70 72 49 64 78 43 6f 76 65 72 28 57 61 6c 6b  xprIdxCover(Walk
2a340 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2a350 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
2a360 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
2a370 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70  OLUMN.   && pExp
2a380 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b  r->iTable==pWalk
2a390 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
2a3a0 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69  >iCur.   && sqli
2a3b0 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
2a3c0 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78  (pWalker->u.pIdx
2a3d0 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70 45 78  Cover->pIdx, pEx
2a3e0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20  pr->iColumn)<0. 
2a3f0 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
2a400 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  >eCode = 1;.    
2a410 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2a420 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  ;.  }.  return W
2a430 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2a440 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
2a450 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49 64 78  if an index pIdx
2a460 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 20 63   on table with c
2a470 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e 74 61  ursor iCur conta
2a480 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20  ins will.** the 
2a490 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
2a4a0 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
2a4b0 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f 65 73  f the index does
2a4c0 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65 78   cover the.** ex
2a4d0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c  pression and fal
2a4e0 73 65 20 69 66 20 74 68 65 20 70 45 78 70 72 20  se if the pExpr 
2a4f0 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66 65 72  expression refer
2a500 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f 6c 75  ences table colu
2a510 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  mns.** that are 
2a520 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65  not found in the
2a530 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
2a540 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f 76 65  ** An index cove
2a550 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69  ring an expressi
2a560 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  on means that th
2a570 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
2a580 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64   be.** evaluated
2a590 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20   using only the 
2a5a0 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68 6f 75  index and withou
2a5b0 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b  t having to look
2a5c0 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  up the.** corres
2a5d0 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 65 6e  ponding table en
2a5e0 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  try..*/.int sqli
2a5f0 74 65 33 45 78 70 72 43 6f 76 65 72 65 64 42 79  te3ExprCoveredBy
2a600 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20 2a 70  Index(.  Expr *p
2a610 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Expr,        /* 
2a620 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
2a630 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  tested */.  int 
2a640 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
2a650 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  /* The cursor nu
2a660 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63 6f 72  mber for the cor
2a670 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
2a680 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
2a690 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  x         /* The
2a6a0 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69 67 68   index that migh
2a6b0 74 20 62 65 20 75 73 65 64 20 66 6f 72 20 63 6f  t be used for co
2a6c0 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57  verage */.){.  W
2a6d0 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63  alker w;.  struc
2a6e0 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f 76 3b  t IdxCover xcov;
2a6f0 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
2a700 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78   sizeof(w));.  x
2a710 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75 72 3b  cov.iCur = iCur;
2a720 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d 20 70  .  xcov.pIdx = p
2a730 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  Idx;.  w.xExprCa
2a740 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49 64 78  llback = exprIdx
2a750 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64  Cover;.  w.u.pId
2a760 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a  xCover = &xcov;.
2a770 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
2a780 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  r(&w, pExpr);.  
2a790 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b  return !w.eCode;
2a7a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .}.../*.** An in
2a7b0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2a7c0 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2a7d0 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  e is used by the
2a7e0 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20   tree walker.** 
2a7f0 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e  to count referen
2a800 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c  ces to table col
2a810 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75  umns in the argu
2a820 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20  ments of an .** 
2a830 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
2a840 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  on, in order to 
2a850 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  implement the.**
2a860 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
2a870 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e  ThisSrc() routin
2a880 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63  e..*/.struct Src
2a890 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73  Count {.  SrcLis
2a8a0 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e  t *pSrc;   /* On
2a8b0 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f  e particular FRO
2a8c0 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65  M clause in a ne
2a8d0 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  sted query */.  
2a8e0 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20  int nThis;      
2a8f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2a900 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
2a910 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  mns in pSrcList 
2a920 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b  */.  int nOther;
2a930 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a940 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
2a950 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65   columns in othe
2a960 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a  r FROM clauses *
2a970 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  /.};../*.** Coun
2a980 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
2a990 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
2a9a0 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lumns..*/.static
2a9b0 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e   int exprSrcCoun
2a9c0 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
2a9d0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
2a9e0 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28  .  /* The NEVER(
2a9f0 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  ) on the second 
2aa00 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20  term is because 
2aa10 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
2aa20 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a  sesThisSrc().  *
2aa30 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c  * is always call
2aa40 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  ed before sqlite
2aa50 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2aa60 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20  egates() and so 
2aa70 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55  the.  ** TK_COLU
2aa80 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74  MNs have not yet
2aa90 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
2aaa0 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
2aab0 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c  MN.  If.  ** sql
2aac0 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
2aad0 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65  ThisSrc() is use
2aae0 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e  d differently in
2aaf0 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65   the future, the
2ab00 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69  .  ** NEVER() wi
2ab10 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ll need to be re
2ab20 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  moved. */.  if( 
2ab30 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
2ab40 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45  LUMN || NEVER(pE
2ab50 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2ab60 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69  COLUMN) ){.    i
2ab70 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
2ab80 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70   SrcCount *p = p
2ab90 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f  Walker->u.pSrcCo
2aba0 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74  unt;.    SrcList
2abb0 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
2abc0 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d  ;.    int nSrc =
2abd0 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53   pSrc ? pSrc->nS
2abe0 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28  rc : 0;.    for(
2abf0 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b  i=0; i<nSrc; i++
2ac00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ){.      if( pEx
2ac10 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  pr->iTable==pSrc
2ac20 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[i].iCursor )
2ac30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2ac40 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a    if( i<nSrc ){.
2ac50 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b        p->nThis++
2ac60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2ac70 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a     p->nOther++;.
2ac80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2ac90 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2aca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
2acb0 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ine if any of th
2acc0 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
2acd0 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f  he pExpr Functio
2ace0 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70  n reference.** p
2acf0 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e  SrcList.  Return
2ad00 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f   true if they do
2ad10 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74  .  Also return t
2ad20 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74  rue if the funct
2ad30 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72  ion.** has no ar
2ad40 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f  guments or has o
2ad50 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  nly constant arg
2ad60 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
2ad70 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a  false if pExpr.*
2ad80 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c  * references col
2ad90 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c  umns but not col
2ada0 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66  umns of tables f
2adb0 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74  ound in pSrcList
2adc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2add0 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
2ade0 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c  Src(Expr *pExpr,
2adf0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
2ae00 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  st){.  Walker w;
2ae10 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75  .  struct SrcCou
2ae20 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74  nt cnt;.  assert
2ae30 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2ae40 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
2ae50 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2ae60 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74  k = exprSrcCount
2ae70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2ae80 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75  lback = 0;.  w.u
2ae90 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e  .pSrcCount = &cn
2aea0 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20  t;.  cnt.pSrc = 
2aeb0 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e  pSrcList;.  cnt.
2aec0 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74  nThis = 0;.  cnt
2aed0 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73  .nOther = 0;.  s
2aee0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
2aef0 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e  st(&w, pExpr->x.
2af00 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
2af10 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20   cnt.nThis>0 || 
2af20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d  cnt.nOther==0;.}
2af30 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
2af40 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
2af50 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2af60 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
2af70 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
2af80 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
2af90 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
2afa0 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
2afb0 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
2afc0 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
2afd0 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69  gInfoColumn(sqli
2afe0 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
2aff0 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
2b000 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c  i;.  pInfo->aCol
2b010 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
2b020 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
2b030 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  db,.       pInfo
2b040 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73  ->aCol,.       s
2b050 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f  izeof(pInfo->aCo
2b060 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70  l[0]),.       &p
2b070 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20  Info->nColumn,. 
2b080 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
2b090 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
2b0a0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
2b0b0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
2b0c0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2b0d0 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
2b0e0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
2b0f0 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
2b100 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
2b110 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
2b120 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
2b130 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
2b140 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65  gInfoFunc(sqlite
2b150 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
2b160 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
2b170 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20  .  pInfo->aFunc 
2b180 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
2b190 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
2b1a0 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  b, .       pInfo
2b1b0 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->aFunc,.       
2b1c0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46  sizeof(pInfo->aF
2b1d0 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  unc[0]),.       
2b1e0 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20  &pInfo->nFunc,. 
2b1f0 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
2b200 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
2b210 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
2b220 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  he xExprCallback
2b230 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b   for a tree walk
2b240 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  er.  It is used 
2b250 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
2b260 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2b270 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20  zeAggregates(). 
2b280 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
2b290 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2b2a0 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f  s.** for additio
2b2b0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
2b2c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2b2d0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28  nalyzeAggregate(
2b2e0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2b2f0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2b300 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
2b310 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61  ntext *pNC = pWa
2b320 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50  lker->u.pNC;.  P
2b330 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
2b340 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72  NC->pParse;.  Sr
2b350 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
2b360 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
2b370 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  .  AggInfo *pAgg
2b380 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67  Info = pNC->pAgg
2b390 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28  Info;..  switch(
2b3a0 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
2b3b0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
2b3c0 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
2b3d0 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
2b3e0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2b3f0 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
2b400 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
2b410 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2b420 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
2b430 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
2b440 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c  o see if the col
2b450 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66  umn is in one of
2b460 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
2b470 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a  he FROM.      **
2b480 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
2b490 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
2b4a0 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  /.      if( ALWA
2b4b0 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20  YS(pSrcList!=0) 
2b4c0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
2b4d0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2b4e0 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74  pItem = pSrcList
2b4f0 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ->a;.        for
2b500 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74  (i=0; i<pSrcList
2b510 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
2b520 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
2b530 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2b540 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20  col *pCol;.     
2b550 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2b560 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2b570 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
2b580 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
2b590 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2b5a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
2b5b0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a  tem->iCursor ){.
2b5c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b5d0 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
2b5e0 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
2b5f0 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72  that pExpr refer
2b600 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20  s to a table.   
2b610 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
2b620 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20   is in the FROM 
2b630 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
2b640 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20  gregate query.  
2b650 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  .            **.
2b660 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d              ** M
2b670 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ake an entry for
2b680 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70   the column in p
2b690 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
2b6a0 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20  if there.       
2b6b0 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61       ** is not a
2b6c0 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c  n entry there al
2b6d0 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20  ready..         
2b6e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2b6f0 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
2b700 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67       pCol = pAgg
2b710 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  Info->aCol;.    
2b720 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
2b730 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   k<pAggInfo->nCo
2b740 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b  lumn; k++, pCol+
2b750 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2b760 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62    if( pCol->iTab
2b770 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
2b780 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
2b790 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
2b7a0 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
2b7b0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
2b7c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2b7e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2b7f0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e           if( (k>
2b800 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  =pAggInfo->nColu
2b810 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn).            
2b820 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49   && (k = addAggI
2b830 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  nfoColumn(pParse
2b840 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29  ->db, pAggInfo))
2b850 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  >=0 .           
2b860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b870 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e    pCol = &pAggIn
2b880 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20  fo->aCol[k];.   
2b890 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2b8a0 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  >pTab = pExpr->p
2b8b0 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Tab;.           
2b8c0 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20     pCol->iTable 
2b8d0 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
2b8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2b8f0 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  Col->iColumn = p
2b900 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
2b910 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2b920 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  l->iMem = ++pPar
2b930 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2b940 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
2b950 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31  orterColumn = -1
2b960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2b970 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45  pCol->pExpr = pE
2b980 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
2b990 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d     if( pAggInfo-
2b9a0 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
2b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
2b9c0 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   j, n;.         
2b9d0 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
2b9e0 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d  *pGB = pAggInfo-
2b9f0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20  >pGroupBy;.     
2ba00 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
2ba10 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2ba20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b  *pTerm = pGB->a;
2ba30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ba40 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b   n = pGB->nExpr;
2ba50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ba60 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a   for(j=0; j<n; j
2ba70 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
2ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba90 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d  Expr *pE = pTerm
2baa0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
2bab0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2bac0 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  E->op==TK_COLUMN
2bad0 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d   && pE->iTable==
2bae0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
2baf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bb00 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75         pE->iColu
2bb10 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
2bb20 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
2bb30 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2bb40 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
2bb50 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j;.             
2bb60 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb80 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2bb90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2bba0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2bbb0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
2bbc0 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  terColumn<0 ){. 
2bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2bbe0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
2bbf0 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  mn = pAggInfo->n
2bc00 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b  SortingColumn++;
2bc10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2bc20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2bc30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2bc40 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e  ere is now an en
2bc50 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e  try for pExpr in
2bc60 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2bc70 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20  ] (either.      
2bc80 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65        ** because
2bc90 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65   it was there be
2bca0 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20  fore or because 
2bcb0 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20  we just created 
2bcc0 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  it)..           
2bcd0 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   ** Convert the 
2bce0 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b  pExpr to be a TK
2bcf0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65  _AGG_COLUMN refe
2bd00 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20  rring to that.  
2bd10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67            ** pAg
2bd20 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e  gInfo->aCol[] en
2bd30 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  try..           
2bd40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2bd50 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
2bd60 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
2bd70 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20  educe);.        
2bd80 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
2bd90 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
2bda0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2bdb0 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43  r->op = TK_AGG_C
2bdc0 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
2bdd0 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
2bde0 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20   (i16)k;.       
2bdf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2be00 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66        } /* endif
2be10 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
2be20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a  pItem->iCursor *
2be30 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65  /.        } /* e
2be40 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72  nd loop over pSr
2be50 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d  cList */.      }
2be60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
2be70 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
2be80 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
2be90 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
2bea0 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61   if( (pNC->ncFla
2beb0 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e  gs & NC_InAggFun
2bec0 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  c)==0.       && 
2bed0 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44  pWalker->walkerD
2bee0 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32  epth==pExpr->op2
2bef0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2bf00 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
2bf10 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  e if pExpr is a 
2bf20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f  duplicate of ano
2bf30 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a  ther aggregate .
2bf40 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
2bf50 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65  ion that is alre
2bf60 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49  ady in the pAggI
2bf70 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
2bf80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2bf90 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2bfa0 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41  func *pItem = pA
2bfb0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20  ggInfo->aFunc;. 
2bfc0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2bfd0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2bfe0 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
2bff0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2c000 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2c010 72 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 45 78  re(0, pItem->pEx
2c020 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d  pr, pExpr, -1)==
2c030 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c040 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2c050 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2c060 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67        if( i>=pAg
2c070 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a  gInfo->nFunc ){.
2c080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78            /* pEx
2c090 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20  pr is original. 
2c0a0 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72   Make a new entr
2c0b0 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  y in pAggInfo->a
2c0c0 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20  Func[].         
2c0d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38   */.          u8
2c0e0 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73   enc = ENC(pPars
2c0f0 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  e->db);.        
2c100 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f    i = addAggInfo
2c110 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  Func(pParse->db,
2c120 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20   pAggInfo);.    
2c130 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29        if( i>=0 )
2c140 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
2c150 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2c160 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2c170 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2c180 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2c190 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46   = &pAggInfo->aF
2c1a0 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  unc[i];.        
2c1b0 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
2c1c0 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
2c1d0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65        pItem->iMe
2c1e0 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
2c1f0 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
2c200 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2c210 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2c220 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
2c230 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2c240 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  m->pFunc = sqlit
2c250 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
2c260 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
2c270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2c280 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a  xpr->u.zToken, .
2c290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2a0 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73     pExpr->x.pLis
2c2b0 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t ? pExpr->x.pLi
2c2c0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65  st->nExpr : 0, e
2c2d0 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
2c2e0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
2c2f0 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
2c300 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ct ){.          
2c310 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
2c320 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
2c330 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
2c340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c350 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
2c360 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
2c370 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c390 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   }.        /* Ma
2c3a0 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74  ke pExpr point t
2c3b0 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
2c3c0 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
2c3d0 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20  c[] entry.      
2c3e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
2c3f0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2c400 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2c410 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2c420 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
2c430 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
2c440 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
2c450 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
2c460 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
2c470 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70  i16)i;.        p
2c480 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
2c490 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
2c4a0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2c4b0 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  une;.      }else
2c4c0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2c4d0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
2c4e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2c4f0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2c500 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
2c510 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
2c520 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57  egatesInSelect(W
2c530 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2c540 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
2c550 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2c560 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20  ETER(pSelect);. 
2c570 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72   pWalker->walker
2c580 44 65 70 74 68 2b 2b 3b 0a 20 20 72 65 74 75 72  Depth++;.  retur
2c590 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2c5a0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e  }.static void an
2c5b0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
2c5c0 6e 53 65 6c 65 63 74 45 6e 64 28 57 61 6c 6b 65  nSelectEnd(Walke
2c5d0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
2c5e0 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
2c5f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2c600 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61  (pSelect);.  pWa
2c610 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74  lker->walkerDept
2c620 68 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  h--;.}../*.** An
2c630 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20  alyze the pExpr 
2c640 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69  expression looki
2c650 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
2c660 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a   functions and.*
2c670 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20  * for variables 
2c680 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
2c690 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f  added to AggInfo
2c6a0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43   object that pNC
2c6b0 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f  ->pAggInfo.** po
2c6c0 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69  ints to.  Additi
2c6d0 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65  onal entries are
2c6e0 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67   made on the Agg
2c6f0 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a  Info object as.*
2c700 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  * necessary..**.
2c710 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2c720 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2c730 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  alled after the 
2c740 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62  expression has b
2c750 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  een.** analyzed 
2c760 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  by sqlite3Resolv
2c770 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f  eExprNames()..*/
2c780 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2c790 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2c7a0 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  es(NameContext *
2c7b0 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pNC, Expr *pExpr
2c7c0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
2c7d0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2c7e0 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2c7f0 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ate;.  w.xSelect
2c800 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
2c810 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2c820 6c 65 63 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63  lect;.  w.xSelec
2c830 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 61 6e 61  tCallback2 = ana
2c840 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
2c850 53 65 6c 65 63 74 45 6e 64 3b 0a 20 20 77 2e 77  SelectEnd;.  w.w
2c860 61 6c 6b 65 72 44 65 70 74 68 20 3d 20 30 3b 0a  alkerDepth = 0;.
2c870 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b    w.u.pNC = pNC;
2c880 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
2c890 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pSrcList!=0 );. 
2c8a0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2c8b0 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (&w, pExpr);.}..
2c8c0 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
2c8d0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2c8e0 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76  regates() for ev
2c8f0 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
2c900 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  n an.** expressi
2c910 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  on list.  Return
2c920 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
2c930 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
2c940 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e  an error is foun
2c950 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  d, the analysis 
2c960 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f  is cut short..*/
2c970 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2c980 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
2c990 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
2c9a0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
2c9b0 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  t){.  struct Exp
2c9c0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
2c9d0 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
2c9e0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
2c9f0 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
2ca00 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
2ca10 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
2ca20 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  em++){.      sql
2ca30 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2ca40 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70  ggregates(pNC, p
2ca50 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
2ca60 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
2ca70 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67   Allocate a sing
2ca80 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20  le new register 
2ca90 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20  for use to hold 
2caa0 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74  some intermediat
2cab0 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74  e result..*/.int
2cac0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2cad0 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
2cae0 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
2caf0 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a  >nTempReg==0 ){.
2cb00 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61      return ++pPa
2cb10 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20  rse->nMem;.  }. 
2cb20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
2cb30 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73  aTempReg[--pPars
2cb40 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a  e->nTempReg];.}.
2cb50 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
2cb60 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61  e a register, ma
2cb70 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66  king available f
2cb80 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d  or reuse for som
2cb90 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f  e other.** purpo
2cba0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  se..**.** If a r
2cbb0 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65  egister is curre
2cbc0 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20  ntly being used 
2cbd0 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  by the column ca
2cbe0 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  che, then.** the
2cbf0 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73   deallocation is
2cc00 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
2cc10 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
2cc20 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a   line that uses.
2cc30 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ** the register 
2cc40 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a  becomes stale..*
2cc50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
2cc60 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72  leaseTempReg(Par
2cc70 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
2cc80 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65  iReg){.  if( iRe
2cc90 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65  g && pParse->nTe
2cca0 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28  mpReg<ArraySize(
2ccb0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2ccc0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
2ccd0 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43      struct yColC
2cce0 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ache *p;.    for
2ccf0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
2cd00 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61  aColCache; i<pPa
2cd10 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
2cd20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20  i++, p++){.     
2cd30 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
2cd40 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  eg ){.        p-
2cd50 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20  >tempReg = 1;.  
2cd60 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2cd70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2cd80 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2cd90 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
2cda0 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d  g++] = iReg;.  }
2cdb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2cdc0 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  te or deallocate
2cdd0 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67   a block of nReg
2cde0 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
2cdf0 69 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  isters..*/.int s
2ce00 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
2ce10 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
2ce20 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
2ce30 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 6e  nt i, n;.  if( n
2ce40 52 65 67 3d 3d 31 20 29 20 72 65 74 75 72 6e 20  Reg==1 ) return 
2ce50 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2ce60 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 20 3d  g(pParse);.  i =
2ce70 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2ce80 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65  eg;.  n = pParse
2ce90 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69  ->nRangeReg;.  i
2cea0 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20  f( nReg<=n ){.  
2ceb0 20 20 61 73 73 65 72 74 28 20 21 75 73 65 64 41    assert( !usedA
2cec0 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
2ced0 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29  rse, i, i+n-1) )
2cee0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
2cef0 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b  angeReg += nReg;
2cf00 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
2cf10 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a  ngeReg -= nReg;.
2cf20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d    }else{.    i =
2cf30 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
2cf40 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
2cf50 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20  m += nReg;.  }. 
2cf60 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69   return i;.}.voi
2cf70 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2cf80 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
2cf90 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
2cfa0 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
2cfb0 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
2cfc0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2cfd0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2cfe0 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75   iReg);.    retu
2cff0 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
2d000 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
2d010 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e  (pParse, iReg, n
2d020 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67  Reg);.  if( nReg
2d030 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52  >pParse->nRangeR
2d040 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  eg ){.    pParse
2d050 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52  ->nRangeReg = nR
2d060 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
2d070 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67  iRangeReg = iReg
2d080 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
2d090 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72  ark all temporar
2d0a0 79 20 72 65 67 69 73 74 65 72 73 20 61 73 20 62  y registers as b
2d0b0 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65  eing unavailable
2d0c0 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76   for reuse..*/.v
2d0d0 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72  oid sqlite3Clear
2d0e0 54 65 6d 70 52 65 67 43 61 63 68 65 28 50 61 72  TempRegCache(Par
2d0f0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
2d100 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20  Parse->nTempReg 
2d110 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
2d120 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a  RangeReg = 0;.}.
2d130 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20  ./*.** Validate 
2d140 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72  that no temporar
2d150 79 20 72 65 67 69 73 74 65 72 20 66 61 6c 6c 73  y register falls
2d160 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67   within the rang
2d170 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e  e of.** iFirst..
2d180 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65  iLast, inclusive
2d190 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2d1a0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f  is only call fro
2d1b0 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  m within assert(
2d1c0 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e  ).** statements.
2d1d0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
2d1e0 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69  E_DEBUG.int sqli
2d1f0 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67  te3NoTempsInRang
2d200 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2d210 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69 6e 74   int iFirst, int
2d220 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 69   iLast){.  int i
2d230 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2d240 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20 20 26  nRangeReg>0.   &
2d250 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  & pParse->iRange
2d260 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e  Reg+pParse->nRan
2d270 67 65 52 65 67 3c 69 4c 61 73 74 0a 20 20 20 26  geReg<iLast.   &
2d280 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  & pParse->iRange
2d290 52 65 67 3e 3d 69 46 69 72 73 74 0a 20 20 29 7b  Reg>=iFirst.  ){
2d2a0 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  .     return 0;.
2d2b0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
2d2c0 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  <pParse->nTempRe
2d2d0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  g; i++){.    if(
2d2e0 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
2d2f0 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20  g[i]>=iFirst && 
2d300 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2d310 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20  [i]<=iLast ){.  
2d320 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2d330 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2d340 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
2d350 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.