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

Artifact f6572c7690fa619e85b1192b683ccc30cd123363415963c061ada3770b18f6a7:


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 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2c80: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
2c90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
2ca0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 65  ointer to a sube
2cb0: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 70 56 65  xpression of pVe
2cc0: 63 74 6f 72 20 74 68 61 74 20 69 73 20 74 68 65  ctor that is the
2cd0: 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 20   i-th.** column 
2ce0: 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20 28 6e  of the vector (n
2cf0: 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
2d00: 20 77 69 74 68 20 30 29 2e 20 20 54 68 65 20 63   with 0).  The c
2d10: 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 65 6e  aller must.** en
2d20: 73 75 72 65 20 74 68 61 74 20 69 20 69 73 20 77  sure that i is w
2d30: 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a 2a 0a  ithin range..**.
2d40: 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69 73  ** If pVector is
2d50: 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6c 61 72   really a scalar
2d60: 20 28 61 6e 64 20 22 73 63 61 6c 61 72 22 20 68   (and "scalar" h
2d70: 65 72 65 20 69 6e 63 6c 75 64 65 73 20 73 75 62  ere includes sub
2d80: 71 75 65 72 69 65 73 0a 2a 2a 20 74 68 61 74 20  queries.** that 
2d90: 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20  return a single 
2da0: 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20 72 65  column!) then re
2db0: 74 75 72 6e 20 70 56 65 63 74 6f 72 20 75 6e 6d  turn pVector unm
2dc0: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 70  odified..**.** p
2dd0: 56 65 63 74 6f 72 20 72 65 74 61 69 6e 73 20 6f  Vector retains o
2de0: 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20  wnership of the 
2df0: 72 65 74 75 72 6e 65 64 20 73 75 62 65 78 70 72  returned subexpr
2e00: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ession..**.** If
2e10: 20 74 68 65 20 76 65 63 74 6f 72 20 69 73 20 61   the vector is a
2e20: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20 74 68   (SELECT ...) th
2e30: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
2e40: 6e 20 72 65 74 75 72 6e 65 64 20 69 73 0a 2a 2a  n returned is.**
2e50: 20 6a 75 73 74 20 74 68 65 20 65 78 70 72 65 73   just the expres
2e60: 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 2d 74  sion for the i-t
2e70: 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65  h term of the re
2e80: 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 6d 61  sult set, and ma
2e90: 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65 61 64  y.** not be read
2ea0: 79 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6f 6e  y for evaluation
2eb0: 20 62 65 63 61 75 73 65 20 74 68 65 20 74 61 62   because the tab
2ec0: 6c 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f  le cursor has no
2ed0: 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20 70 6f  t yet.** been po
2ee0: 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45 78 70  sitioned..*/.Exp
2ef0: 72 20 2a 73 71 6c 69 74 65 33 56 65 63 74 6f 72  r *sqlite3Vector
2f00: 46 69 65 6c 64 53 75 62 65 78 70 72 28 45 78 70  FieldSubexpr(Exp
2f10: 72 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e 74 20  r *pVector, int 
2f20: 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3c  i){.  assert( i<
2f30: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2f40: 72 53 69 7a 65 28 70 56 65 63 74 6f 72 29 20 29  rSize(pVector) )
2f50: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
2f60: 78 70 72 49 73 56 65 63 74 6f 72 28 70 56 65 63  xprIsVector(pVec
2f70: 74 6f 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  tor) ){.    asse
2f80: 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 32  rt( pVector->op2
2f90: 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e  ==0 || pVector->
2fa0: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
2fb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 56 65 63 74  );.    if( pVect
2fc0: 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  or->op==TK_SELEC
2fd0: 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70  T || pVector->op
2fe0: 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  2==TK_SELECT ){.
2ff0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65        return pVe
3000: 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  ctor->x.pSelect-
3010: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
3020: 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  xpr;.    }else{.
3030: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65        return pVe
3040: 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  ctor->x.pList->a
3050: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [i].pExpr;.    }
3060: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 56  .  }.  return pV
3070: 65 63 74 6f 72 3b 0a 7d 0a 23 65 6e 64 69 66 20  ector;.}.#endif 
3080: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
3090: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
30a0: 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
30b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
30c0: 52 59 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  RY./*.** Compute
30d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65   and return a ne
30e0: 77 20 45 78 70 72 20 6f 62 6a 65 63 74 20 77 68  w Expr object wh
30f0: 69 63 68 20 77 68 65 6e 20 70 61 73 73 65 64 20  ich when passed 
3100: 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70  to.** sqlite3Exp
3110: 72 43 6f 64 65 28 29 20 77 69 6c 6c 20 67 65 6e  rCode() will gen
3120: 65 72 61 74 65 20 61 6c 6c 20 6e 65 63 65 73 73  erate all necess
3130: 61 72 79 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70  ary code to comp
3140: 75 74 65 0a 2a 2a 20 74 68 65 20 69 46 69 65 6c  ute.** the iFiel
3150: 64 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  d-th column of t
3160: 68 65 20 76 65 63 74 6f 72 20 65 78 70 72 65 73  he vector expres
3170: 73 69 6f 6e 20 70 56 65 63 74 6f 72 2e 0a 2a 2a  sion pVector..**
3180: 0a 2a 2a 20 49 74 20 69 73 20 6f 6b 20 66 6f 72  .** It is ok for
3190: 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20 61   pVector to be a
31a0: 20 73 63 61 6c 61 72 20 28 61 73 20 6c 6f 6e 67   scalar (as long
31b0: 20 61 73 20 69 46 69 65 6c 64 3d 3d 30 29 2e 20   as iField==0). 
31c0: 20 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73   .** In that cas
31d0: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
31e0: 77 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69 74  works like sqlit
31f0: 65 33 45 78 70 72 44 75 70 28 29 2e 0a 2a 2a 0a  e3ExprDup()..**.
3200: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6f 77  ** The caller ow
3210: 6e 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ns the returned 
3220: 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  Expr object and 
3230: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
3240: 6f 72 0a 2a 2a 20 65 6e 73 75 72 69 6e 67 20 74  or.** ensuring t
3250: 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64  hat the returned
3260: 20 76 61 6c 75 65 20 65 76 65 6e 74 75 61 6c 6c   value eventuall
3270: 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a  y gets freed..**
3280: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 72  .** The caller r
3290: 65 74 61 69 6e 73 20 6f 77 6e 65 72 73 68 69 70  etains ownership
32a0: 20 6f 66 20 70 56 65 63 74 6f 72 2e 20 20 49 66   of pVector.  If
32b0: 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b   pVector is a TK
32c0: 5f 53 45 4c 45 43 54 2c 0a 2a 2a 20 74 68 65 6e  _SELECT,.** then
32d0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62   the returned ob
32e0: 6a 65 63 74 20 77 69 6c 6c 20 72 65 66 65 72 65  ject will refere
32f0: 6e 63 65 20 70 56 65 63 74 6f 72 20 61 6e 64 20  nce pVector and 
3300: 73 6f 20 70 56 65 63 74 6f 72 20 6d 75 73 74 20  so pVector must 
3310: 72 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69 64 20  remain.** valid 
3320: 66 6f 72 20 74 68 65 20 6c 69 66 65 20 6f 66 20  for the life of 
3330: 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a  the returned obj
3340: 65 63 74 2e 20 20 49 66 20 70 56 65 63 74 6f 72  ect.  If pVector
3350: 20 69 73 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a   is a TK_VECTOR.
3360: 2a 2a 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65  ** or a scalar e
3370: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20  xpression, then 
3380: 69 74 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  it can be delete
3390: 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 69  d as soon as thi
33a0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
33b0: 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72  urns..**.** A tr
33c0: 69 63 6b 20 74 6f 20 63 61 75 73 65 20 61 20 54  ick to cause a T
33d0: 4b 5f 53 45 4c 45 43 54 20 70 56 65 63 74 6f 72  K_SELECT pVector
33e0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 74   to be deleted t
33f0: 6f 67 65 74 68 65 72 20 77 69 74 68 0a 2a 2a 20  ogether with.** 
3400: 74 68 65 20 72 65 74 75 72 6e 65 64 20 45 78 70  the returned Exp
3410: 72 20 6f 62 6a 65 63 74 20 69 73 20 74 6f 20 61  r object is to a
3420: 74 74 61 63 68 20 74 68 65 20 70 56 65 63 74 6f  ttach the pVecto
3430: 72 20 74 6f 20 74 68 65 20 70 52 69 67 68 74 20  r to the pRight 
3440: 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68 65 20  field.** of the 
3450: 72 65 74 75 72 6e 65 64 20 54 4b 5f 53 45 4c 45  returned TK_SELE
3460: 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6f  CT_COLUMN Expr o
3470: 62 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a  bject..*/.Expr *
3480: 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65  sqlite3ExprForVe
3490: 63 74 6f 72 46 69 65 6c 64 28 0a 20 20 50 61 72  ctorField(.  Par
34a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
34b0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
34c0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
34d0: 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20 20 2f  pVector,       /
34e0: 2a 20 54 68 65 20 76 65 63 74 6f 72 2e 20 20 4c  * The vector.  L
34f0: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
3500: 6e 73 20 6f 72 20 61 20 73 75 62 2d 53 45 4c 45  ns or a sub-SELE
3510: 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65  CT */.  int iFie
3520: 6c 64 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ld           /* 
3530: 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  Which column of 
3540: 74 68 65 20 76 65 63 74 6f 72 20 74 6f 20 72 65  the vector to re
3550: 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  turn */.){.  Exp
3560: 72 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70  r *pRet;.  if( p
3570: 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53  Vector->op==TK_S
3580: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73  ELECT ){.    ass
3590: 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 66 6c  ert( pVector->fl
35a0: 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
35b0: 63 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  ct );.    /* The
35c0: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
35d0: 4e 20 45 78 70 72 20 6e 6f 64 65 3a 0a 20 20 20  N Expr node:.   
35e0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74   **.    ** pLeft
35f0: 3a 20 20 20 20 20 20 20 20 20 20 20 70 56 65 63  :           pVec
3600: 74 6f 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 54  tor containing T
3610: 4b 5f 53 45 4c 45 43 54 2e 20 20 4e 6f 74 20 64  K_SELECT.  Not d
3620: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 70  eleted..    ** p
3630: 52 69 67 68 74 3a 20 20 20 20 20 20 20 20 20 20  Right:          
3640: 6e 6f 74 20 75 73 65 64 2e 20 20 42 75 74 20 72  not used.  But r
3650: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
3660: 65 64 2e 0a 20 20 20 20 2a 2a 20 69 43 6f 6c 75  ed..    ** iColu
3670: 6d 6e 3a 20 20 20 20 20 20 20 20 20 49 6e 64 65  mn:         Inde
3680: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
3690: 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20   pVector.    ** 
36a0: 69 54 61 62 6c 65 3a 20 20 20 20 20 20 20 20 20  iTable:         
36b0: 20 30 20 6f 72 20 74 68 65 20 6e 75 6d 62 65 72   0 or the number
36c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 74   of columns on t
36d0: 68 65 20 4c 48 53 20 6f 66 20 61 6e 20 61 73 73  he LHS of an ass
36e0: 69 67 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 70  ignment.    ** p
36f0: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3a 20 20 20  Left->iTable:   
3700: 46 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  First in an arra
3710: 79 20 6f 66 20 72 65 67 69 73 74 65 72 20 68 6f  y of register ho
3720: 6c 64 69 6e 67 20 72 65 73 75 6c 74 2c 20 6f 72  lding result, or
3730: 20 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   0.    **       
3740: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 74 68             if th
3750: 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20  e result is not 
3760: 79 65 74 20 63 6f 6d 70 75 74 65 64 2e 0a 20 20  yet computed..  
3770: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 71 6c 69    **.    ** sqli
3780: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 29 20  te3ExprDelete() 
3790: 73 70 65 63 69 66 69 63 61 6c 6c 79 20 73 6b 69  specifically ski
37a0: 70 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65  ps the recursive
37b0: 20 64 65 6c 65 74 65 20 6f 66 0a 20 20 20 20 2a   delete of.    *
37c0: 2a 20 70 4c 65 66 74 20 6f 6e 20 54 4b 5f 53 45  * pLeft on TK_SE
37d0: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
37e0: 73 2e 20 20 42 75 74 20 70 52 69 67 68 74 20 69  s.  But pRight i
37f0: 73 20 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f 20 70  s followed, so p
3800: 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 63 61  Vector.    ** ca
3810: 6e 20 62 65 20 61 74 74 61 63 68 65 64 20 74 6f  n be attached to
3820: 20 70 52 69 67 68 74 20 74 6f 20 63 61 75 73 65   pRight to cause
3830: 20 74 68 69 73 20 6e 6f 64 65 20 74 6f 20 74 61   this node to ta
3840: 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 0a  ke ownership of.
3850: 20 20 20 20 2a 2a 20 70 56 65 63 74 6f 72 2e 20      ** pVector. 
3860: 20 54 79 70 69 63 61 6c 6c 79 20 74 68 65 72 65   Typically there
3870: 20 77 69 6c 6c 20 62 65 20 6d 75 6c 74 69 70 6c   will be multipl
3880: 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  e TK_SELECT_COLU
3890: 4d 4e 20 6e 6f 64 65 73 0a 20 20 20 20 2a 2a 20  MN nodes.    ** 
38a0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 4c  with the same pL
38b0: 65 66 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  eft pointer to t
38c0: 68 65 20 70 56 65 63 74 6f 72 2c 20 62 75 74 20  he pVector, but 
38d0: 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 6d  only one of them
38e0: 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6f 77 6e  .    ** will own
38f0: 20 74 68 65 20 70 56 65 63 74 6f 72 2e 0a 20 20   the pVector..  
3900: 20 20 2a 2f 0a 20 20 20 20 70 52 65 74 20 3d 20    */.    pRet = 
3910: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
3920: 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 5f 43  rse, TK_SELECT_C
3930: 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20  OLUMN, 0, 0);.  
3940: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
3950: 20 20 20 20 70 52 65 74 2d 3e 69 43 6f 6c 75 6d      pRet->iColum
3960: 6e 20 3d 20 69 46 69 65 6c 64 3b 0a 20 20 20 20  n = iField;.    
3970: 20 20 70 52 65 74 2d 3e 70 4c 65 66 74 20 3d 20    pRet->pLeft = 
3980: 70 56 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20  pVector;.    }. 
3990: 20 20 20 61 73 73 65 72 74 28 20 70 52 65 74 3d     assert( pRet=
39a0: 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 69 54 61 62  =0 || pRet->iTab
39b0: 6c 65 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  le==0 );.  }else
39c0: 7b 0a 20 20 20 20 69 66 28 20 70 56 65 63 74 6f  {.    if( pVecto
39d0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52  r->op==TK_VECTOR
39e0: 20 29 20 70 56 65 63 74 6f 72 20 3d 20 70 56 65   ) pVector = pVe
39f0: 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  ctor->x.pList->a
3a00: 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a  [iField].pExpr;.
3a10: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
3a20: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
3a30: 2d 3e 64 62 2c 20 70 56 65 63 74 6f 72 2c 20 30  ->db, pVector, 0
3a40: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
3a50: 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pRet;.}.#endif /
3a60: 2a 20 21 64 65 66 69 6e 65 28 53 51 4c 49 54 45  * !define(SQLITE
3a70: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
3a80: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70  */../*.** If exp
3a90: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
3aa0: 20 6f 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45   of type TK_SELE
3ab0: 43 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  CT, generate cod
3ac0: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a  e to evaluate.**
3ad0: 20 69 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20   it. Return the 
3ae0: 72 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63  register in whic
3af0: 68 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  h the result is 
3b00: 73 74 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74  stored (or, if t
3b10: 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63  he .** sub-selec
3b20: 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74  t returns more t
3b30: 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20  han one column, 
3b40: 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
3b50: 61 72 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69  array.** of regi
3b60: 73 74 65 72 73 20 69 6e 20 77 68 69 63 68 20 74  sters in which t
3b70: 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
3b80: 72 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  red)..**.** If p
3b90: 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b  Expr is not a TK
3ba0: 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69  _SELECT expressi
3bb0: 6f 6e 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  on, return 0..*/
3bc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
3bd0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50 61  CodeSubselect(Pa
3be0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
3bf0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
3c00: 20 72 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65   reg = 0;.#ifnde
3c10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
3c20: 42 51 55 45 52 59 0a 20 20 69 66 28 20 70 45 78  BQUERY.  if( pEx
3c30: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
3c40: 54 20 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73  T ){.    reg = s
3c50: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
3c60: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
3c70: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  r, 0, 0);.  }.#e
3c80: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65  ndif.  return re
3c90: 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  g;.}../*.** Argu
3ca0: 6d 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69  ment pVector poi
3cb0: 6e 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20  nts to a vector 
3cc0: 65 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74  expression - eit
3cd0: 68 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a  her a TK_VECTOR.
3ce0: 2a 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20  ** or TK_SELECT 
3cf0: 74 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72  that returns mor
3d00: 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d  e than one colum
3d10: 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  n. This function
3d20: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20   returns.** the 
3d30: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
3d40: 6f 66 20 61 20 72 65 67 69 73 74 65 72 20 74 68  of a register th
3d50: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
3d60: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d  value of.** elem
3d70: 65 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68  ent iField of th
3d80: 65 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e vector..**.** 
3d90: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
3da0: 54 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73  TK_SELECT expres
3db0: 73 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20  sion, then code 
3dc0: 66 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76 65  for it must have
3dd0: 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65   .** already bee
3de0: 6e 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e  n generated usin
3df0: 67 20 74 68 65 20 65 78 70 72 43 6f 64 65 53 75  g the exprCodeSu
3e00: 62 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e  bselect() routin
3e10: 65 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  e. In this.** ca
3e20: 73 65 20 70 61 72 61 6d 65 74 65 72 20 72 65 67  se parameter reg
3e30: 53 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65  Select should be
3e40: 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e   the first in an
3e50: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
3e60: 65 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  ers.** containin
3e70: 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  g the results of
3e80: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
3e90: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74   .**.** If pVect
3ea0: 6f 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b  or is of type TK
3eb0: 5f 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f  _VECTOR, then co
3ec0: 64 65 20 66 6f 72 20 74 68 65 20 72 65 71 75 65  de for the reque
3ed0: 73 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73  sted field.** is
3ee0: 20 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74   generated. In t
3ef0: 68 69 73 20 63 61 73 65 20 28 2a 70 52 65 67 46  his case (*pRegF
3f00: 72 65 65 29 20 6d 61 79 20 62 65 20 73 65 74 20  ree) may be set 
3f10: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
3f20: 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20  .** a temporary 
3f30: 72 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 66  register to be f
3f40: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
3f50: 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  er before return
3f60: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  ing..**.** Befor
3f70: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74  e returning, out
3f80: 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a  put parameter (*
3f90: 70 70 45 78 70 72 29 20 69 73 20 73 65 74 20 74  ppExpr) is set t
3fa0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a  o point to the.*
3fb0: 2a 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f  * Expr object co
3fc0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65  rresponding to e
3fd0: 6c 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20  lement iElem of 
3fe0: 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73  the vector..*/.s
3ff0: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 56 65  tatic int exprVe
4000: 63 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20  ctorRegister(.  
4010: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4030: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
4040: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63   */.  Expr *pVec
4050: 74 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  tor,            
4060: 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20        /* Vector 
4070: 74 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65  to extract eleme
4080: 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  nt from */.  int
4090: 20 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20   iField,        
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40b0: 46 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74  Field to extract
40c0: 20 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f   from pVector */
40d0: 0a 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74  .  int regSelect
40e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
40f0: 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61     /* First in a
4100: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
4110: 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  s */.  Expr **pp
4120: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
4130: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
4140: 78 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e  xpression elemen
4150: 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67  t */.  int *pReg
4160: 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20  Free            
4170: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54         /* OUT: T
4180: 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20  emp register to 
4190: 66 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  free */.){.  u8 
41a0: 6f 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70  op = pVector->op
41b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ;.  assert( op==
41c0: 54 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d  TK_VECTOR || op=
41d0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20  =TK_REGISTER || 
41e0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
41f0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
4200: 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70  GISTER ){.    *p
4210: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56  pExpr = sqlite3V
4220: 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
4230: 72 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c  r(pVector, iFiel
4240: 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  d);.    return p
4250: 56 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69  Vector->iTable+i
4260: 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28  Field;.  }.  if(
4270: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
4280: 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20  {.    *ppExpr = 
4290: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65  pVector->x.pSele
42a0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46  ct->pEList->a[iF
42b0: 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20  ield].pExpr;.   
42c0: 20 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65    return regSele
42d0: 63 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20  ct+iField;.  }. 
42e0: 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74   *ppExpr = pVect
42f0: 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  or->x.pList->a[i
4300: 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20  Field].pExpr;.  
4310: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
4320: 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
4330: 65 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67  e, *ppExpr, pReg
4340: 46 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Free);.}../*.** 
4350: 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  Expression pExpr
4360: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
4370: 20 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63   between two vec
4380: 74 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70  tor values. Comp
4390: 75 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  ute.** the resul
43a0: 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  t of the compari
43b0: 73 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55  son (1, 0, or NU
43c0: 4c 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74 68  LL) and write th
43d0: 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74  at.** result int
43e0: 6f 20 72 65 67 69 73 74 65 72 20 64 65 73 74 2e  o register dest.
43f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
4400: 72 20 6d 75 73 74 20 73 61 74 69 73 66 79 20 74  r must satisfy t
4410: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65  he following pre
4420: 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a  conditions:.**.*
4430: 2a 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f  *    if pExpr->o
4440: 70 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f  p==TK_IS:      o
4450: 70 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d  p==TK_EQ and p5=
4460: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a  =SQLITE_NULLEQ.*
4470: 2a 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f  *    if pExpr->o
4480: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f  p==TK_ISNOT:   o
4490: 70 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d  p==TK_NE and p5=
44a0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a  =SQLITE_NULLEQ.*
44b0: 2a 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20  *    otherwise: 
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
44d0: 70 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  p==pExpr->op and
44e0: 20 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63   p5==0.*/.static
44f0: 20 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72   void codeVector
4500: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
4510: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4520: 20 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74   /* Code generat
4530: 6f 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  or context */.  
4540: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
4550: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
4560: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
4570: 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  n */.  int dest,
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4590: 57 72 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e  Write results in
45a0: 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72  to this register
45b0: 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20   */.  u8 op,    
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
45d0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
45e0: 6f 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20  or */.  u8 p5   
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4600: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f   SQLITE_NULLEQ o
4610: 72 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56  r zero */.){.  V
4620: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
4630: 3e 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a  >pVdbe;.  Expr *
4640: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
4650: 4c 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52  Left;.  Expr *pR
4660: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
4670: 69 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66  ight;.  int nLef
4680: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  t = sqlite3ExprV
4690: 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29  ectorSize(pLeft)
46a0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
46b0: 20 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20   regLeft = 0;.  
46c0: 69 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30  int regRight = 0
46d0: 3b 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b  ;.  u8 opx = op;
46e0: 0a 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20  .  int addrDone 
46f0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
4700: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66  eLabel(v);..  if
4710: 28 20 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33  ( nLeft!=sqlite3
4720: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
4730: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71  Right) ){.    sq
4740: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4750: 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65  arse, "row value
4760: 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20   misused");.    
4770: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
4780: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
4790: 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d  =TK_EQ || pExpr-
47a0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20  >op==TK_NE .    
47b0: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d     || pExpr->op=
47c0: 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d  =TK_IS || pExpr-
47d0: 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20  >op==TK_ISNOT . 
47e0: 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
47f0: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78  op==TK_LT || pEx
4800: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20  pr->op==TK_GT . 
4810: 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
4820: 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78  op==TK_LE || pEx
4830: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20  pr->op==TK_GE . 
4840: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
4850: 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28  xpr->op==op || (
4860: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4870: 20 26 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20   && op==TK_EQ). 
4880: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
4890: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
48a0: 4f 54 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29  OT && op==TK_NE)
48b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35   );.  assert( p5
48c0: 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  ==0 || pExpr->op
48d0: 21 3d 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74  !=op );.  assert
48e0: 28 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  ( p5==SQLITE_NUL
48f0: 4c 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  LEQ || pExpr->op
4900: 3d 3d 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d  ==op );..  p5 |=
4910: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b   SQLITE_STOREP2;
4920: 0a 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c  .  if( opx==TK_L
4930: 45 20 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b  E ) opx = TK_LT;
4940: 0a 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47  .  if( opx==TK_G
4950: 45 20 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b  E ) opx = TK_GT;
4960: 0a 0a 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78  ..  regLeft = ex
4970: 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  prCodeSubselect(
4980: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
4990: 20 20 72 65 67 52 69 67 68 74 20 3d 20 65 78 70    regRight = exp
49a0: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  rCodeSubselect(p
49b0: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
49c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a  .  for(i=0; 1 /*
49d0: 4c 6f 6f 70 20 65 78 69 74 73 20 62 79 20 22 62  Loop exits by "b
49e0: 72 65 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20  reak"*/; i++){. 
49f0: 20 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20     int regFree1 
4a00: 3d 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20  = 0, regFree2 = 
4a10: 30 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c  0;.    Expr *pL,
4a20: 20 2a 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72   *pR; .    int r
4a30: 31 2c 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72  1, r2;.    asser
4a40: 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65  t( i>=0 && i<nLe
4a50: 66 74 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e  ft );.    if( i>
4a60: 30 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43  0 ) sqlite3ExprC
4a70: 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
4a80: 3b 0a 20 20 20 20 72 31 20 3d 20 65 78 70 72 56  ;.    r1 = exprV
4a90: 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50  ectorRegister(pP
4aa0: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20  arse, pLeft, i, 
4ab0: 72 65 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72  regLeft, &pL, &r
4ac0: 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32  egFree1);.    r2
4ad0: 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67   = exprVectorReg
4ae0: 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 52  ister(pParse, pR
4af0: 69 67 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68  ight, i, regRigh
4b00: 74 2c 20 26 70 52 2c 20 26 72 65 67 46 72 65 65  t, &pR, &regFree
4b10: 32 29 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70  2);.    codeComp
4b20: 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20  are(pParse, pL, 
4b30: 70 52 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c  pR, opx, r1, r2,
4b40: 20 64 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20   dest, p5);.    
4b50: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4b60: 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
4b70: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
4b80: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4b90: 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
4ba0: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4bb0: 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74  OP_Le);.    test
4bc0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
4bd0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4be0: 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
4bf0: 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f    testcase(op==O
4c00: 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
4c10: 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
4c20: 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  e);.    testcase
4c30: 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62  (op==OP_Eq); Vdb
4c40: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4c50: 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65  ==OP_Eq);.    te
4c60: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
4c70: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4c80: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  f(v,op==OP_Ne);.
4c90: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
4ca0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
4cb0: 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20  , regFree1);.   
4cc0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
4cd0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
4ce0: 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66  egFree2);.    if
4cf0: 28 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45  ( i>0 ) sqlite3E
4d00: 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
4d10: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  se);.    if( i==
4d20: 6e 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20  nLeft-1 ){.     
4d30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4d40: 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51    if( opx==TK_EQ
4d50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4d60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4d70: 50 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61  P_IfNot, dest, a
4d80: 64 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f  ddrDone); VdbeCo
4d90: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
4da0: 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45   p5 |= SQLITE_KE
4db0: 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  EPNULL;.    }els
4dc0: 65 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45  e if( opx==TK_NE
4dd0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4de0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4df0: 50 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72  P_If, dest, addr
4e00: 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Done); VdbeCover
4e10: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35  age(v);.      p5
4e20: 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e   |= SQLITE_KEEPN
4e30: 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
4e40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70        assert( op
4e50: 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54  ==TK_LT || op==T
4e60: 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c  K_GT || op==TK_L
4e70: 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29  E || op==TK_GE )
4e80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4e90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4ea0: 45 6c 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64  ElseNotEq, 0, ad
4eb0: 64 72 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56  drDone);.      V
4ec0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4ed0: 20 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20   op==TK_LT);.   
4ee0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
4ef0: 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b  f(v, op==TK_GT);
4f00: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
4f10: 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
4f20: 4c 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  LE);.      VdbeC
4f30: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
4f40: 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69  =TK_GE);.      i
4f50: 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20  f( i==nLeft-2 ) 
4f60: 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a  opx = op;.    }.
4f70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
4f80: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
4f90: 20 61 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23   addrDone);.}..#
4fa0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  if SQLITE_MAX_EX
4fb0: 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a  PR_DEPTH>0./*.**
4fc0: 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75   Check that argu
4fd0: 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20  ment nHeight is 
4fe0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
4ff0: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
5000: 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  m.** expression 
5010: 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49  depth allowed. I
5020: 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61  f it is not, lea
5030: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
5040: 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  age in.** pParse
5050: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5060: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
5070: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
5080: 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69  nt nHeight){.  i
5090: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
50a0: 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68  K;.  int mxHeigh
50b0: 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  t = pParse->db->
50c0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
50d0: 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b  MIT_EXPR_DEPTH];
50e0: 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d  .  if( nHeight>m
50f0: 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73  xHeight ){.    s
5100: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5110: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22  Parse, .       "
5120: 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  Expression tree 
5130: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61  is too large (ma
5140: 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22  ximum depth %d)"
5150: 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29  , mxHeight.    )
5160: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
5170: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
5180: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
5190: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  The following th
51a0: 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68  ree functions, h
51b0: 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68  eightOfExpr(), h
51c0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
51d0: 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f  ).** and heightO
51e0: 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75  fSelect(), are u
51f0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
5200: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
5210: 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78  ght.** of any ex
5220: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
5230: 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20  ferenced by the 
5240: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
5250: 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   as the.** first
5260: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
5270: 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d   If this maximum
5280: 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74   height is great
5290: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
52a0: 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65  ent value pointe
52b0: 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69  d.** to by pnHei
52c0: 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ght, the second 
52d0: 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20  parameter, then 
52e0: 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f  set *pnHeight to
52f0: 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a   that.** value..
5300: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
5310: 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72  eightOfExpr(Expr
5320: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
5330: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
5340: 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67      if( p->nHeig
5350: 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a  ht>*pnHeight ){.
5360: 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20        *pnHeight 
5370: 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20  = p->nHeight;.  
5380: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
5390: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
53a0: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
53b0: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
53c0: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
53d0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
53e0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
53f0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68  r; i++){.      h
5400: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61  eightOfExpr(p->a
5410: 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69  [i].pExpr, pnHei
5420: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
5430: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
5440: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c  ightOfSelect(Sel
5450: 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ect *p, int *pnH
5460: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
5470: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
5480: 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  xpr(p->pWhere, p
5490: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
54a0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48  ightOfExpr(p->pH
54b0: 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29  aving, pnHeight)
54c0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
54d0: 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e  pr(p->pLimit, pn
54e0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
54f0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66  ghtOfExpr(p->pOf
5500: 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  fset, pnHeight);
5510: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5520: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
5530: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5540: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5550: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
5560: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5570: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
5580: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
5590: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
55a0: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69  OfSelect(p->pPri
55b0: 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  or, pnHeight);. 
55c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
55d0: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
55e0: 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65   variable in the
55f0: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
5600: 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75  d as an .** argu
5610: 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73  ment. An express
5620: 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c  ion with no chil
5630: 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74  dren, Expr.pList
5640: 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65   or .** Expr.pSe
5650: 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20  lect member has 
5660: 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41  a height of 1. A
5670: 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
5680: 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69  ion.** has a hei
5690: 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ght equal to the
56a0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
56b0: 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a  of any other .**
56c0: 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72   referenced Expr
56d0: 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a   plus one..**.**
56e0: 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20   Also propagate 
56f0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
5700: 67 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e  gs up from Expr.
5710: 78 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e  x.pList to Expr.
5720: 66 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70  flags,.** if app
5730: 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
5740: 74 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74  tic void exprSet
5750: 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b  Height(Expr *p){
5760: 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d  .  int nHeight =
5770: 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78   0;.  heightOfEx
5780: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48  pr(p->pLeft, &nH
5790: 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74  eight);.  height
57a0: 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  OfExpr(p->pRight
57b0: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69  , &nHeight);.  i
57c0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
57d0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
57e0: 63 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ct) ){.    heigh
57f0: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70  tOfSelect(p->x.p
5800: 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74  Select, &nHeight
5810: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
5820: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
5830: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5840: 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  t(p->x.pList, &n
5850: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e  Height);.    p->
5860: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
5870: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
5880: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
5890: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  x.pList);.  }.  
58a0: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
58b0: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
58c0: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
58d0: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
58e0: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53   using the exprS
58f0: 65 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74  etHeight() funct
5900: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68  ion. If.** the h
5910: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
5920: 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75   than the maximu
5930: 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73  m allowed expres
5940: 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c  sion depth,.** l
5950: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
5960: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41   pParse..**.** A
5970: 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c  lso propagate al
5980: 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66  l EP_Propagate f
5990: 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78  lags from the Ex
59a0: 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a  pr.x.pList into.
59b0: 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a  ** Expr.flags. .
59c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
59d0: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
59e0: 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72  lags(Parse *pPar
59f0: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
5a00: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
5a10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70   ) return;.  exp
5a20: 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20  rSetHeight(p);. 
5a30: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
5a40: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
5a50: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a  p->nHeight);.}..
5a60: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5a70: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
5a80: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
5a90: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
5aa0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65  d.** by the sele
5ab0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
5ac0: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
5ad0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
5ae0: 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
5af0: 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ht(Select *p){. 
5b00: 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30   int nHeight = 0
5b10: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
5b20: 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b  ct(p, &nHeight);
5b30: 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68  .  return nHeigh
5b40: 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42  t;.}.#else /* AB
5b50: 4f 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66  OVE:  Height enf
5b60: 6f 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64  orcement enabled
5b70: 2e 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74  .  BELOW: Height
5b80: 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66   enforcement off
5b90: 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67   */./*.** Propag
5ba0: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
5bb0: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
5bc0: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
5bd0: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
5be0: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
5bf0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
5c00: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
5c10: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
5c20: 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70  p){.  if( p && p
5c30: 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78  ->x.pList && !Ex
5c40: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5c50: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
5c60: 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  {.    p->flags |
5c70: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
5c80: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5c90: 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74  Flags(p->x.pList
5ca0: 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  );.  }.}.#define
5cb0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79   exprSetHeight(y
5cc0: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
5cd0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
5ce0: 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  H>0 */../*.** Th
5cf0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
5d00: 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72  e core allocator
5d10: 20 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e   for Expr nodes.
5d20: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  .**.** Construct
5d30: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
5d40: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
5d50: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
5d60: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
5d70: 72 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20  r this node and 
5d80: 66 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61  for the pToken a
5d90: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e  rgument is a sin
5da0: 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  gle allocation.*
5db0: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
5dc0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
5dd0: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
5de0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
5df0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
5e00: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
5e10: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
5e20: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  ets freed..**.**
5e30: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74   If dequote is t
5e40: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  rue, then the to
5e50: 6b 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74  ken (if it exist
5e60: 73 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a  s) is dequoted..
5e70: 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73  ** If dequote is
5e80: 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f   false, no dequo
5e90: 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65  ting is performe
5ea0: 64 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a  d.  The deQuote.
5eb0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
5ec0: 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65  ignored if pToke
5ed0: 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  n is NULL or if 
5ee0: 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e  the token does n
5ef0: 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20  ot.** appear to 
5f00: 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74  be quoted.  If t
5f10: 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f  he quotes were o
5f20: 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22  f the form "..."
5f30: 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29   (double-quotes)
5f40: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f  .** then the EP_
5f50: 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69  DblQuoted flag i
5f60: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70  s set on the exp
5f70: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a  ression node..**
5f80: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65  .** Special case
5f90: 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54  :  If op==TK_INT
5fa0: 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20  EGER and pToken 
5fb0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
5fc0: 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ng that.** can b
5fd0: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  e translated int
5fe0: 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  o a 32-bit integ
5ff0: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  er, then the tok
6000: 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f  en is not.** sto
6010: 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e  red in u.zToken.
6020: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69    Instead, the i
6030: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73  nteger values is
6040: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
6050: 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68   u.iValue and th
6060: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
6070: 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65  ag is set.  No e
6080: 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20  xtra storage.** 
6090: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  is allocated to 
60a0: 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72  hold the integer
60b0: 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65   text and the de
60c0: 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67  quote flag is ig
60d0: 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  nored..*/.Expr *
60e0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
60f0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
6110: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
6120: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 29  3DbMallocRawNN()
6130: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6150: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
6160: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  de */.  const To
6170: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20  ken *pToken,    
6180: 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  /* Token argumen
6190: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
61a0: 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  L */.  int dequo
61b0: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
61c0: 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74  * True to dequot
61d0: 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  e */.){.  Expr *
61e0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74  pNew;.  int nExt
61f0: 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56  ra = 0;.  int iV
6200: 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  alue = 0;..  ass
6210: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
6220: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
6230: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54    if( op!=TK_INT
6240: 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e  EGER || pToken->
6250: 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  z==0.          |
6260: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
6270: 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56  2(pToken->z, &iV
6280: 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
6290: 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65    nExtra = pToke
62a0: 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73  n->n+1;.      as
62b0: 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20  sert( iValue>=0 
62c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
62d0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
62e0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
62f0: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
6300: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
6310: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e  ){.    memset(pN
6320: 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ew, 0, sizeof(Ex
6330: 70 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pr));.    pNew->
6340: 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20  op = (u8)op;.   
6350: 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31   pNew->iAgg = -1
6360: 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e  ;.    if( pToken
6370: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45   ){.      if( nE
6380: 78 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xtra==0 ){.     
6390: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
63a0: 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20  = EP_IntValue;. 
63b0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69         pNew->u.i
63c0: 56 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a  Value = iValue;.
63d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
63e0: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f       pNew->u.zTo
63f0: 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ken = (char*)&pN
6400: 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61  ew[1];.        a
6410: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a  ssert( pToken->z
6420: 21 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e  !=0 || pToken->n
6430: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
6440: 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d  f( pToken->n ) m
6450: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54  emcpy(pNew->u.zT
6460: 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c  oken, pToken->z,
6470: 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20   pToken->n);.   
6480: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f       pNew->u.zTo
6490: 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d  ken[pToken->n] =
64a0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
64b0: 64 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74  dequote && sqlit
64c0: 65 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e  e3Isquote(pNew->
64d0: 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a  u.zToken[0]) ){.
64e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
64f0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  ew->u.zToken[0]=
6500: 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61  ='"' ) pNew->fla
6510: 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74  gs |= EP_DblQuot
6520: 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ed;.          sq
6530: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65  lite3Dequote(pNe
6540: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  w->u.zToken);.  
6550: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6560: 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
6570: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
6580: 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69  0.    pNew->nHei
6590: 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20  ght = 1;.#endif 
65a0: 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70   .  }.  return p
65b0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  New;.}../*.** Al
65c0: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70  locate a new exp
65d0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f  ression node fro
65e0: 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  m a zero-termina
65f0: 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  ted token that h
6600: 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65  as.** already be
6610: 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a  en dequoted..*/.
6620: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
6630: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
6640: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
6650: 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74  Handle for sqlit
6660: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29  e3DbMallocZero()
6670: 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a   (may be null) *
6680: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
6690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
66a0: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
66b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
66c0: 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a   *zToken      /*
66d0: 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e   Token argument.
66e0: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
66f0: 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b  */.){.  Token x;
6700: 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b  .  x.z = zToken;
6710: 0a 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20  .  x.n = zToken 
6720: 3f 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ? sqlite3Strlen3
6730: 30 28 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20  0(zToken) : 0;. 
6740: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
6750: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c  xprAlloc(db, op,
6760: 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   &x, 0);.}../*.*
6770: 2a 20 41 74 74 61 63 68 20 73 75 62 74 72 65 65  * Attach subtree
6780: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
6790: 68 74 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e  ht to the Expr n
67a0: 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a  ode pRoot..**.**
67b0: 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20   If pRoot==NULL 
67c0: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
67d0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
67e0: 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ion error has oc
67f0: 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68  curred..** In th
6800: 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20  at case, delete 
6810: 74 68 65 20 73 75 62 74 72 65 65 73 20 70 4c 65  the subtrees pLe
6820: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
6830: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
6840: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
6850: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6860: 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a  .  Expr *pRoot,.
6870: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20    Expr *pLeft,. 
6880: 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b   Expr *pRight.){
6890: 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20  .  if( pRoot==0 
68a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
68b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
68c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
68d0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65  prDelete(db, pLe
68e0: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
68f0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
6900: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
6910: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20  .    if( pRight 
6920: 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  ){.      pRoot->
6930: 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b  pRight = pRight;
6940: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c  .      pRoot->fl
6950: 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67  ags |= EP_Propag
6960: 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c  ate & pRight->fl
6970: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ags;.    }.    i
6980: 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  f( pLeft ){.    
6990: 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d    pRoot->pLeft =
69a0: 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52   pLeft;.      pR
69b0: 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  oot->flags |= EP
69c0: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65  _Propagate & pLe
69d0: 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ft->flags;.    }
69e0: 0a 20 20 20 20 65 78 70 72 53 65 74 48 65 69 67  .    exprSetHeig
69f0: 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d  ht(pRoot);.  }.}
6a00: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
6a10: 20 61 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68   an Expr node wh
6a20: 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e  ich joins as man
6a30: 79 20 61 73 20 74 77 6f 20 73 75 62 74 72 65 65  y as two subtree
6a40: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20  s..**.** One or 
6a50: 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62 74  both of the subt
6a60: 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c  rees can be NULL
6a70: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
6a80: 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a  ter to the new.*
6a90: 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72  * Expr node.  Or
6aa0: 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  , if an OOM erro
6ab0: 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50  r occurs, set pP
6ac0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
6ad0: 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20  Failed,.** free 
6ae0: 74 68 65 20 73 75 62 74 72 65 65 73 20 61 6e 64  the subtrees and
6af0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
6b00: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45  .Expr *sqlite3PE
6b10: 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  xpr(.  Parse *pP
6b20: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
6b30: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
6b40: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6b60: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63  * Expression opc
6b70: 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ode */.  Expr *p
6b80: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
6b90: 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64   /* Left operand
6ba0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
6bb0: 68 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht            /*
6bc0: 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   Right operand *
6bd0: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  /.){.  Expr *p;.
6be0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44    if( op==TK_AND
6bf0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
6c00: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61  ==0 ){.    /* Ta
6c10: 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ke advantage of 
6c20: 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61  short-circuit fa
6c30: 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  lse optimization
6c40: 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20   for AND */.    
6c50: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  p = sqlite3ExprA
6c60: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
6c70: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
6c80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
6c90: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6ca0: 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c  awNN(pParse->db,
6cb0: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
6cc0: 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
6cd0: 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
6ce0: 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
6cf0: 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f 70 20       p->op = op 
6d00: 26 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a 20 20  & TKFLG_MASK;.  
6d10: 20 20 20 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31      p->iAgg = -1
6d20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6d30: 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62  te3ExprAttachSub
6d40: 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62  trees(pParse->db
6d50: 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  , p, pLeft, pRig
6d60: 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ht);.  }.  if( p
6d70: 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   ) {.    sqlite3
6d80: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
6d90: 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67  pParse, p->nHeig
6da0: 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ht);.  }.  retur
6db0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n p;.}../*.** Ad
6dc0: 64 20 70 53 65 6c 65 63 74 20 74 6f 20 74 68 65  d pSelect to the
6dd0: 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20   Expr.x.pSelect 
6de0: 66 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70  field.  Or, if p
6df0: 45 78 70 72 20 69 73 20 4e 55 4c 4c 20 28 64 75  Expr is NULL (du
6e00: 65 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79  e.** do a memory
6e10: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
6e20: 75 72 65 29 20 74 68 65 6e 20 64 65 6c 65 74 65  ure) then delete
6e30: 20 74 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a   the pSelect obj
6e40: 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ect..*/.void sql
6e50: 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65  ite3PExprAddSele
6e60: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
6e70: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53  , Expr *pExpr, S
6e80: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
6e90: 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a  .  if( pExpr ){.
6ea0: 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65      pExpr->x.pSe
6eb0: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a  lect = pSelect;.
6ec0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
6ed0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
6ee0: 73 53 65 6c 65 63 74 7c 45 50 5f 53 75 62 71 75  sSelect|EP_Subqu
6ef0: 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ery);.    sqlite
6f00: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e  3ExprSetHeightAn
6f10: 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70  dFlags(pParse, p
6f20: 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Expr);.  }else{.
6f30: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
6f40: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
6f50: 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69  iled );.    sqli
6f60: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
6f70: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c  pParse->db, pSel
6f80: 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  ect);.  }.}.../*
6f90: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
6fa0: 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20  ssion is always 
6fb0: 65 69 74 68 65 72 20 54 52 55 45 20 6f 72 20 46  either TRUE or F
6fc0: 41 4c 53 45 20 28 72 65 73 70 65 63 74 69 76 65  ALSE (respective
6fd0: 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  ly),.** then ret
6fe0: 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63  urn 1.  If one c
6ff0: 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20  annot determine 
7000: 74 68 65 20 74 72 75 74 68 20 76 61 6c 75 65 20  the truth value 
7010: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
7020: 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d  sion at compile-
7030: 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  time return 0..*
7040: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
7050: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
7060: 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72  f is OK to retur
7070: 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20 69 66  n 0 here even if
7080: 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
7090: 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77  on really is alw
70a0: 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c  ays false or fal
70b0: 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61  se (a false nega
70c0: 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74  tive)..** But it
70d0: 20 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74   is a bug to ret
70e0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
70f0: 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61  ression might ha
7100: 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ve different.** 
7110: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69  boolean values i
7120: 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69 72 63  n different circ
7130: 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c  umstances (a fal
7140: 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a  se positive.).**
7150: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
7160: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7170: 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69  is part of condi
7180: 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20  tional for a.** 
7190: 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
71a0: 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d  we cannot determ
71b0: 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ine at compile-t
71c0: 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ime whether or n
71d0: 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65  ot.** is it true
71e0: 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c   or false, so al
71f0: 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ways return 0..*
7200: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
7210: 72 41 6c 77 61 79 73 54 72 75 65 28 45 78 70 72  rAlwaysTrue(Expr
7220: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20   *p){.  int v = 
7230: 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  0;.  if( ExprHas
7240: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
7250: 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
7260: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
7270: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
7280: 28 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e  (p, &v) ) return
7290: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d   0;.  return v!=
72a0: 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  0;.}.static int 
72b0: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
72c0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
72d0: 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70  v = 0;.  if( Exp
72e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
72f0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72  EP_FromJoin) ) r
7300: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
7310: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
7320: 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65  eger(p, &v) ) re
7330: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
7340: 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   v==0;.}../*.** 
7350: 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73  Join two express
7360: 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e  ions using an AN
7370: 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  D operator.  If 
7380: 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f  either expressio
7390: 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68  n is.** NULL, th
73a0: 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  en just return t
73b0: 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
73c0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e  ion..**.** If on
73d0: 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74  e side or the ot
73e0: 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69  her of the AND i
73f0: 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61  s known to be fa
7400: 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  lse, then instea
7410: 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e  d.** of returnin
7420: 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73  g an AND express
7430: 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  ion, just return
7440: 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
7450: 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61  ession with.** a
7460: 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e   value of false.
7470: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
7480: 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33  3ExprAnd(sqlite3
7490: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66   *db, Expr *pLef
74a0: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29  t, Expr *pRight)
74b0: 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30  {.  if( pLeft==0
74c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
74d0: 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69  Right;.  }else i
74e0: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( pRight==0 ){.
74f0: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74      return pLeft
7500: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78  ;.  }else if( ex
7510: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c  prAlwaysFalse(pL
7520: 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61  eft) || exprAlwa
7530: 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20  ysFalse(pRight) 
7540: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
7550: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65  prDelete(db, pLe
7560: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
7570: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7580: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
7590: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
75a0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
75b0: 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
75c0: 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20  okens[0], 0);.  
75d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20  }else{.    Expr 
75e0: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
75f0: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
7600: 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  AND, 0, 0);.    
7610: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
7620: 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e  hSubtrees(db, pN
7630: 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  ew, pLeft, pRigh
7640: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  t);.    return p
7650: 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  New;.  }.}../*.*
7660: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
7670: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
7680: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
7690: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
76a0: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
76b0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
76c0: 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20  rFunction(Parse 
76d0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
76e0: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
76f0: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
7700: 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65   *pNew;.  sqlite
7710: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
7720: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  db;.  assert( pT
7730: 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d  oken );.  pNew =
7740: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
7750: 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f  c(db, TK_FUNCTIO
7760: 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20  N, pToken, 1);. 
7770: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
7780: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
7790: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
77a0: 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d  ist); /* Avoid m
77b0: 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20  emory leak when 
77c0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
77d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
77e0: 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73  }.  pNew->x.pLis
77f0: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73  t = pList;.  ass
7800: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
7810: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
7820: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73  IsSelect) );.  s
7830: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
7840: 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72  ghtAndFlags(pPar
7850: 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74  se, pNew);.  ret
7860: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
7870: 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69  ** Assign a vari
7880: 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61  able number to a
7890: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
78a0: 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64  t encodes a wild
78b0: 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f  card.** in the o
78c0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
78d0: 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57  ement.  .**.** W
78e0: 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74  ildcards consist
78f0: 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
7900: 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  "?" are assigned
7910: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
7920: 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  tial.** variable
7930: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   number..**.** W
7940: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
7950: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20  form "?nnn" are 
7960: 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d  assigned the num
7970: 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d  ber "nnn".  We m
7980: 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e  ake.** sure "nnn
7990: 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69 67  " is not too big
79a0: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
79b0: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
79c0: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
79d0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
79e0: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
79f0: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
7a00: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
7a10: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
7a20: 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61  , "@aaa", or "$a
7a30: 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  aa" are assigned
7a40: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
7a50: 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69  .** as the previ
7a60: 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ous instance of 
7a70: 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72  the same wildcar
7a80: 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69  d.  Or if this i
7a90: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  s the first.** i
7aa0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77  nstance of the w
7ab0: 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78  ildcard, the nex
7ac0: 74 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72  t sequential var
7ad0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a  iable number is.
7ae0: 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a  ** assigned..*/.
7af0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
7b00: 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28  AssignVarNumber(
7b10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
7b20: 78 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32 20  xpr *pExpr, u32 
7b30: 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  n){.  sqlite3 *d
7b40: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
7b50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
7b60: 0a 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20 69  .  ynVar x;..  i
7b70: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
7b80: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
7b90: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
7ba0: 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
7bb0: 6c 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45  lue|EP_Reduced|E
7bc0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a  P_TokenOnly) );.
7bd0: 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a    z = pExpr->u.z
7be0: 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28  Token;.  assert(
7bf0: 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   z!=0 );.  asser
7c00: 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  t( z[0]!=0 );.  
7c10: 61 73 73 65 72 74 28 20 6e 3d 3d 73 71 6c 69 74  assert( n==sqlit
7c20: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b  e3Strlen30(z) );
7c30: 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29  .  if( z[1]==0 )
7c40: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
7c50: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
7c60: 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e  ".  Assign the n
7c70: 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ext variable num
7c80: 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ber */.    asser
7c90: 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a  t( z[0]=='?' );.
7ca0: 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28      x = (ynVar)(
7cb0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b  ++pParse->nVar);
7cc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
7cd0: 74 20 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20  t doAdd = 0;.   
7ce0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29   if( z[0]=='?' )
7cf0: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
7d00: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
7d10: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
7d20: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
7d30: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a  eger and.      *
7d40: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
7d50: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7d60: 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a  */.      i64 i;.
7d70: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20        int bOk;. 
7d80: 20 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b       if( n==2 ){
7d90: 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d   /*OPTIMIZATION-
7da0: 49 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20  IF-TRUE*/.      
7db0: 20 20 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20    i = z[1]-'0'; 
7dc0: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
7dd0: 61 73 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20  ase of ?N for a 
7de0: 73 69 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a  single digit N *
7df0: 2f 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20  /.        bOk = 
7e00: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
7e10: 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d          bOk = 0=
7e20: 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26  =sqlite3Atoi64(&
7e30: 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53  z[1], &i, n-1, S
7e40: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
7e50: 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
7e60: 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ase( i==0 );.   
7e70: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
7e80: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
7e90: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
7ea0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7eb0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
7ec0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
7ed0: 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69  case( i==db->aLi
7ee0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
7ef0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
7f00: 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ] );.      if( b
7f10: 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20  Ok==0 || i<1 || 
7f20: 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  i>db->aLimit[SQL
7f30: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
7f40: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
7f50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7f60: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
7f70: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d  ariable number m
7f80: 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f  ust be between ?
7f90: 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20  1 and ?%d",.    
7fa0: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d          db->aLim
7fb0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7fc0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
7fd0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
7fe0: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
7ff0: 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20   x = (ynVar)i;. 
8000: 20 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73       if( x>pPars
8010: 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20  e->nVar ){.     
8020: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20     pParse->nVar 
8030: 3d 20 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20  = (int)x;.      
8040: 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20    doAdd = 1;.   
8050: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
8060: 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61  ite3VListNumToNa
8070: 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  me(pParse->pVLis
8080: 74 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, x)==0 ){.    
8090: 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20      doAdd = 1;. 
80a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
80b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
80c0: 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22  ards like ":aaa"
80d0: 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61  , "$aaa" or "@aa
80e0: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
80f0: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
8100: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
8110: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
8120: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
8130: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
8140: 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68   name.      ** h
8150: 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65  as never appeare
8160: 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20  d before, reuse 
8170: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
8180: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
8190: 2f 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56  /.      x = (ynV
81a0: 61 72 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e  ar)sqlite3VListN
81b0: 61 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d  ameToNum(pParse-
81c0: 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a  >pVList, z, n);.
81d0: 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29        if( x==0 )
81e0: 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 79  {.        x = (y
81f0: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
8200: 6e 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64  nVar);.        d
8210: 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  oAdd = 1;.      
8220: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
8230: 64 6f 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70  doAdd ){.      p
8240: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20  Parse->pVList = 
8250: 73 71 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28  sqlite3VListAdd(
8260: 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69  db, pParse->pVLi
8270: 73 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20  st, z, n, x);.  
8280: 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d    }.  }.  pExpr-
8290: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20  >iColumn = x;.  
82a0: 69 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74  if( x>db->aLimit
82b0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
82c0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
82d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
82e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
82f0: 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69  oo many SQL vari
8300: 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  ables");.  }.}..
8310: 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c  /*.** Recursivel
8320: 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72  y delete an expr
8330: 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
8340: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
8350: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69  INLINE void sqli
8360: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
8370: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
8380: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
8390: 20 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61   p!=0 );.  /* Sa
83a0: 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65  nity check: Asse
83b0: 72 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56  rt that the IntV
83c0: 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  alue is non-nega
83d0: 74 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74  tive if it exist
83e0: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  s */.  assert( !
83f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8400: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
8410: 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d  || p->u.iValue>=
8420: 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 );.#ifdef SQLI
8430: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 45  TE_DEBUG.  if( E
8440: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8450: 2c 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21 45  , EP_Leaf) && !E
8460: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8470: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
8480: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
8490: 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20  ->pLeft==0 );.  
84a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
84b0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ght==0 );.    as
84c0: 73 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c 65  sert( p->x.pSele
84d0: 63 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6e  ct==0 );.  }.#en
84e0: 64 69 66 0a 20 20 69 66 28 20 21 45 78 70 72 48  dif.  if( !ExprH
84f0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28 45  asProperty(p, (E
8500: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
8510: 65 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20  eaf)) ){.    /* 
8520: 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e  The Expr.x union
8530: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61   is never used a
8540: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
8550: 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a  as Expr.pRight *
8560: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
8570: 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
8580: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
8590: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
85a0: 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c  && p->op!=TK_SEL
85b0: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c  ECT_COLUMN ) sql
85c0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e  ite3ExprDeleteNN
85d0: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a  (db, p->pLeft);.
85e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
85f0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69  elete(db, p->pRi
8600: 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ght);.    if( Ex
8610: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8620: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
8630: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
8640: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
8650: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
8660: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8670: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8680: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
8690: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
86a0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
86b0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d  operty(p, EP_Mem
86c0: 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33  Token) ) sqlite3
86d0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
86e0: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21  zToken);.  if( !
86f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8700: 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b  p, EP_Static) ){
8710: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
8720: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d  eeNN(db, p);.  }
8730: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  .}.void sqlite3E
8740: 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65  xprDelete(sqlite
8750: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b  3 *db, Expr *p){
8760: 0a 20 20 69 66 28 20 70 20 29 20 73 71 6c 69 74  .  if( p ) sqlit
8770: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64  e3ExprDeleteNN(d
8780: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
8790: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
87a0: 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63  r of bytes alloc
87b0: 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70  ated for the exp
87c0: 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72  ression structur
87d0: 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  e .** passed as 
87e0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
87f0: 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61  nt. This is alwa
8800: 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46  ys one of EXPR_F
8810: 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52  ULLSIZE,.** EXPR
8820: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20  _REDUCEDSIZE or 
8830: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
8840: 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ZE..*/.static in
8850: 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65  t exprStructSize
8860: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
8870: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8880: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
8890: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
88a0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20  TOKENONLYSIZE;. 
88b0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
88c0: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
88d0: 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58 50  ed) ) return EXP
88e0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20  R_REDUCEDSIZE;. 
88f0: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c   return EXPR_FUL
8900: 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  LSIZE;.}../*.** 
8910: 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53 69  The dupedExpr*Si
8920: 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61  ze() routines ea
8930: 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ch return the nu
8940: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
8950: 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f  quired.** to sto
8960: 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20  re a copy of an 
8970: 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78  expression or ex
8980: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
8990: 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a  They differ in.*
89a0: 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68  * how much of th
89b0: 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75 72  e tree is measur
89c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75  ed..**.**     du
89d0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
89e0: 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20  e()     Size of 
89f0: 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73 74  only the Expr st
8a00: 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20  ructure .**     
8a10: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
8a20: 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f  e()       Size o
8a30: 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20 66  f Expr + space f
8a40: 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20  or token.**     
8a50: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29 20  dupedExprSize() 
8a60: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2b            Expr +
8a70: 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65   token + subtree
8a80: 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a   components.**.*
8a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
8ae0: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53 74   The dupedExprSt
8af0: 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74  ructSize() funct
8b00: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20  ion returns two 
8b10: 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67  values OR-ed tog
8b20: 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20  ether:  .** (1) 
8b30: 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72  the space requir
8b40: 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66  ed for a copy of
8b50: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
8b60: 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a  ure only and .**
8b70: 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78 20   (2) the EP_xxx 
8b80: 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69 63  flags that indic
8b90: 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74 72  ate what the str
8ba0: 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75  ucture size shou
8bb0: 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65  ld be..** The re
8bc0: 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61  turn values is a
8bd0: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  lways one of:.**
8be0: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55  .**      EXPR_FU
8bf0: 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45  LLSIZE.**      E
8c00: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
8c10: 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a    | EP_Reduced.*
8c20: 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45  *      EXPR_TOKE
8c30: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
8c40: 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54  okenOnly.**.** T
8c50: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73  he size of the s
8c60: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
8c70: 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67  found by masking
8c80: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
8c90: 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75  e.** of this rou
8ca0: 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e  tine with 0xfff.
8cb0: 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20    The flags can 
8cc0: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
8cd0: 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72  ing the.** retur
8ce0: 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f  n value with EP_
8cf0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
8d00: 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  Only..**.** Note
8d10: 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67 73   that with flags
8d20: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
8d30: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20  , this routines 
8d40: 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69  works on full-si
8d50: 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64  ze.** (unreduced
8d60: 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61  ) Expr objects a
8d70: 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e  s they or origin
8d80: 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64  ally constructed
8d90: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a   by the parser..
8da0: 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65 73  ** During expres
8db0: 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65  sion analysis, e
8dc0: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
8dd0: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64   is computed and
8de0: 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c   moved into.** l
8df0: 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74 65  ater parts of te
8e00: 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  h Expr object an
8e10: 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66  d that extra inf
8e20: 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67  ormation might g
8e30: 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66  et chopped.** of
8e40: 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  f if the express
8e50: 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20  ion is reduced. 
8e60: 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
8e70: 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  it does not work
8e80: 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45   to.** make an E
8e90: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f  XPRDUP_REDUCE co
8ea0: 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20  py of a reduced 
8eb0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20  expression.  It 
8ec0: 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a  is only legal.**
8ed0: 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69   to reduce a pri
8ee0: 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e  stine expression
8ef0: 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70   tree from the p
8f00: 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c  arser.  The impl
8f10: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ementation.** of
8f20: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8f30: 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d  Size() contain m
8f40: 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29  ultiple assert()
8f50: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
8f60: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65   attempt.** to e
8f70: 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73  nforce this cons
8f80: 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  traint..*/.stati
8f90: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
8fa0: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
8fb0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
8fc0: 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73   int nSize;.  as
8fd0: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50  sert( flags==EXP
8fe0: 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66  RDUP_REDUCE || f
8ff0: 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e  lags==0 ); /* On
9000: 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75  ly one flag valu
9010: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61  e allowed */.  a
9020: 73 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c  ssert( EXPR_FULL
9030: 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20  SIZE<=0xfff );. 
9040: 20 61 73 73 65 72 74 28 20 28 30 78 66 66 66 20   assert( (0xfff 
9050: 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50  & (EP_Reduced|EP
9060: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20  _TokenOnly))==0 
9070: 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61 67  );.  if( 0==flag
9080: 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53  s || p->op==TK_S
9090: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  ELECT_COLUMN ){.
90a0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
90b0: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c  _FULLSIZE;.  }el
90c0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
90d0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
90e0: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
90f0: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
9100: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9110: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9120: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20  EP_FromJoin) ); 
9130: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
9140: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9150: 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b   EP_MemToken) );
9160: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
9170: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9180: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b   EP_NoReduce) );
9190: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66  .    if( p->pLef
91a0: 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20  t || p->x.pList 
91b0: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
91c0: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
91d0: 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a  E | EP_Reduced;.
91e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
91f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
9200: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  ht==0 );.      n
9210: 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45  Size = EXPR_TOKE
9220: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
9230: 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a  okenOnly;.    }.
9240: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69    }.  return nSi
9250: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
9260: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
9270: 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20  ns the space in 
9280: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
9290: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
92a0: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72   .** of the Expr
92b0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
92c0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
92d0: 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  r.u.zToken strin
92e0: 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74  g (if that.** st
92f0: 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e  ring is defined.
9300: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
9310: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
9320: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
9330: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
9340: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  te = dupedExprSt
9350: 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67  ructSize(p, flag
9360: 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66  s) & 0xfff;.  if
9370: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9380: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
9390: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
93a0: 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b  n ){.    nByte +
93b0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
93c0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31  0(p->u.zToken)+1
93d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52  ;.  }.  return R
93e0: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a  OUND8(nByte);.}.
93f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
9400: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
9410: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72  s required to cr
9420: 65 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65  eate a duplicate
9430: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72   of the .** expr
9440: 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73  ession passed as
9450: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
9460: 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ent. The second 
9470: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a  argument is a.**
9480: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67   mask containing
9490: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
94a0: 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  gs..**.** The va
94b0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63  lue returned inc
94c0: 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63  ludes space to c
94d0: 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
94e0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a  the Expr struct.
94f0: 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68  ** itself and th
9500: 65 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65  e buffer referre
9510: 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a  d to by Expr.u.z
9520: 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a  Token, if any..*
9530: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  *.** If the EXPR
9540: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
9550: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
9560: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
9570: 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65  cludes .** space
9580: 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c   to duplicate al
9590: 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20  l Expr nodes in 
95a0: 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20  the tree formed 
95b0: 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a  by Expr.pLeft .*
95c0: 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68  * and Expr.pRigh
95d0: 74 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74  t variables (but
95e0: 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72   not for any str
95f0: 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20  uctures pointed 
9600: 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e  to or .** descen
9610: 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ded from the Exp
9620: 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70  r.x.pList or Exp
9630: 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69  r.x.pSelect vari
9640: 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69  ables)..*/.stati
9650: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
9660: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
9670: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
9680: 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Byte = 0;.  if( 
9690: 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  p ){.    nByte =
96a0: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
96b0: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
96c0: 20 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52    if( flags&EXPR
96d0: 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20  DUP_REDUCE ){.  
96e0: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70      nByte += dup
96f0: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c  edExprSize(p->pL
9700: 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75  eft, flags) + du
9710: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70  pedExprSize(p->p
9720: 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Right, flags);. 
9730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9740: 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nByte;.}../*.*
9750: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9760: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
9770: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20  lite3ExprDup(), 
9780: 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70  except that if p
9790: 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e  zBuffer .** is n
97a0: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a  ot NULL then *pz
97b0: 42 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65  Buffer is assume
97c0: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  d to point to a 
97d0: 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f  buffer large eno
97e0: 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ugh .** to store
97f0: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70   the copy of exp
9800: 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63  ression p, the c
9810: 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54  opies of p->u.zT
9820: 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c  oken.** (if appl
9830: 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65  icable), and the
9840: 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
9850: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70  ->pLeft and p->p
9860: 52 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e  Right expression
9870: 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65  s,.** if any. Be
9880: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
9890: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74  *pzBuffer is set
98a0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
98b0: 74 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70  te past the.** p
98c0: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75  ortion of the bu
98d0: 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f  ffer copied into
98e0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
98f0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  n..*/.static Exp
9900: 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74  r *exprDup(sqlit
9910: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
9920: 20 69 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75   int dupFlags, u
9930: 38 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20  8 **pzBuffer){. 
9940: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
9950: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
9960: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75  to return */.  u
9970: 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20  8 *zAlloc;      
9980: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73       /* Memory s
9990: 70 61 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20  pace from which 
99a0: 74 6f 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62  to build Expr ob
99b0: 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74  ject */.  u32 st
99c0: 61 74 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20  aticFlag;       
99d0: 2f 2a 20 45 50 5f 53 74 61 74 69 63 20 69 66 20  /* EP_Static if 
99e0: 73 70 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e  space not obtain
99f0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a  ed from malloc *
9a00: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  /..  assert( db!
9a10: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9a20: 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  p );.  assert( d
9a30: 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75  upFlags==0 || du
9a40: 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f  pFlags==EXPRDUP_
9a50: 52 45 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65  REDUCE );.  asse
9a60: 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20  rt( pzBuffer==0 
9a70: 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50  || dupFlags==EXP
9a80: 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a  RDUP_REDUCE );..
9a90: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
9aa0: 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  where to write t
9ab0: 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72 75  he new Expr stru
9ac0: 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20  cture. */.  if( 
9ad0: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
9ae0: 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66  zAlloc = *pzBuff
9af0: 65 72 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c  er;.    staticFl
9b00: 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a  ag = EP_Static;.
9b10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c    }else{.    zAl
9b20: 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  loc = sqlite3DbM
9b30: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64  allocRawNN(db, d
9b40: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20  upedExprSize(p, 
9b50: 64 75 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20  dupFlags));.    
9b60: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a  staticFlag = 0;.
9b70: 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78    }.  pNew = (Ex
9b80: 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20  pr *)zAlloc;..  
9b90: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
9ba0: 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20  /* Set nNewSize 
9bb0: 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f  to the size allo
9bc0: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 74  cated for the st
9bd0: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
9be0: 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65  to.    ** by pNe
9bf0: 77 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65  w. This is eithe
9c00: 72 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  r EXPR_FULLSIZE,
9c10: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
9c20: 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52  E or.    ** EXPR
9c30: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20  _TOKENONLYSIZE. 
9c40: 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f  nToken is set to
9c50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
9c60: 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20  ytes consumed.  
9c70: 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79    ** by the copy
9c80: 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f   of the p->u.zTo
9c90: 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61  ken string (if a
9ca0: 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ny)..    */.    
9cb0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e  const unsigned n
9cc0: 53 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70  StructSize = dup
9cd0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
9ce0: 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  (p, dupFlags);. 
9cf0: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65     const int nNe
9d00: 77 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53  wSize = nStructS
9d10: 69 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20  ize & 0xfff;.   
9d20: 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20   int nToken;.   
9d30: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
9d40: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
9d50: 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54  alue) && p->u.zT
9d60: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54  oken ){.      nT
9d70: 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  oken = sqlite3St
9d80: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
9d90: 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c  en) + 1;.    }el
9da0: 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e  se{.      nToken
9db0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
9dc0: 69 66 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a  if( dupFlags ){.
9dd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
9de0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9df0: 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20   EP_Reduced)==0 
9e00: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
9e10: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53  zAlloc, p, nNewS
9e20: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
9e30: 0a 20 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65  .      u32 nSize
9e40: 20 3d 20 28 75 33 32 29 65 78 70 72 53 74 72 75   = (u32)exprStru
9e50: 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20  ctSize(p);.     
9e60: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
9e70: 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  p, nSize);.     
9e80: 20 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f   if( nSize<EXPR_
9e90: 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20  FULLSIZE ){ .   
9ea0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c       memset(&zAl
9eb0: 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45  loc[nSize], 0, E
9ec0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69  XPR_FULLSIZE-nSi
9ed0: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
9ee0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
9ef0: 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45  he EP_Reduced, E
9f00: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64  P_TokenOnly, and
9f10: 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73   EP_Static flags
9f20: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20   appropriately. 
9f30: 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  */.    pNew->fla
9f40: 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63  gs &= ~(EP_Reduc
9f50: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  ed|EP_TokenOnly|
9f60: 45 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d  EP_Static|EP_Mem
9f70: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77  Token);.    pNew
9f80: 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75  ->flags |= nStru
9f90: 63 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64  ctSize & (EP_Red
9fa0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
9fb0: 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c  y);.    pNew->fl
9fc0: 61 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61  ags |= staticFla
9fd0: 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  g;..    /* Copy 
9fe0: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
9ff0: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
a000: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65  */.    if( nToke
a010: 6e 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  n ){.      char 
a020: 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e  *zToken = pNew->
a030: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
a040: 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69  *)&zAlloc[nNewSi
a050: 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ze];.      memcp
a060: 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a  y(zToken, p->u.z
a070: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
a080: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30      }..    if( 0
a090: 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65  ==((p->flags|pNe
a0a0: 77 2d 3e 66 6c 61 67 73 29 20 26 20 28 45 50 5f  w->flags) & (EP_
a0b0: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61  TokenOnly|EP_Lea
a0c0: 66 29 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  f)) ){.      /* 
a0d0: 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77  Fill in the pNew
a0e0: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70  ->x.pSelect or p
a0f0: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d  New->x.pList mem
a100: 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ber. */.      if
a110: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a120: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
a130: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  t) ){.        pN
a140: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20  ew->x.pSelect = 
a150: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
a160: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
a170: 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  t, dupFlags);.  
a180: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a190: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74     pNew->x.pList
a1a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
a1b0: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70  stDup(db, p->x.p
a1c0: 4c 69 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b  List, dupFlags);
a1d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
a1e0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70      /* Fill in p
a1f0: 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  New->pLeft and p
a200: 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a  New->pRight. */.
a210: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
a220: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
a230: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
a240: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
a250: 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45  zAlloc += dupedE
a260: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64  xprNodeSize(p, d
a270: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
a280: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
a290: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f  erty(pNew, EP_To
a2a0: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
a2b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
a2c0: 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65  ->pLeft = p->pLe
a2d0: 66 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  ft ?.           
a2e0: 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44             exprD
a2f0: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c  up(db, p->pLeft,
a300: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c   EXPRDUP_REDUCE,
a310: 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20   &zAlloc) : 0;. 
a320: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
a330: 67 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20  ght = p->pRight 
a340: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
a350: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a360: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
a370: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
a380: 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20  &zAlloc) : 0;.  
a390: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a3a0: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
a3b0: 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20      *pzBuffer = 
a3c0: 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a  zAlloc;.      }.
a3d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a3e0: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
a3f0: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
a400: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29  nOnly|EP_Leaf) )
a410: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  {.        if( pN
a420: 65 77 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  ew->op==TK_SELEC
a430: 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  T_COLUMN ){.    
a440: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66        pNew->pLef
a450: 74 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  t = p->pLeft;.  
a460: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a470: 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c  p->iColumn==0 ||
a480: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
a490: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
a4a0: 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  t( p->pRight==0 
a4b0: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 70   || p->pRight==p
a4c0: 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ->pLeft );.     
a4d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a4e0: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
a4f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a500: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30  (db, p->pLeft, 0
a510: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
a520: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
a530: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
a540: 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  up(db, p->pRight
a550: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
a560: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
a570: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
a580: 43 72 65 61 74 65 20 61 6e 64 20 72 65 74 75 72  Create and retur
a590: 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66  n a deep copy of
a5a0: 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73   the object pass
a5b0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
a5c0: 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49   .** argument. I
a5d0: 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69  f an OOM conditi
a5e0: 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  on is encountere
a5f0: 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  d, NULL is retur
a600: 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ned.** and the d
a610: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a620: 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66  flag set..*/.#if
a630: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a640: 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69 74 68  _CTE.static With
a650: 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74 65   *withDup(sqlite
a660: 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b  3 *db, With *p){
a670: 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20  .  With *pRet = 
a680: 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  0;.  if( p ){.  
a690: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
a6a0: 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f  zeof(*p) + sizeo
a6b0: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
a6c0: 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52  >nCte-1);.    pR
a6d0: 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  et = sqlite3DbMa
a6e0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
a6f0: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65  te);.    if( pRe
a700: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
a710: 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43  ;.      pRet->nC
a720: 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20  te = p->nCte;.  
a730: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
a740: 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
a750: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
a760: 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  .pSelect = sqlit
a770: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
a780: 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c  p->a[i].pSelect,
a790: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65   0);.        pRe
a7a0: 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20  t->a[i].pCols = 
a7b0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
a7c0: 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70  up(db, p->a[i].p
a7d0: 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  Cols, 0);.      
a7e0: 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61    pRet->a[i].zNa
a7f0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
a800: 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  rDup(db, p->a[i]
a810: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  .zName);.      }
a820: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
a830: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73  urn pRet;.}.#els
a840: 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68 44  e.# define withD
a850: 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66  up(x,y) 0.#endif
a860: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
a870: 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72  owing group of r
a880: 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65  outines make dee
a890: 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72  p copies of expr
a8a0: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72  essions,.** expr
a8b0: 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44  ession lists, ID
a8c0: 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65   lists, and sele
a8d0: 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
a8e0: 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a  The copies can.*
a8f0: 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79  * be deleted (by
a900: 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f   being passed to
a910: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
a920: 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f  e ...Delete() ro
a930: 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f  utines).** witho
a940: 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65  ut effecting the
a950: 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a   originals..**.*
a960: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
a970: 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73   list, ID, and s
a980: 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75  ource lists retu
a990: 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  rn by sqlite3Exp
a9a0: 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73  rListDup(),.** s
a9b0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
a9c0: 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72  ), and sqlite3Sr
a9d0: 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e  cListDup() can n
a9e0: 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78  ot be further ex
a9f0: 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75  panded .** by su
aa00: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
aa10: 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70  o sqlite*ListApp
aa20: 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a  end() routines..
aa30: 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73  **.** Any tables
aa40: 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73   that the SrcLis
aa50: 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  t might point to
aa60: 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61   are not duplica
aa70: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ted..**.** The f
aa80: 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63  lags parameter c
aa90: 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e  ontains a combin
aaa0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50  ation of the EXP
aab0: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
aac0: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
aad0: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
aae0: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73   set, then the s
aaf0: 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
ab00: 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61  d is a.** trunca
ab10: 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ted version of t
ab20: 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74  he usual Expr st
ab30: 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
ab40: 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a  l be stored as.*
ab50: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  * part of the in
ab60: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
ab70: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
ab80: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
ab90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
aba0: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
abb0: 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  db, Expr *p, int
abc0: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
abd0: 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
abe0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
abf0: 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  DUCE );.  return
ac00: 20 70 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c   p ? exprDup(db,
ac10: 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20   p, flags, 0) : 
ac20: 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73  0;.}.ExprList *s
ac30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
ac40: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
ac50: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
ac60: 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69  flags){.  ExprLi
ac70: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75  st *pNew;.  stru
ac80: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
ac90: 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74   *pItem, *pOldIt
aca0: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  em;.  int i;.  E
acb0: 78 70 72 20 2a 70 50 72 69 6f 72 53 65 6c 65 63  xpr *pPriorSelec
acc0: 74 43 6f 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65  tCol = 0;.  asse
acd0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
ace0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
acf0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
ad00: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
ad10: 4e 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  N(db, .         
ad20: 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77      sizeof(*pNew
ad30: 29 2b 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 61  )+sizeof(pNew->a
ad40: 5b 30 5d 29 2a 28 70 2d 3e 6e 45 78 70 72 2d 31  [0])*(p->nExpr-1
ad50: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
ad60: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
ad70: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
ad80: 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 2d  pNew->nExpr = p-
ad90: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 74 65 6d 20  >nExpr;.  pItem 
ada0: 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f 6c  = pNew->a;.  pOl
adb0: 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20  dItem = p->a;.  
adc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
add0: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
ade0: 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a  +, pOldItem++){.
adf0: 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78      Expr *pOldEx
ae00: 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  pr = pOldItem->p
ae10: 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
ae20: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 70 49  pNewExpr;.    pI
ae30: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c  tem->pExpr = sql
ae40: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
ae50: 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29  pOldExpr, flags)
ae60: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78  ;.    if( pOldEx
ae70: 70 72 20 0a 20 20 20 20 20 26 26 20 70 4f 6c 64  pr .     && pOld
ae80: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
ae90: 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20  ECT_COLUMN.     
aea0: 26 26 20 28 70 4e 65 77 45 78 70 72 20 3d 20 70  && (pNewExpr = p
aeb0: 49 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d 30 20  Item->pExpr)!=0 
aec0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
aed0: 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e  sert( pNewExpr->
aee0: 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e  iColumn==0 || i>
aef0: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
af00: 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  NewExpr->iColumn
af10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
af20: 73 73 65 72 74 28 20 70 4f 6c 64 45 78 70 72 2d  ssert( pOldExpr-
af30: 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78 70 72  >pLeft==pOldExpr
af40: 2d 3e 70 52 69 67 68 74 20 29 3b 0a 20 20 20 20  ->pRight );.    
af50: 20 20 20 20 70 50 72 69 6f 72 53 65 6c 65 63 74      pPriorSelect
af60: 43 6f 6c 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e  Col = pNewExpr->
af70: 70 4c 65 66 74 20 3d 20 70 4e 65 77 45 78 70 72  pLeft = pNewExpr
af80: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
af90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
afa0: 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
afb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
afc0: 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 21 3d 30  tem[-1].pExpr!=0
afd0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
afe0: 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43  rt( pNewExpr->iC
aff0: 6f 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d  olumn==pItem[-1]
b000: 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b  .pExpr->iColumn+
b010: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  1 );.        ass
b020: 65 72 74 28 20 70 50 72 69 6f 72 53 65 6c 65 63  ert( pPriorSelec
b030: 74 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e  tCol==pItem[-1].
b040: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a  pExpr->pLeft );.
b050: 20 20 20 20 20 20 20 20 70 4e 65 77 45 78 70 72          pNewExpr
b060: 2d 3e 70 4c 65 66 74 20 3d 20 70 50 72 69 6f 72  ->pLeft = pPrior
b070: 53 65 6c 65 63 74 43 6f 6c 3b 0a 20 20 20 20 20  SelectCol;.     
b080: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74   }.    }.    pIt
b090: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
b0a0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b0b0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
b0c0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
b0d0: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
b0e0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b0f0: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
b100: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
b110: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74  = pOldItem->sort
b120: 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d  Order;.    pItem
b130: 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ->done = 0;.    
b140: 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61  pItem->bSpanIsTa
b150: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53  b = pOldItem->bS
b160: 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49  panIsTab;.    pI
b170: 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65  tem->u = pOldIte
b180: 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75  m->u;.  }.  retu
b190: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
b1a0: 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72  * If cursors, tr
b1b0: 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e  iggers, views an
b1c0: 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65  d subqueries are
b1d0: 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f   all omitted fro
b1e0: 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20  m.** the build, 
b1f0: 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65  then none of the
b200: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
b210: 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  nes, except for 
b220: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
b230: 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63  tDup(), can be c
b240: 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65  alled. sqlite3Se
b250: 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d  lectDup() is som
b260: 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64  etimes.** called
b270: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67   with a NULL arg
b280: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  ument..*/.#if !d
b290: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b2a0: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
b2b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b2c0: 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20  _TRIGGER) \. || 
b2d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b2e0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53  OMIT_SUBQUERY).S
b2f0: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
b300: 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  rcListDup(sqlite
b310: 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
b320: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
b330: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
b340: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
b350: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
b360: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
b370: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b380: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
b390: 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e  (*p) + (p->nSrc>
b3a0: 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  0 ? sizeof(p->a[
b3b0: 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31  0]) * (p->nSrc-1
b3c0: 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d  ) : 0);.  pNew =
b3d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b3e0: 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20  RawNN(db, nByte 
b3f0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
b400: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b410: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
b420: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
b430: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
b440: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
b450: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
b460: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
b470: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
b480: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
b490: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
b4a0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
b4b0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
b4c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
b4d0: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
b4e0: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
b4f0: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
b500: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
b510: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b520: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
b530: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
b540: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
b550: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b560: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
b570: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
b580: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b590: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b5a0: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
b5b0: 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64  wItem->fg = pOld
b5c0: 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e  Item->fg;.    pN
b5d0: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
b5e0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
b5f0: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
b600: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
b610: 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46   pOldItem->addrF
b620: 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77  illSub;.    pNew
b630: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
b640: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52  = pOldItem->regR
b650: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
b660: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  NewItem->fg.isIn
b670: 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20  dexedBy ){.     
b680: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49   pNewItem->u1.zI
b690: 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
b6a0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
b6b0: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  OldItem->u1.zInd
b6c0: 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
b6d0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42     pNewItem->pIB
b6e0: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
b6f0: 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20  ->pIBIndex;.    
b700: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
b710: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
b720: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
b730: 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20  .pFuncArg = .   
b740: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b750: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  prListDup(db, pO
b760: 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ldItem->u1.pFunc
b770: 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Arg, flags);.   
b780: 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e   }.    pTab = pN
b790: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
b7a0: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
b7b0: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
b7c0: 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52       pTab->nTabR
b7d0: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
b7e0: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
b7f0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
b800: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
b810: 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67  m->pSelect, flag
b820: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
b830: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
b840: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
b850: 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29  tem->pOn, flags)
b860: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b870: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
b880: 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  IdListDup(db, pO
b890: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
b8a0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
b8b0: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
b8c0: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
b8d0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
b8e0: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
b8f0: 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  IdListDup(sqlite
b900: 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
b910: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
b920: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  w;.  int i;.  as
b930: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
b940: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
b950: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
b960: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b970: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  wNN(db, sizeof(*
b980: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
b990: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
b9a0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d  0;.  pNew->nId =
b9b0: 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d   p->nId;.  pNew-
b9c0: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
b9d0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d  llocRawNN(db, p-
b9e0: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
b9f0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
ba00: 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->a==0 ){.    
ba10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
ba20: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72  db, pNew);.    r
ba30: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
ba40: 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61  * Note that beca
ba50: 75 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  use the size of 
ba60: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
ba70: 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74  or p->a[] is not
ba80: 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c  .  ** necessaril
ba90: 79 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  y a power of two
baa0: 2c 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41  , sqlite3IdListA
bab0: 70 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20  ppend() may not 
bac0: 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f  be called.  ** o
bad0: 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  n the duplicate 
bae0: 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20  created by this 
baf0: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66  function. */.  f
bb00: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64  or(i=0; i<p->nId
bb10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
bb20: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
bb30: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
bb40: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
bb50: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
bb60: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
bb70: 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  [i];.    pNewIte
bb80: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
bb90: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
bba0: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
bbb0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
bbc0: 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  dx = pOldItem->i
bbd0: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
bbe0: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
bbf0: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
bc00: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
bc10: 65 6c 65 63 74 20 2a 70 44 75 70 2c 20 69 6e 74  elect *pDup, int
bc20: 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63   flags){.  Selec
bc30: 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 53  t *pRet = 0;.  S
bc40: 65 6c 65 63 74 20 2a 70 4e 65 78 74 20 3d 20 30  elect *pNext = 0
bc50: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 2a 70 70 20  ;.  Select **pp 
bc60: 3d 20 26 70 52 65 74 3b 0a 20 20 53 65 6c 65 63  = &pRet;.  Selec
bc70: 74 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28  t *p;..  assert(
bc80: 20 64 62 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28   db!=0 );.  for(
bc90: 70 3d 70 44 75 70 3b 20 70 3b 20 70 3d 70 2d 3e  p=pDup; p; p=p->
bca0: 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c  pPrior){.    Sel
bcb0: 65 63 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  ect *pNew = sqli
bcc0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
bcd0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20  (db, sizeof(*p) 
bce0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
bcf0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
bd00: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
bd10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
bd20: 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
bd30: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
bd40: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
bd50: 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20  3SrcListDup(db, 
bd60: 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b  p->pSrc, flags);
bd70: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  .    pNew->pWher
bd80: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
bd90: 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  up(db, p->pWhere
bda0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
bdb0: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  ew->pGroupBy = s
bdc0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
bdd0: 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  p(db, p->pGroupB
bde0: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  y, flags);.    p
bdf0: 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  New->pHaving = s
be00: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
be10: 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c  , p->pHaving, fl
be20: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
be30: 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
be40: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
be50: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66  , p->pOrderBy, f
be60: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d  lags);.    pNew-
be70: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20  >op = p->op;.   
be80: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
be90: 4e 65 78 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Next;.    pNew->
bea0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
beb0: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pNew->pLimit = s
bec0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
bed0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61  , p->pLimit, fla
bee0: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
bef0: 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33  Offset = sqlite3
bf00: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
bf10: 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a  Offset, flags);.
bf20: 20 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74      pNew->iLimit
bf30: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
bf40: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  iOffset = 0;.   
bf50: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
bf60: 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  = p->selFlags & 
bf70: 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61  ~SF_UsesEphemera
bf80: 6c 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64  l;.    pNew->add
bf90: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d  rOpenEphm[0] = -
bfa0: 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64  1;.    pNew->add
bfb0: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
bfc0: 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65  1;.    pNew->nSe
bfd0: 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65  lectRow = p->nSe
bfe0: 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65  lectRow;.    pNe
bff0: 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44  w->pWith = withD
c000: 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29  up(db, p->pWith)
c010: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
c020: 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c  ectSetName(pNew,
c030: 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20   p->zSelName);. 
c040: 20 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20     *pp = pNew;. 
c050: 20 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70     pp = &pNew->p
c060: 50 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74  Prior;.    pNext
c070: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20   = pNew;.  }..  
c080: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
c090: 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c  else.Select *sql
c0a0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
c0b0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
c0c0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
c0d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
c0e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   );.  return 0;.
c0f0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
c100: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
c110: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
c120: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
c130: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
c140: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
c150: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
c160: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
c170: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  n list..**.** If
c180: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
c190: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
c1a0: 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69  s, the entire li
c1b0: 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a  st is freed and.
c1c0: 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ** NULL is retur
c1d0: 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c  ned.  If non-NUL
c1e0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  L is returned, t
c1f0: 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
c200: 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65  teed.** that the
c210: 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73   new entry was s
c220: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65  uccessfully appe
c230: 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  nded..*/.ExprLis
c240: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
c250: 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73  stAppend(.  Pars
c260: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
c270: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
c280: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
c290: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
c2a0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
c2b0: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
c2c0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
c2d0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
c2e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
c2f0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
c300: 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62  ppended. Might b
c310: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  e NULL */.){.  s
c320: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c330: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
c340: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c350: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
c360: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
c370: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
c380: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
c390: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
c3a0: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  , sizeof(ExprLis
c3b0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
c3c0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
c3d0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
c3e0: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45   }.    pList->nE
c3f0: 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69  xpr = 0;.    pLi
c400: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
c410: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73    }else if( pLis
c420: 74 2d 3e 6e 45 78 70 72 3d 3d 70 4c 69 73 74 2d  t->nExpr==pList-
c430: 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 45  >nAlloc ){.    E
c440: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
c450: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
c460: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
c470: 4c 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20  List, .         
c480: 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73      sizeof(*pLis
c490: 74 29 2b 28 32 2a 70 4c 69 73 74 2d 3e 6e 41 6c  t)+(2*pList->nAl
c4a0: 6c 6f 63 20 2d 20 31 29 2a 73 69 7a 65 6f 66 28  loc - 1)*sizeof(
c4b0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
c4c0: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
c4d0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
c4e0: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
c4f0: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  List = pNew;.   
c500: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a   pList->nAlloc *
c510: 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  = 2;.  }.  pItem
c520: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
c530: 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20  st->nExpr++];.  
c540: 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c  memset(pItem, 0,
c550: 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29   sizeof(*pItem))
c560: 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  ;.  pItem->pExpr
c570: 20 3d 20 70 45 78 70 72 3b 0a 20 20 72 65 74 75   = pExpr;.  retu
c580: 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65  rn pList;..no_me
c590: 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f  m:     .  /* Avo
c5a0: 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72  id leaking memor
c5b0: 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20  y if malloc has 
c5c0: 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c  failed. */.  sql
c5d0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
c5e0: 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c  b, pExpr);.  sql
c5f0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
c600: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
c610: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
c620: 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e 64  .** pColumns and
c630: 20 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76 65   pExpr form a ve
c640: 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 20  ctor assignment 
c650: 77 68 69 63 68 20 69 73 20 70 61 72 74 20 6f 66  which is part of
c660: 20 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61 75   the SET.** clau
c670: 73 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20  se of an UPDATE 
c680: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b 65  statement.  Like
c690: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
c6a0: 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 65      (a,b,c) = (e
c6b0: 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33  xpr1,expr2,expr3
c6c0: 29 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c 62  ).** Or:    (a,b
c6d0: 2c 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78 2c  ,c) = (SELECT x,
c6e0: 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a  y,z FROM ....).*
c6f0: 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 65  *.** For each te
c700: 72 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  rm of the vector
c710: 20 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70 70   assignment, app
c720: 65 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73 20  end new entries 
c730: 74 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  to the.** expres
c740: 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e  sion list pList.
c750: 20 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66    In the case of
c760: 20 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74   a subquery on t
c770: 68 65 20 52 48 53 2c 20 61 70 70 65 6e 64 0a 2a  he RHS, append.*
c780: 2a 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  * TK_SELECT_COLU
c790: 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  MN expressions..
c7a0: 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  */.ExprList *sql
c7b0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
c7c0: 6e 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72 73  ndVector(.  Pars
c7d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
c7e0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
c7f0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
c800: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
c810: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
c820: 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  ch to append. Mi
c830: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
c840: 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e   IdList *pColumn
c850: 73 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  s,      /* List 
c860: 6f 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53 20  of names of LHS 
c870: 6f 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65 6e  of the assignmen
c880: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
c890: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pr            /*
c8a0: 20 56 65 63 74 6f 72 20 65 78 70 72 65 73 73 69   Vector expressi
c8b0: 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  on to be appende
c8c0: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
c8d0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
c8e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
c8f0: 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  b;.  int n;.  in
c900: 74 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72 73  t i;.  int iFirs
c910: 74 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  t = pList ? pLis
c920: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  t->nExpr : 0;.  
c930: 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e 20  /* pColumns can 
c940: 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75 65  only be NULL due
c950: 20 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20 61   to an OOM but a
c960: 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65  n OOM will cause
c970: 20 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70 72   an.  ** exit pr
c980: 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ior to this rout
c990: 69 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65  ine being invoke
c9a0: 64 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  d */.  if( NEVER
c9b0: 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29 20  (pColumns==0) ) 
c9c0: 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65  goto vector_appe
c9d0: 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20  nd_error;.  if( 
c9e0: 70 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20  pExpr==0 ) goto 
c9f0: 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72  vector_append_er
ca00: 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ror;..  /* If th
ca10: 65 20 52 48 53 20 69 73 20 61 20 76 65 63 74 6f  e RHS is a vecto
ca20: 72 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 69  r, then we can i
ca30: 6d 6d 65 64 69 61 74 65 6c 79 20 63 68 65 63 6b  mmediately check
ca40: 20 74 6f 20 73 65 65 20 74 68 61 74 20 0a 20 20   to see that .  
ca50: 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ** the size of t
ca60: 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 6d  he RHS and LHS m
ca70: 61 74 63 68 2e 20 20 42 75 74 20 69 66 20 74 68  atch.  But if th
ca80: 65 20 52 48 53 20 69 73 20 61 20 53 45 4c 45 43  e RHS is a SELEC
ca90: 54 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61 72  T, .  ** wildcar
caa0: 64 73 20 28 22 2a 22 29 20 69 6e 20 74 68 65 20  ds ("*") in the 
cab0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
cac0: 65 20 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65  e SELECT must be
cad0: 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65   expanded before
cae0: 0a 20 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f 20  .  ** we can do 
caf0: 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 2c 20  the size check, 
cb00: 73 6f 20 64 65 66 65 72 20 74 68 65 20 73 69 7a  so defer the siz
cb10: 65 20 63 68 65 63 6b 20 75 6e 74 69 6c 20 63 6f  e check until co
cb20: 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 20  de generation.. 
cb30: 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
cb40: 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 26  >op!=TK_SELECT &
cb50: 26 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21  & pColumns->nId!
cb60: 3d 28 6e 3d 73 71 6c 69 74 65 33 45 78 70 72 56  =(n=sqlite3ExprV
cb70: 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29  ectorSize(pExpr)
cb80: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
cb90: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
cba0: 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73   "%d columns ass
cbb0: 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22  igned %d values"
cbc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
cbd0: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e        pColumns->
cbe0: 6e 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f 74  nId, n);.    got
cbf0: 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f  o vector_append_
cc00: 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f  error;.  }..  fo
cc10: 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e  r(i=0; i<pColumn
cc20: 73 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  s->nId; i++){.  
cc30: 20 20 45 78 70 72 20 2a 70 53 75 62 45 78 70 72    Expr *pSubExpr
cc40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f   = sqlite3ExprFo
cc50: 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61  rVectorField(pPa
cc60: 72 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a  rse, pExpr, i);.
cc70: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
cc80: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
cc90: 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  d(pParse, pList,
cca0: 20 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20   pSubExpr);.    
ccb0: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
ccc0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
ccd0: 2d 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b  ->nExpr==iFirst+
cce0: 69 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69  i+1 );.      pLi
ccf0: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
cd00: 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43  pr-1].zName = pC
cd10: 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61  olumns->a[i].zNa
cd20: 6d 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d  me;.      pColum
cd30: 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  ns->a[i].zName =
cd40: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
cd50: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
cd60: 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 4c 69  TK_SELECT && pLi
cd70: 73 74 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  st ){.    Expr *
cd80: 70 46 69 72 73 74 20 3d 20 70 4c 69 73 74 2d 3e  pFirst = pList->
cd90: 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 3b  a[iFirst].pExpr;
cda0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
cdb0: 72 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  rst!=0 );.    as
cdc0: 73 65 72 74 28 20 70 46 69 72 73 74 2d 3e 6f 70  sert( pFirst->op
cdd0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  ==TK_SELECT_COLU
cde0: 4d 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  MN );.     .    
cdf0: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 53 45 4c  /* Store the SEL
ce00: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
ce10: 20 70 52 69 67 68 74 20 73 6f 20 69 74 20 77 69   pRight so it wi
ce20: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68  ll be deleted wh
ce30: 65 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  en.    ** sqlite
ce40: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
ce50: 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  ) is called */. 
ce60: 20 20 20 70 46 69 72 73 74 2d 3e 70 52 69 67 68     pFirst->pRigh
ce70: 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70  t = pExpr;.    p
ce80: 45 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Expr = 0;..    /
ce90: 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 73  * Remember the s
cea0: 69 7a 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69  ize of the LHS i
ceb0: 6e 20 69 54 61 62 6c 65 20 73 6f 20 74 68 61 74  n iTable so that
cec0: 20 77 65 20 63 61 6e 20 63 68 65 63 6b 20 74 68   we can check th
ced0: 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48  at.    ** the RH
cee0: 53 20 61 6e 64 20 4c 48 53 20 73 69 7a 65 73 20  S and LHS sizes 
cef0: 6d 61 74 63 68 20 64 75 72 69 6e 67 20 63 6f 64  match during cod
cf00: 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f  e generation. */
cf10: 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 69 54 61  .    pFirst->iTa
cf20: 62 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e  ble = pColumns->
cf30: 6e 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f 72  nId;.  }..vector
cf40: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20  _append_error:. 
cf50: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
cf60: 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
cf70: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
cf80: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e  lete(db, pColumn
cf90: 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  s);.  return pLi
cfa0: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  st;.}../*.** Set
cfb0: 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20   the sort order 
cfc0: 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6c 65  for the last ele
cfd0: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69 76 65  ment on the give
cfe0: 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76  n ExprList..*/.v
cff0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
d000: 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28  istSetSortOrder(
d010: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
d020: 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20   iSortOrder){.  
d030: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
d040: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  n;.  assert( SQL
d050: 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44  ITE_SO_UNDEFINED
d060: 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f  <0 && SQLITE_SO_
d070: 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49 54 45  ASC>=0 && SQLITE
d080: 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20  _SO_DESC>0 );.  
d090: 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78 70 72  assert( p->nExpr
d0a0: 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f 72  >0 );.  if( iSor
d0b0: 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20 20 20  tOrder<0 ){.    
d0c0: 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e  assert( p->a[p->
d0d0: 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64  nExpr-1].sortOrd
d0e0: 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  er==SQLITE_SO_AS
d0f0: 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  C );.    return;
d100: 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e  .  }.  p->a[p->n
d110: 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65  Expr-1].sortOrde
d120: 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64  r = (u8)iSortOrd
d130: 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  er;.}../*.** Set
d140: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
d150: 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20  ].zName element 
d160: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
d170: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
d180: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
d190: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
d1a0: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
d1b0: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
d1c0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
d1d0: 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  t pName should n
d1e0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
d1f0: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
d200: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
d210: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
d220: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
d230: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
d240: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
d250: 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50  ListSetName(.  P
d260: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d270: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
d280: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
d290: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
d2a0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
d2b0: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
d2c0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f  he span. */.  To
d2d0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
d2e0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f        /* Name to
d2f0: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69   be added */.  i
d300: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
d310: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
d320: 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65  o cause the name
d330: 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20   to be dequoted 
d340: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
d350: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72  pList!=0 || pPar
d360: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
d370: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
d380: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
d390: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
d3a0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
d3b0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
d3c0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74  xpr>0 );.    pIt
d3d0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
d3e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
d3f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
d400: 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  m->zName==0 );. 
d410: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
d420: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
d430: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
d440: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
d450: 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75  n);.    if( dequ
d460: 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44 65 71  ote ) sqlite3Deq
d470: 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  uote(pItem->zNam
d480: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
d490: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
d4a0: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d  t.a[].zSpan elem
d4b0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
d4c0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
d4d0: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
d4e0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
d4f0: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
d500: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
d510: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
d520: 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75    But pSpan shou
d530: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
d540: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
d550: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
d560: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
d570: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d580: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
d590: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d5a0: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
d5b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d5c0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
d5d0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d5e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
d5f0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
d600: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
d610: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
d620: 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61    ExprSpan *pSpa
d630: 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n         /* The
d640: 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65   span to be adde
d650: 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
d660: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d670: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  db;.  assert( pL
d680: 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ist!=0 || db->ma
d690: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
d6a0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
d6b0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
d6c0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
d6d0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
d6e0: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
d6f0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
d700: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
d710: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
d720: 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d  cFailed || pItem
d730: 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e  ->pExpr==pSpan->
d740: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c  pExpr );.    sql
d750: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
d760: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
d770: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
d780: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
d790: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
d7a0: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
d7e0: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
d7f0: 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t));.  }.}../*.*
d800: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
d810: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
d820: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
d830: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
d840: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
d850: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
d860: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
d870: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d880: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
d890: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
d8a0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
d8b0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
d8c0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
d8d0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
d8e0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
d8f0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
d900: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
d910: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
d920: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
d930: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
d940: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
d950: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
d960: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
d970: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
d980: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d990: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
d9a0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
d9b0: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
d9c0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
d9d0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
d9e0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ion list..*/.sta
d9f0: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
da00: 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73  INE void exprLis
da10: 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65  tDeleteNN(sqlite
da20: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
da30: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
da40: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
da50: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
da60: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
da70: 20 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 61 73    pList->a;.  as
da80: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
da90: 70 72 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  pr>0 );.  do{.  
daa0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
dab0: 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
dac0: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
dad0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
dae0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
daf0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
db00: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
db10: 0a 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20  .    pItem++;.  
db20: 7d 77 68 69 6c 65 28 20 2d 2d 69 3e 30 20 29 3b  }while( --i>0 );
db30: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
db40: 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
db50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
db60: 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  rListDelete(sqli
db70: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
db80: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28  t *pList){.  if(
db90: 20 70 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73   pList ) exprLis
dba0: 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c  tDeleteNN(db, pL
dbb0: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ist);.}../*.** R
dbc0: 65 74 75 72 6e 20 74 68 65 20 62 69 74 77 69 73  eturn the bitwis
dbd0: 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72  e-OR of all Expr
dbe0: 2e 66 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e  .flags fields in
dbf0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78   the given.** Ex
dc00: 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73  prList..*/.u32 s
dc10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
dc20: 61 67 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69  ags(const ExprLi
dc30: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
dc40: 74 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30  t i;.  u32 m = 0
dc50: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
dc60: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
dc70: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
dc80: 2b 29 7b 0a 20 20 20 20 20 20 20 45 78 70 72 20  +){.       Expr 
dc90: 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  *pExpr = pList->
dca0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
dcb0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
dcc0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 6d 20  !=0 );.       m 
dcd0: 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b  |= pExpr->flags;
dce0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
dcf0: 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn m;.}../*.** 
dd00: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
dd10: 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61  re Walker callba
dd20: 63 6b 73 20 75 73 65 64 20 74 6f 20 63 68 65 63  cks used to chec
dd30: 6b 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f  k expressions to
dd40: 0a 2a 2a 20 73 65 65 20 69 66 20 74 68 65 79 20  .** see if they 
dd50: 61 72 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66  are "constant" f
dd60: 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69  or some definiti
dd70: 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20  on of constant. 
dd80: 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65   The.** Walker.e
dd90: 43 6f 64 65 20 76 61 6c 75 65 20 64 65 74 65 72  Code value deter
dda0: 6d 69 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f  mines the type o
ddb0: 66 20 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20  f "constant" we 
ddc0: 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66  are looking.** f
ddd0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  or..**.** These 
dde0: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
ddf0: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d  s are used to im
de00: 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c  plement the foll
de10: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
de20: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
de30: 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20  nstant()        
de40: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
de50: 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20  r->eCode==1.**  
de60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
de70: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
de80: 29 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c  )           pWal
de90: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a  ker->eCode==2.**
dea0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
deb0: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
dec0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57  )             pW
ded0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a  alker->eCode==3.
dee0: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
def0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
df00: 6e 63 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20  nction()        
df10: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
df20: 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20  4 or 5.**.** In 
df30: 61 6c 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63  all cases, the c
df40: 61 6c 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c  allbacks set Wal
df50: 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20  ker.eCode=0 and 
df60: 61 62 6f 72 74 20 69 66 20 74 68 65 20 65 78 70  abort if the exp
df70: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f  ression.** is fo
df80: 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20  und to not be a 
df90: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20  constant..**.** 
dfa0: 54 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 49  The sqlite3ExprI
dfb0: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
dfc0: 69 6f 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f  ion() is used fo
dfd0: 72 20 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70  r evaluating exp
dfe0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61  ressions.** in a
dff0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
e000: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61  atement.  The Wa
e010: 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65  lker.eCode value
e020: 20 69 73 20 35 20 77 68 65 6e 20 70 61 72 73 69   is 5 when parsi
e030: 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e  ng.** an existin
e040: 67 20 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77  g schema and 4 w
e050: 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  hen processing a
e060: 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20   new statement. 
e070: 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61   A bound.** para
e080: 6d 65 74 65 72 20 72 61 69 73 65 73 20 61 6e 20  meter raises an 
e090: 65 72 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74  error for new st
e0a0: 61 74 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73  atements, but is
e0b0: 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72   silently conver
e0c0: 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66  ted.** to NULL f
e0d0: 6f 72 20 65 78 69 73 74 69 6e 67 20 73 63 68 65  or existing sche
e0e0: 6d 61 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77  mas.  This allow
e0f0: 73 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  s sqlite_master 
e100: 74 61 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20  tables that .** 
e110: 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20  contain a bound 
e120: 70 61 72 61 6d 65 74 65 72 20 62 65 63 61 75 73  parameter becaus
e130: 65 20 74 68 65 79 20 77 65 72 65 20 67 65 6e 65  e they were gene
e140: 72 61 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76  rated by older v
e150: 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  ersions.** of SQ
e160: 4c 69 74 65 20 74 6f 20 62 65 20 70 61 72 73 65  Lite to be parse
e170: 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69  d by newer versi
e180: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69  ons of SQLite wi
e190: 74 68 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a  thout raising a.
e1a0: 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68  ** malformed sch
e1b0: 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74  ema error..*/.st
e1c0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
e1d0: 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b  eIsConstant(Walk
e1e0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
e1f0: 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a  r *pExpr){..  /*
e200: 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f   If pWalker->eCo
e210: 64 65 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79  de is 2 then any
e220: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70   term of the exp
e230: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d  ression that com
e240: 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  es from.  ** the
e250: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
e260: 75 73 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a  uses of a left j
e270: 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73  oin disqualifies
e280: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
e290: 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20    ** from being 
e2a0: 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74  considered const
e2b0: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57  ant. */.  if( pW
e2c0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20  alker->eCode==2 
e2d0: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
e2e0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
e2f0: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57  mJoin) ){.    pW
e300: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
e310: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
e320: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73  _Abort;.  }..  s
e330: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
e340: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69   ){.    /* Consi
e350: 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  der functions to
e360: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20   be constant if 
e370: 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65  all their argume
e380: 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  nts are constant
e390: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68  .    ** and eith
e3a0: 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  er pWalker->eCod
e3b0: 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65  e==4 or 5 or the
e3c0: 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68   function has th
e3d0: 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  e.    ** SQLITE_
e3e0: 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e  FUNC_CONST flag.
e3f0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
e400: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
e410: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
e420: 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73  de>=4 || ExprHas
e430: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45  Property(pExpr,E
e440: 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a  P_ConstFunc) ){.
e450: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
e460: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
e470: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e480: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
e490: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
e4a0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
e4b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65        }.    case
e4c0: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
e4d0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
e4e0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
e4f0: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
e500: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
e510: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
e520: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
e530: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
e540: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e550: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
e560: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
e570: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
e580: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  TION );.      te
e590: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
e5a0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
e5b0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   );.      if( pW
e5c0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20  alker->eCode==3 
e5d0: 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
e5e0: 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75  ==pWalker->u.iCu
e5f0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  r ){.        ret
e600: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
e610: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e620: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
e630: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
e640: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
e650: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
e660: 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
e670: 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  E:.      if( pWa
e680: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29  lker->eCode==5 )
e690: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c  {.        /* Sil
e6a0: 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f  ently convert bo
e6b0: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 74  und parameters t
e6c0: 68 61 74 20 61 70 70 65 61 72 20 69 6e 73 69 64  hat appear insid
e6d0: 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20  e of CREATE.    
e6e0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
e6f0: 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68  s into a NULL wh
e700: 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20 43  en parsing the C
e710: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
e720: 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20  text out.       
e730: 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74   ** of the sqlit
e740: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e_master table *
e750: 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  /.        pExpr-
e760: 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
e770: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
e780: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
e790: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
e7a0: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
e7b0: 20 69 6e 20 61 20 43 52 45 41 54 45 20 73 74 61   in a CREATE sta
e7c0: 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67  tement that orig
e7d0: 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20  inates from.    
e7e0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70      ** sqlite3_p
e7f0: 72 65 70 61 72 65 28 29 20 63 61 75 73 65 73 20  repare() causes 
e800: 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
e810: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
e820: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
e830: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
e840: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e850: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
e860: 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  */.    default:.
e870: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e880: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
e890: 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63  LECT ); /* selec
e8a0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20  tNodeIsConstant 
e8b0: 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f  will disallow */
e8c0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e8d0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
e8e0: 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65  XISTS ); /* sele
e8f0: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
e900: 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a   will disallow *
e910: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  /.      return W
e920: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d  RC_Continue;.  }
e930: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  .}.static int se
e940: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
e950: 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
e960: 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  er, Select *NotU
e970: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
e980: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
e990: 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  );.  pWalker->eC
e9a0: 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ode = 0;.  retur
e9b0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73  n WRC_Abort;.}.s
e9c0: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73  tatic int exprIs
e9d0: 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69  Const(Expr *p, i
e9e0: 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74  nt initFlag, int
e9f0: 20 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72   iCur){.  Walker
ea00: 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
ea10: 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
ea20: 20 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74    w.eCode = init
ea30: 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43  Flag;.  w.xExprC
ea40: 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f  allback = exprNo
ea50: 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20  deIsConstant;.  
ea60: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
ea70: 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73  k = selectNodeIs
ea80: 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 75 2e  Constant;.  w.u.
ea90: 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73  iCur = iCur;.  s
eaa0: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
eab0: 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
eac0: 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  w.eCode;.}../*.*
ead0: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
eae0: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
eaf0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
eb00: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
eb10: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64   constant.** and
eb20: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
eb30: 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66  s variables or f
eb40: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a  unction calls..*
eb50: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
eb60: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75  poses of this fu
eb70: 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65  nction, a double
eb80: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
eb90: 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73  ex: "abc").** is
eba0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61   considered a va
ebb0: 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e  riable but a sin
ebc0: 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  gle-quoted strin
ebd0: 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73  g (ex: 'abc') is
ebe0: 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a  .** a constant..
ebf0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
ec00: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70  prIsConstant(Exp
ec10: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
ec20: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31  exprIsConst(p, 1
ec30: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 0);.}../*.** W
ec40: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
ec50: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
ec60: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
ec70: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
ec80: 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64  nstant.** that d
ec90: 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65  oes no originate
eca0: 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20   from the ON or 
ecb0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
ecc0: 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75   a join..** Retu
ecd0: 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  rn 0 if it invol
ece0: 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
ecf0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20   function calls 
ed00: 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a  or terms from.**
ed10: 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   an ON or USING 
ed20: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  clause..*/.int s
ed30: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
ed40: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72  tantNotJoin(Expr
ed50: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
ed60: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c  xprIsConst(p, 2,
ed70: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   0);.}../*.** Wa
ed80: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
ed90: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
eda0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
edb0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
edc0: 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79  stant.** for any
edd0: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
ede0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  he table with cu
edf0: 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f  rsor iCur.  In o
ee00: 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a  ther words, the.
ee10: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  ** expression mu
ee20: 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  st not refer to 
ee30: 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e  any non-determin
ee40: 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e  istic function n
ee50: 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20  or any.** table 
ee60: 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e  other than iCur.
ee70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
ee80: 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
ee90: 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  nt(Expr *p, int 
eea0: 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  iCur){.  return 
eeb0: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33  exprIsConst(p, 3
eec0: 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iCur);.}../*.*
eed0: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
eee0: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
eef0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
ef00: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
ef10: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20   constant.** or 
ef20: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  a function call 
ef30: 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72  with constant ar
ef40: 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
ef50: 20 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a   and 0 if there.
ef60: 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61  ** are any varia
ef70: 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  bles..**.** For 
ef80: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
ef90: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
efa0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
efb0: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
efc0: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
efd0: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
efe0: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
eff0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
f000: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
f010: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
f020: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
f030: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78  antOrFunction(Ex
f040: 70 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74  pr *p, u8 isInit
f050: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49  ){.  assert( isI
f060: 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74  nit==0 || isInit
f070: 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==1 );.  return 
f080: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34  exprIsConst(p, 4
f090: 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a  +isInit, 0);.}..
f0a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f0b0: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
f0c0: 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  S./*.** Walk an 
f0d0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
f0e0: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
f0f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  e expression con
f100: 74 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75  tains a.** subqu
f110: 65 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ery of some kind
f120: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
f130: 68 65 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71  here are no subq
f140: 75 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ueries..*/.int s
f150: 71 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69  qlite3ExprContai
f160: 6e 73 53 75 62 71 75 65 72 79 28 45 78 70 72 20  nsSubquery(Expr 
f170: 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  *p){.  Walker w;
f180: 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
f190: 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
f1a0: 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e  .eCode = 1;.  w.
f1b0: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
f1c0: 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
f1d0: 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  oop;.  w.xSelect
f1e0: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
f1f0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  tNodeIsConstant;
f200: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
f210: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
f220: 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a  urn w.eCode==0;.
f230: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
f240: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
f250: 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
f260: 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
f270: 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
f280: 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
f290: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
f2a0: 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
f2b0: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
f2c0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
f2d0: 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
f2e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
f2f0: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
f300: 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
f310: 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
f320: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
f330: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
f340: 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
f350: 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
f360: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
f370: 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
f380: 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
f390: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
f3a0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
f3b0: 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 20 6f  urn 0;  /* Can o
f3c0: 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f  nly happen follo
f3d0: 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a  wing on OOM */..
f3e0: 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65    /* If an expre
f3f0: 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65  ssion is an inte
f400: 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74  ger literal that
f410: 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65   fits in a signe
f420: 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e  d 32-bit.  ** in
f430: 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20  teger, then the 
f440: 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67  EP_IntValue flag
f450: 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
f460: 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20  dy been set */. 
f470: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
f480: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70  TK_INTEGER || (p
f490: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
f4a0: 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20  Value)!=0.      
f4b0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
f4c0: 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f  etInt32(p->u.zTo
f4d0: 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a  ken, &rc)==0 );.
f4e0: 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  .  if( p->flags 
f4f0: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
f500: 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70  .    *pValue = p
f510: 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
f520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
f530: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
f540: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
f550: 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  US: {.      rc =
f560: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
f570: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
f580: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  pValue);.      b
f590: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f5a0: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
f5b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20  {.      int v;. 
f5c0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
f5d0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
f5e0: 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20  >pLeft, &v) ){. 
f5f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76         assert( v
f600: 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31  !=(-2147483647-1
f610: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56  ) );.        *pV
f620: 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20  alue = -v;.     
f630: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
f640: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f650: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
f660: 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  t: break;.  }.  
f670: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f680: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
f690: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
f6a0: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
f6b0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
f6c0: 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e NULL..**.** If
f6d0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
f6e0: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72  might be NULL or
f6f0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
f700: 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65  on is too comple
f710: 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74  x.** to tell ret
f720: 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a  urn TRUE.  .**.*
f730: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
f740: 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74  s used as an opt
f750: 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b  imization, to sk
f760: 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63  ip OP_IsNull opc
f770: 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20  odes.** when we 
f780: 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75  know that a valu
f790: 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  e cannot be NULL
f7a0: 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73  .  Hence, a fals
f7b0: 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72  e positive.** (r
f7c0: 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68  eturning TRUE wh
f7d0: 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65  en in fact the e
f7e0: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65  xpression can ne
f7f0: 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67  ver be NULL) mig
f800: 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c  ht.** be a small
f810: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
f820: 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
f830: 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20  e harmless.  On 
f840: 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e  the other.** han
f850: 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74  d, a false negat
f860: 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46  ive (returning F
f870: 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65  ALSE when the re
f880: 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55  sult could be NU
f890: 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65  LL).** will like
f8a0: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
f8b0: 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  incorrect answer
f8c0: 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f  .  So when in do
f8d0: 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54  ubt, return.** T
f8e0: 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  RUE..*/.int sqli
f8f0: 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
f900: 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b  (const Expr *p){
f910: 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c  .  u8 op;.  whil
f920: 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
f930: 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
f940: 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
f950: 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
f960: 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
f970: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
f980: 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
f990: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
f9a0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
f9b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
f9c0: 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54  RING:.    case T
f9d0: 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
f9e0: 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  e TK_BLOB:.     
f9f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63   return 0;.    c
fa00: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
fa10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
fa20: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
fa30: 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50   return ExprHasP
fa40: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61  roperty(p, EP_Ca
fa50: 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20  nBeNull) ||.    
fa60: 20 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f           (p->iCo
fa70: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54  lumn>=0 && p->pT
fa80: 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c  ab->aCol[p->iCol
fa90: 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29  umn].notNull==0)
faa0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
fab0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
fac0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
fad0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
fae0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
faf0: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68  is a constant wh
fb00: 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20  ich would be.** 
fb10: 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f  unchanged by OP_
fb20: 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68  Affinity with th
fb30: 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e  e affinity given
fb40: 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   in the second.*
fb50: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
fb60: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
fb70: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
fb80: 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66  ine if the OP_Af
fb90: 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e  finity operation
fba0: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74  .** can be omitt
fbb0: 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75  ed.  When in dou
fbc0: 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  bt return FALSE.
fbd0: 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69    A false negati
fbe0: 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73  ve.** is harmles
fbf0: 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69  s.  A false posi
fc00: 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63  tive, however, c
fc10: 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65  an result in the
fc20: 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72   wrong.** answer
fc30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fc40: 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
fc50: 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20  ityChange(const 
fc60: 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66  Expr *p, char af
fc70: 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69  f){.  u8 op;.  i
fc80: 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  f( aff==SQLITE_A
fc90: 46 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e  FF_BLOB ) return
fca0: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   1;.  while( p->
fcb0: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
fcc0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
fcd0: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74   ){ p = p->pLeft
fce0: 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ; }.  op = p->op
fcf0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
fd00: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
fd10: 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28  ->op2;.  switch(
fd20: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
fd30: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
fd40: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
fd50: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
fd60: 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ER || aff==SQLIT
fd70: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
fd80: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
fd90: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
fda0: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
fdb0: 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61  TE_AFF_REAL || a
fdc0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
fdd0: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
fde0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
fdf0: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
fe00: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
fe10: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _TEXT;.    }.   
fe20: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
fe30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
fe40: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
fe50: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
fe60: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54     assert( p->iT
fe70: 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70  able>=0 );  /* p
fe80: 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20   cannot be part 
fe90: 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74  of a CHECK const
fea0: 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72  raint */.      r
feb0: 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e  eturn p->iColumn
fec0: 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  <0.          && 
fed0: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
fee0: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
fef0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
ff00: 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RIC);.    }.    
ff10: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
ff20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
ff30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
ff40: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
ff50: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73   given string is
ff60: 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e   a row-id column
ff70: 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   name..*/.int sq
ff80: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e  lite3IsRowid(con
ff90: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
ffa0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
ffb0: 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d  p(z, "_ROWID_")=
ffc0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
ffd0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
ffe0: 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d  Cmp(z, "ROWID")=
fff0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
10000 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
10010 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30  Cmp(z, "OID")==0
10020 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
10030 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
10040 2a 20 70 58 20 69 73 20 74 68 65 20 52 48 53 20  * pX is the RHS 
10050 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  of an IN operato
10060 72 2e 20 20 49 66 20 70 58 20 69 73 20 61 20 53  r.  If pX is a S
10070 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
10080 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20  .** that can be 
10090 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20  simplified to a 
100a0 64 69 72 65 63 74 20 74 61 62 6c 65 20 61 63 63  direct table acc
100b0 65 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ess, then return
100c0 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
100d0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
100e0 65 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73  ement.  If pX is
100f0 20 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74   not a SELECT st
10100 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69  atement,.** or i
10110 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
10120 74 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  tement needs to 
10130 62 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e  be manifested in
10140 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a  to a transient.*
10150 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65  * table, then re
10160 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69  turn NULL..*/.#i
10170 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10180 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69  T_SUBQUERY.stati
10190 63 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64  c Select *isCand
101a0 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78  idateForInOpt(Ex
101b0 70 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63  pr *pX){.  Selec
101c0 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20  t *p;.  SrcList 
101d0 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73  *pSrc;.  ExprLis
101e0 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62  t *pEList;.  Tab
101f0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20  le *pTab;.  int 
10200 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  i;.  if( !ExprHa
10210 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
10220 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20 72 65  _xIsSelect) ) re
10230 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20  turn 0;  /* Not 
10240 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  a subquery */.  
10250 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
10260 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65  rty(pX, EP_VarSe
10270 6c 65 63 74 29 20 20 29 20 72 65 74 75 72 6e 20  lect)  ) return 
10280 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65  0;  /* Correlate
10290 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20  d subq */.  p = 
102a0 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pX->x.pSelect;. 
102b0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
102c0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
102d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61          /* Not a
102e0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
102f0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
10300 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
10310 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
10320 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  e) ){.    testca
10330 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  se( (p->selFlags
10340 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
10350 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
10360 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
10370 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d     testcase( (p-
10380 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
10390 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
103a0 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
103b0 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74  egate );.    ret
103c0 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53  urn 0; /* No DIS
103d0 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e  TINCT keyword an
103e0 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66  d no aggregate f
103f0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a  unctions */.  }.
10400 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
10410 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20  oupBy==0 );     
10420 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
10430 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
10440 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  se */.  if( p->p
10450 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
10460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10470 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63  * Has no LIMIT c
10480 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  lause */.  asser
10490 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
104a0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
104b0 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65    /* No LIMIT me
104c0 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f  ans no OFFSET */
104d0 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
104e0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
104f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
10500 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
10510 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   */.  pSrc = p->
10520 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
10530 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSrc!=0 );.  if(
10540 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
10550 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
10560 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65      /* Single te
10570 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  rm in FROM claus
10580 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d  e */.  if( pSrc-
10590 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20  >a[0].pSelect ) 
105a0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
105b0 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73   FROM is not a s
105c0 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20  ubquery or view 
105d0 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  */.  pTab = pSrc
105e0 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61  ->a[0].pTab;.  a
105f0 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
10600 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
10610 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20  ->pSelect==0 ); 
10620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
10630 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  OM clause is not
10640 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28   a view */.  if(
10650 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
10660 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
10670 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
10680 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  se not a virtual
10690 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69   table */.  pELi
106a0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
106b0 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
106c0 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20  !=0 );.  /* All 
106d0 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d  SELECT results m
106e0 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20  ust be columns. 
106f0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
10700 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
10710 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
10720 52 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  Res = pEList->a[
10730 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
10740 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43  ( pRes->op!=TK_C
10750 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
10760 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
10770 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  es->iTable==pSrc
10780 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[0].iCursor )
10790 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72  ;  /* Not a corr
107a0 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20  elated subquery 
107b0 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
107c0 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  p;.}.#endif /* S
107d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
107e0 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
107f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
10800 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
10810 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 68  ate code that ch
10820 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  ecks the left-mo
10830 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  st column of ind
10840 65 78 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f  ex table iCur to
10850 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f   see if.** it co
10860 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20  ntains any NULL 
10870 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65 20  entries.  Cause 
10880 74 68 65 20 72 65 67 69 73 74 65 72 20 61 74 20  the register at 
10890 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65  regHasNull to be
108a0 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e   set.** to a non
108b0 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69  -NULL value if i
108c0 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  Cur contains no 
108d0 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65  NULLs.  Cause re
108e0 67 69 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c  gister regHasNul
108f0 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74  l.** to be set t
10900 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63  o NULL if iCur c
10910 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
10920 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
10930 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10940 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
10950 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69  lFlag(Vdbe *v, i
10960 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67  nt iCur, int reg
10970 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20  HasNull){.  int 
10980 61 64 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33  addr1;.  sqlite3
10990 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
109a0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
109b0 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72  HasNull);.  addr
109c0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
109d0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
109e0 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43  nd, iCur); VdbeC
109f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
10a00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
10a10 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43  v, OP_Column, iC
10a20 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  ur, 0, regHasNul
10a30 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l);.  sqlite3Vdb
10a40 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
10a50 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a  LAG_TYPEOFARG);.
10a60 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
10a70 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69  , "first_entry_i
10a80 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a  n(%d)", iCur));.
10a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10aa0 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
10ab0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
10ac0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10ad0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
10ae0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
10af0 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
10b00 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  th a list (not a
10b10 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68   subquery) on th
10b20 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64  e .** right-hand
10b30 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54   side.  Return T
10b40 52 55 45 20 69 66 20 74 68 61 74 20 6c 69 73 74  RUE if that list
10b50 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f   is constant..*/
10b60 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
10b70 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61  te3InRhsIsConsta
10b80 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  nt(Expr *pIn){. 
10b90 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69   Expr *pLHS;.  i
10ba0 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
10bb0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
10bc0 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65  ty(pIn, EP_xIsSe
10bd0 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20  lect) );.  pLHS 
10be0 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20  = pIn->pLeft;.  
10bf0 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  pIn->pLeft = 0;.
10c00 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45    res = sqlite3E
10c10 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49  xprIsConstant(pI
10c20 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  n);.  pIn->pLeft
10c30 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72   = pLHS;.  retur
10c40 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n res;.}.#endif.
10c50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
10c60 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
10c70 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
10c80 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e  on of the IN (..
10c90 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .) operator..** 
10ca0 54 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72  The pX parameter
10cb0 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69   is the expressi
10cc0 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  on on the RHS of
10cd0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
10ce0 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  , which.** might
10cf0 20 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73   be either a lis
10d00 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
10d10 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
10d20 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
10d30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
10d40 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61   to find or crea
10d50 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65  te a b-tree obje
10d60 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62  ct that can.** b
10d70 65 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f  e used either to
10d80 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72   test for member
10d90 73 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20  ship in the RHS 
10da0 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74  set or to iterat
10db0 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c  e through.** all
10dc0 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20   members of the 
10dd0 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e  RHS set, skippin
10de0 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
10df0 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20  .** A cursor is 
10e00 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d  opened on the b-
10e10 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
10e20 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74   is the RHS of t
10e30 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
10e40 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65  * and pX->iTable
10e50 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
10e60 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72  ndex of that cur
10e70 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  sor..**.** The r
10e80 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66  eturned value of
10e90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
10ea0 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74  ndicates the b-t
10eb0 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c  ree type, as fol
10ec0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e  lows:.**.**   IN
10ed0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20  _INDEX_ROWID    
10ee0 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
10ef0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
10f00 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
10f10 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
10f20 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75  EX_ASC  - The cu
10f30 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
10f40 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
10f50 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
10f60 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
10f70 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
10f80 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73   opened on a des
10f90 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
10fa0 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
10fb0 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75          - The cu
10fc0 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
10fd0 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63  on a specially c
10fe0 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20  reated and.**   
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11000 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
11010 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
11020 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e  .**   IN_INDEX_N
11030 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63  OOP       - No c
11040 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61  ursor was alloca
11050 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65  ted.  The IN ope
11060 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  rator must be.**
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65           impleme
11090 6e 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e  nted as a sequen
110a0 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
110b0 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  s..**.** An exis
110c0 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68  ting b-tree migh
110d0 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  t be used if the
110e0 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   RHS expression 
110f0 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a  pX is a simple.*
11100 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20  * subquery such 
11110 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  as:.**.**     SE
11120 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20  LECT <column1>, 
11130 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f  <column2>... FRO
11140 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20  M <table>.**.** 
11150 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
11160 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
11170 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72   a list or a mor
11180 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65  e complex subque
11190 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65  ry, then.** an e
111a0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d  phemeral table m
111b0 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20  ight need to be 
111c0 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
111d0 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a  he RHS and then.
111e0 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61  ** pX->iTable ma
111f0 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
11200 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
11210 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e  le instead of an
11220 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62  .** existing tab
11230 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  le..**.** The in
11240 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
11250 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 65 78 61  must contain exa
11260 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
11270 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58  bits.** IN_INDEX
11280 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49  _MEMBERSHIP or I
11290 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49  N_INDEX_LOOP.  I
112a0 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69  f inFlags contai
112b0 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ns.** IN_INDEX_M
112c0 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20  EMBERSHIP, then 
112d0 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61  the generated ta
112e0 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ble will be used
112f0 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d   for a.** fast m
11300 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e 20  embership test. 
11310 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44   When the IN_IND
11320 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73  EX_LOOP bit is s
11330 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e  et, the.** IN in
11340 64 65 78 20 77 69 6c 6c 20 62 65 20 75 73 65 64  dex will be used
11350 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c   to loop over al
11360 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  l values of the 
11370 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  RHS of the.** IN
11380 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
11390 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c   When IN_INDEX_L
113a0 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e 64  OOP is used (and
113b0 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c   the b-tree will
113c0 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72   be used to iter
113d0 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74  ate.** through t
113e0 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20  he set members) 
113f0 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  then the b-tree 
11400 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  must not contain
11410 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20   duplicates..** 
11420 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  An epheremal tab
11430 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
11440 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
11450 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
11460 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
11470 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
11480 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
11490 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
114a0 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20  MARY KEY or due 
114b0 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63  to.** a UNIQUE c
114c0 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64  onstraint or ind
114d0 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  ex..**.** When I
114e0 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
114f0 49 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  IP is used (and 
11500 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
11510 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
11520 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73  fast set members
11530 68 69 70 20 74 65 73 74 73 29 20 74 68 65 6e 20  hip tests) then 
11540 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  an epheremal tab
11550 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75  le must .** be u
11560 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75  sed unless <colu
11570 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65  mns> is a single
11580 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
11590 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61   KEY column or a
115a0 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20  n .** index can 
115b0 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68  be found with th
115c0 65 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c  e specified <col
115d0 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66  umns> as its lef
115e0 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  t-most..**.** If
115f0 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   the IN_INDEX_NO
11600 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44  OP_OK and IN_IND
11610 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72  EX_MEMBERSHIP ar
11620 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a  e both set and.*
11630 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  * if the RHS of 
11640 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
11650 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  is a list (not a
11660 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20   subquery) then 
11670 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
11680 6d 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61  might decide tha
11690 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  t creating an ep
116a0 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66  hemeral b-tree f
116b0 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a  or membership.**
116c0 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20   testing is too 
116d0 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65  expensive and re
116e0 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
116f0 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  OP.  In that cas
11700 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  e, the.** callin
11710 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  g routine should
11720 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49   implement the I
11730 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67  N operator using
11740 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f   a sequence.** o
11750 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61  f Eq or Ne compa
11760 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73  rison operations
11770 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
11780 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67   b-tree is being
11790 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72   used for member
117a0 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20  ship tests, the 
117b0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
117c0 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74  .** might need t
117d0 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  o know whether o
117e0 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69  r not the RHS si
117f0 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
11800 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  rator.** contain
11810 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72  s a NULL.  If pr
11820 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f  RhsHasNull is no
11830 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
11840 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72   and .** if ther
11850 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20  e is any chance 
11860 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d  that the (...) m
11870 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
11880 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20  ULL value at.** 
11890 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20  runtime, then a 
118a0 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
118b0 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  cated and the re
118c0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72  gister number wr
118d0 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52  itten.** to *prR
118e0 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68  hsHasNull. If th
118f0 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
11900 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
11910 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
11920 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
11930 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
11940 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
11950 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
11960 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
11970 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
11980 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52  n stored in *prR
11990 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a  hsHasNull, then.
119a0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ** the value in 
119b0 74 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69  that register wi
119c0 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
119d0 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
119e0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  s one or more.**
119f0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e   NULL values, an
11a00 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d  d it will be som
11a10 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  e non-NULL value
11a20 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
11a30 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55  ontains no.** NU
11a40 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  LL values..**.**
11a50 20 49 66 20 74 68 65 20 61 69 4d 61 70 20 70 61   If the aiMap pa
11a60 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e  rameter is not N
11a70 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69  ULL, it must poi
11a80 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63  nt to an array c
11a90 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65  ontaining.** one
11aa0 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63   element for eac
11ab0 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65  h column returne
11ac0 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
11ad0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65  statement on the
11ae0 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49   RHS.** of the I
11af0 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e  N(...) operator.
11b00 20 54 68 65 20 69 27 74 68 20 65 6e 74 72 79 20   The i'th entry 
11b10 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  of the array is 
11b20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
11b30 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20  he.** offset of 
11b40 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
11b50 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
11b60 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65  e i'th column re
11b70 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
11b80 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61   SELECT. For exa
11b90 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70  mple, if the exp
11ba0 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65  ression and sele
11bb0 63 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a  cted index are:.
11bc0 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20  **.**   (?,?,?) 
11bd0 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c  IN (SELECT a, b,
11be0 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20   c FROM t1).**  
11bf0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
11c00 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b   ON t1(b, c, a);
11c10 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61  .**.** then aiMa
11c20 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64  p[] is populated
11c30 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e   with {2, 0, 1}.
11c40 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
11c50 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
11c60 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
11c70 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  InIndex(.  Parse
11c80 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
11c90 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11ca0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
11cb0 70 72 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20  pr *pX,         
11cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11cd0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
11ce0 28 52 48 53 29 20 6f 66 20 74 68 65 20 49 4e 20  (RHS) of the IN 
11cf0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33  operator */.  u3
11d00 32 20 69 6e 46 6c 61 67 73 2c 20 20 20 20 20 20  2 inFlags,      
11d10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49           /* IN_I
11d20 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42  NDEX_LOOP, _MEMB
11d30 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f  ERSHIP, and/or _
11d40 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74  NOOP_OK */.  int
11d50 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
11d60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
11d70 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c  ter holding NULL
11d80 20 73 74 61 74 75 73 2e 20 20 53 65 65 20 6e 6f   status.  See no
11d90 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  tes */.  int *ai
11da0 4d 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20  Map             
11db0 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
11dc0 72 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c 64 73  rom Index fields
11dd0 20 74 6f 20 52 48 53 20 66 69 65 6c 64 73 20 2a   to RHS fields *
11de0 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
11df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11e10 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69  SELECT to the ri
11e20 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  ght of IN operat
11e30 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  or */.  int eTyp
11e40 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e60 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62   Type of RHS tab
11e70 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a  le. IN_INDEX_* *
11e80 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
11e90 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
11ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
11eb0 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74  sor of the RHS t
11ec0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
11ed0 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20  stBeUnique;     
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ef0 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d  /* True if RHS m
11f00 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f  ust be unique */
11f10 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
11f20 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
11f30 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74  se);     /* Virt
11f40 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
11f50 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73  g coded */..  as
11f60 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
11f70 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55  _IN );.  mustBeU
11f80 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73  nique = (inFlags
11f90 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50   & IN_INDEX_LOOP
11fa0 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  )!=0;..  /* If t
11fb0 68 65 20 52 48 53 20 6f 66 20 74 68 69 73 20 49  he RHS of this I
11fc0 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20  N(...) operator 
11fd0 69 73 20 61 20 53 45 4c 45 43 54 2c 20 61 6e 64  is a SELECT, and
11fe0 20 69 66 20 69 74 20 6d 61 74 74 65 72 73 20 0a   if it matters .
11ff0 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
12000 6e 6f 74 20 74 68 65 20 53 45 4c 45 43 54 20 72  not the SELECT r
12010 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e  esult contains N
12020 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68 65 63  ULL values, chec
12030 6b 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f  k whether.  ** o
12040 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63  r not NULL is ac
12050 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  tually possible 
12060 28 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20  (it may not be, 
12070 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64 75 65  for example, due
12080 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55   .  ** to NOT NU
12090 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  LL constraints i
120a0 6e 20 74 68 65 20 73 63 68 65 6d 61 29 2e 20 49  n the schema). I
120b0 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73  f no NULL values
120c0 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20   are possible,. 
120d0 20 2a 2a 20 73 65 74 20 70 72 52 68 73 48 61 73   ** set prRhsHas
120e0 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72 65  Null to 0 before
120f0 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f   continuing.  */
12100 0a 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e  .  if( prRhsHasN
12110 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61 67  ull && (pX->flag
12120 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
12130 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
12140 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
12150 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65  List = pX->x.pSe
12160 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
12170 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
12180 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
12190 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
121a0 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
121b0 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
121c0 78 70 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  xpr) ) break;.  
121d0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70    }.    if( i==p
121e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
121f0 20 20 20 20 20 20 70 72 52 68 73 48 61 73 4e 75        prRhsHasNu
12200 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ll = 0;.    }.  
12210 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
12220 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74   see if an exist
12230 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
12240 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ex can be used t
12250 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74  o.  ** satisfy t
12260 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20  he query.  This 
12270 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f  is preferable to
12280 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65   generating a ne
12290 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61  w .  ** ephemera
122a0 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69  l table.  */.  i
122b0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
122c0 3d 30 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e  =0 && (p = isCan
122d0 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
122e0 58 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  X))!=0 ){.    sq
122f0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
12300 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
12310 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
12320 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
12330 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
12360 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  le <table>. */. 
12370 20 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20     i16 iDb;     
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
123a0 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54  abase idx for pT
123b0 61 62 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69  ab */.    ExprLi
123c0 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e  st *pEList = p->
123d0 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  pEList;.    int 
123e0 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
123f0 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65  nExpr;..    asse
12400 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
12410 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
12420 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
12430 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
12440 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
12450 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  rt( p->pEList->a
12460 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20  [0].pExpr!=0 ); 
12470 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
12480 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
12490 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
124a0 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29  rt( p->pSrc!=0 )
124b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
124c0 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
124d0 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
124e0 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62  t(p) */.    pTab
124f0 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
12500 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43  .pTab;..    /* C
12510 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61  ode an OP_Transa
12520 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62  ction and OP_Tab
12530 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c  leLock for <tabl
12540 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  e>. */.    iDb =
12550 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
12560 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
12570 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71  pSchema);.    sq
12580 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
12590 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
125a0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  b);.    sqlite3T
125b0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
125c0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
125d0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
125e0 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 76  );..    assert(v
125f0 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 47 65  );  /* sqlite3Ge
12600 74 56 64 62 65 28 29 20 68 61 73 20 61 6c 77 61  tVdbe() has alwa
12610 79 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  ys been previous
12620 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20  ly called */.   
12630 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26 26   if( nExpr==1 &&
12640 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
12650 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
12660 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  {.      /* The "
12670 78 20 49 4e 20 28 53 45 4c 45 43 54 20 72 6f 77  x IN (SELECT row
12680 69 64 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 20  id FROM table)" 
12690 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  case */.      in
126a0 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
126b0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
126c0 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 56  P_Once);.      V
126d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
126e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
126f0 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
12700 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
12710 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
12720 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
12730 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20  INDEX_ROWID;..  
12740 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
12750 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
12760 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12770 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12790 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
127a0 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
127b0 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e  .      int affin
127c0 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20  ity_ok = 1;.    
127d0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20    int i;..      
127e0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
127f0 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
12800 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
12810 70 65 72 66 6f 72 6d 20 65 61 63 68 20 0a 20 20  perform each .  
12820 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
12830 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  n is the same as
12840 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
12850 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20   each column in 
12860 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f  table.      ** o
12870 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
12880 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49   IN operator.  I
12890 66 20 69 74 20 6e 6f 74 2c 20 69 74 20 69 73 20  f it not, it is 
128a0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a  not possible to.
128b0 20 20 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 79        ** use any
128c0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 52 48   index of the RH
128d0 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  S table.  */.   
128e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
128f0 78 70 72 20 26 26 20 61 66 66 69 6e 69 74 79 5f  xpr && affinity_
12900 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ok; i++){.      
12910 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
12920 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
12930 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65  dSubexpr(pX->pLe
12940 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
12950 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73  int iCol = pELis
12960 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69  t->a[i].pExpr->i
12970 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
12980 63 68 61 72 20 69 64 78 61 66 66 20 3d 20 73 71  char idxaff = sq
12990 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e  lite3TableColumn
129a0 41 66 66 69 6e 69 74 79 28 70 54 61 62 2c 69 43  Affinity(pTab,iC
129b0 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c  ol); /* RHS tabl
129c0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  e */.        cha
129d0 72 20 63 6d 70 61 66 66 20 3d 20 73 71 6c 69 74  r cmpaff = sqlit
129e0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
129f0 79 28 70 4c 68 73 2c 20 69 64 78 61 66 66 29 3b  y(pLhs, idxaff);
12a00 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
12a10 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54  e( cmpaff==SQLIT
12a20 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20  E_AFF_BLOB );.  
12a30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12a40 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  cmpaff==SQLITE_A
12a50 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20  FF_TEXT );.     
12a60 20 20 20 73 77 69 74 63 68 28 20 63 6d 70 61 66     switch( cmpaf
12a70 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  f ){.          c
12a80 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  ase SQLITE_AFF_B
12a90 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20  LOB:.           
12aa0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
12ab0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
12ac0 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20  F_TEXT:.        
12ad0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f      /* sqlite3Co
12ae0 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 29 20  mpareAffinity() 
12af0 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20 54 45 58  only returns TEX
12b00 54 20 69 66 20 6f 6e 65 20 73 69 64 65 20 6f 72  T if one side or
12b10 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
12b20 20 2a 2a 20 6f 74 68 65 72 20 68 61 73 20 6e 6f   ** other has no
12b30 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20 74 68   affinity and th
12b40 65 20 6f 74 68 65 72 20 73 69 64 65 20 69 73 20  e other side is 
12b50 54 45 58 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20  TEXT.  Hence,.  
12b60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
12b70 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72 20 63 6d   only way for cm
12b80 70 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 20  paff to be TEXT 
12b90 69 73 20 66 6f 72 20 69 64 78 61 66 66 20 74 6f  is for idxaff to
12ba0 20 62 65 20 54 45 58 54 0a 20 20 20 20 20 20 20   be TEXT.       
12bb0 20 20 20 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20       ** and for 
12bc0 74 68 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  the term on the 
12bd0 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 74 6f  LHS of the IN to
12be0 20 68 61 76 65 20 6e 6f 20 61 66 66 69 6e 69 74   have no affinit
12bf0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  y. */.          
12c00 20 20 61 73 73 65 72 74 28 20 69 64 78 61 66 66    assert( idxaff
12c10 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
12c20 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  T );.           
12c30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
12c40 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
12c50 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 5f         affinity_
12c60 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 75  ok = sqlite3IsNu
12c70 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64  mericAffinity(id
12c80 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d  xaff);.        }
12c90 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
12ca0 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20  if( affinity_ok 
12cb0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ){.        /* Se
12cc0 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
12cd0 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
12ce0 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68  will work for th
12cf0 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  is IN operator *
12d00 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  /.        for(pI
12d10 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
12d20 20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d   pIdx && eType==
12d30 30 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  0; pIdx=pIdx->pN
12d40 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
12d50 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b  Bitmask colUsed;
12d60 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73        /* Columns
12d70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 75 73   of the index us
12d80 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
12d90 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20  Bitmask mCol;   
12da0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f        /* Mask fo
12db0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
12dc0 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  lumn */.        
12dd0 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
12de0 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74  umn<nExpr ) cont
12df0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
12e00 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75  /* Maximum nColu
12e10 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74  mn is BMS-2, not
12e20 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74 20   BMS-1, so that 
12e30 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20  we can compute. 
12e40 20 20 20 20 20 20 20 20 20 2a 2a 20 42 49 54 4d           ** BITM
12e50 41 53 4b 28 6e 45 78 70 72 29 20 77 69 74 68 6f  ASK(nExpr) witho
12e60 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a  ut overflowing *
12e70 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
12e80 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  case( pIdx->nCol
12e90 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  umn==BMS-2 );.  
12ea0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
12eb0 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ( pIdx->nColumn=
12ec0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
12ed0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
12ee0 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63  olumn>=BMS-1 ) c
12ef0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12f00 20 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69     if( mustBeUni
12f10 71 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  que ){.         
12f20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65     if( pIdx->nKe
12f30 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20  yCol>nExpr.     
12f40 20 20 20 20 20 20 20 20 7c 7c 28 70 49 64 78 2d          ||(pIdx-
12f50 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26  >nColumn>nExpr &
12f60 26 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78  & !IsUniqueIndex
12f70 28 70 49 64 78 29 29 0a 20 20 20 20 20 20 20 20  (pIdx)).        
12f80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
12f90 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
12fa0 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73  /* This index is
12fb0 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76 65 72   not unique over
12fc0 20 74 68 65 20 49 4e 20 52 48 53 20 63 6f 6c 75   the IN RHS colu
12fd0 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  mns */.         
12fe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
12ff0 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f  .  .          co
13000 6c 55 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20  lUsed = 0;   /* 
13010 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78  Columns of index
13020 20 75 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a   used so far */.
13030 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
13040 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
13050 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
13060 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74  pr *pLhs = sqlit
13070 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
13080 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20  expr(pX->pLeft, 
13090 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
130a0 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c  Expr *pRhs = pEL
130b0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
130c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c  .            Col
130d0 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c  lSeq *pReq = sql
130e0 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
130f0 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
13100 20 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20   pLhs, pRhs);.  
13110 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
13120 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
13130 61 73 73 65 72 74 28 20 70 52 65 71 21 3d 30 20  assert( pReq!=0 
13140 7c 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e  || pRhs->iColumn
13150 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50  ==XN_ROWID || pP
13160 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20  arse->nErr );.  
13170 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
13180 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29  0; j<nExpr; j++)
13190 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
131a0 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
131b0 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f  mn[j]!=pRhs->iCo
131c0 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
131d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
131e0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43  ssert( pIdx->azC
131f0 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20  oll[j] );.      
13200 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65 71          if( pReq
13210 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
13220 72 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d  rICmp(pReq->zNam
13230 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  e, pIdx->azColl[
13240 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  j])!=0 ){.      
13250 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
13260 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
13270 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
13280 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
132a0 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20     if( j==nExpr 
132b0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
132c0 20 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b       mCol = MASK
132d0 42 49 54 28 6a 29 3b 0a 20 20 20 20 20 20 20 20  BIT(j);.        
132e0 20 20 20 20 69 66 28 20 6d 43 6f 6c 20 26 20 63      if( mCol & c
132f0 6f 6c 55 73 65 64 20 29 20 62 72 65 61 6b 3b 20  olUsed ) break; 
13300 2f 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75  /* Each column u
13310 73 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  sed only once */
13320 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .            col
13330 55 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20  Used |= mCol;.  
13340 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 69            if( ai
13350 4d 61 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d  Map ) aiMap[i] =
13360 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   j;.          }.
13370 20 20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73    .          ass
13380 65 72 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c  ert( i==nExpr ||
13390 20 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42   colUsed!=(MASKB
133a0 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a  IT(nExpr)-1) );.
133b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6f            if( co
133c0 6c 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28  lUsed==(MASKBIT(
133d0 6e 45 78 70 72 29 2d 31 29 20 29 7b 0a 20 20 20  nExpr)-1) ){.   
133e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
133f0 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
13400 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  nt, that means t
13410 68 65 20 69 6e 64 65 78 20 70 49 64 78 20 69 73  he index pIdx is
13420 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20   usable */.     
13430 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72         int iAddr
13440 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13450 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
13460 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
13470 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
13480 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
13490 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
134a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
134b0 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 30 2c 20 30  OP_Explain, 0, 0
134c0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
134d0 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
134e0 66 28 64 62 2c 20 22 55 53 49 4e 47 20 49 4e 44  f(db, "USING IND
134f0 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45  EX %s FOR IN-OPE
13500 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61  RATOR",pIdx->zNa
13510 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me),.           
13520 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a     P4_DYNAMIC);.
13530 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
13540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13550 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
13560 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
13570 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
13580 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13590 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
135a0 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
135b0 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
135c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
135d0 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
135e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
135f0 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  ert( IN_INDEX_IN
13600 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49  DEX_DESC == IN_I
13610 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31  NDEX_INDEX_ASC+1
13620 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
13630 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
13640 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64  _INDEX_ASC + pId
13650 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  x->aSortOrder[0]
13660 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  ;.  .           
13670 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
13680 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  l ){.#ifdef SQLI
13690 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
136a0 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
136b0 20 20 20 20 20 20 20 20 20 69 36 34 20 6d 61 73           i64 mas
136c0 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31  k = (1<<nExpr)-1
136d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
136e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
136f0 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75  4Dup8(v, OP_Colu
13700 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20  mnsUsed, .      
13710 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
13720 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61  , 0, 0, (u8*)&ma
13730 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  sk, P4_INT64);.#
13740 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
13750 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c      *prRhsHasNul
13760 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  l = ++pParse->nM
13770 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
13780 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29    if( nExpr==1 )
13790 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
137a0 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e    sqlite3SetHasN
137b0 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c  ullFlag(v, iTab,
137c0 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b   *prRhsHasNull);
137d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
137e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
137f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13800 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
13810 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
13820 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
13830 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* End loop over
13840 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20 20   indexes */.    
13850 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 61    } /* End if( a
13860 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a  ffinity_ok ) */.
13870 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 20      } /* End if 
13880 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69 6e 64  not an rowid ind
13890 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64  ex */.  } /* End
138a0 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69   attempt to opti
138b0 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20 69 6e  mize using an in
138c0 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  dex */..  /* If 
138d0 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20 69  no preexisting i
138e0 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c  ndex is availabl
138f0 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61  e for the IN cla
13900 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f  use.  ** and IN_
13910 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e  INDEX_NOOP is an
13920 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20   allowed reply. 
13930 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
13940 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
13950 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f  or is a list, no
13960 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a  t a subquery.  *
13970 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69 73  * and the RHS is
13980 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72   not constant or
13990 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65   has two or fewe
139a0 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68  r terms,.  ** th
139b0 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72  en it is not wor
139c0 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65  th creating an e
139d0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
139e0 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20  o evaluate.  ** 
139f0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
13a00 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44  so return IN_IND
13a10 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20  EX_NOOP..  */.  
13a20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20  if( eType==0.   
13a30 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e  && (inFlags & IN
13a40 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a  _INDEX_NOOP_OK).
13a50 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
13a60 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
13a70 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28  sSelect).   && (
13a80 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43  !sqlite3InRhsIsC
13a90 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70  onstant(pX) || p
13aa0 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  X->x.pList->nExp
13ab0 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65  r<=2).  ){.    e
13ac0 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
13ad0 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NOOP;.  }..  if(
13ae0 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20   eType==0 ){.   
13af0 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69   /* Could not fi
13b00 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  nd an existing t
13b10 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
13b20 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20   use as the RHS 
13b30 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57  b-tree..    ** W
13b40 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67  e will have to g
13b50 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d  enerate an ephem
13b60 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f  eral table to do
13b70 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f   the job..    */
13b80 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 4e 51  .    u32 savedNQ
13b90 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
13ba0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
13bb0 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e     int rMayHaveN
13bc0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79  ull = 0;.    eTy
13bd0 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50  pe = IN_INDEX_EP
13be0 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61  H;.    if( inFla
13bf0 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  gs & IN_INDEX_LO
13c00 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  OP ){.      pPar
13c10 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
13c20 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58   0;.      if( pX
13c30 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ->pLeft->iColumn
13c40 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 50 72  <0 && !ExprHasPr
13c50 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
13c60 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
13c70 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
13c80 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20  NDEX_ROWID;.    
13c90 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
13ca0 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29  ( prRhsHasNull )
13cb0 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48 61  {.      *prRhsHa
13cc0 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65  sNull = rMayHave
13cd0 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Null = ++pParse-
13ce0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  >nMem;.    }.   
13cf0 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
13d00 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58  elect(pParse, pX
13d10 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20  , rMayHaveNull, 
13d20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
13d30 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72  ROWID);.    pPar
13d40 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
13d50 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
13d60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
13d70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  X->iTable = iTab
13d80 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d  ;.  }..  if( aiM
13d90 61 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f  ap && eType!=IN_
13da0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
13db0 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44  && eType!=IN_IND
13dc0 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b  EX_INDEX_DESC ){
13dd0 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  .    int i, n;. 
13de0 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78     n = sqlite3Ex
13df0 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d  prVectorSize(pX-
13e00 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72  >pLeft);.    for
13e10 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20  (i=0; i<n; i++) 
13e20 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20  aiMap[i] = i;.  
13e30 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  }.  return eType
13e40 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
13e50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13e60 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41  SUBQUERY./*.** A
13e70 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73  rgument pExpr is
13e80 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e   an (?, ?...) IN
13e90 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
13ea0 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
13eb0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ion allocates an
13ec0 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d  d returns a nul-
13ed0 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
13ee0 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a  g containing .**
13ef0 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 20   the affinities 
13f00 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
13f10 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ach column of th
13f20 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a  e comparison..**
13f30 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
13f40 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
13f50 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e  the caller to en
13f60 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
13f70 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67  turned.** string
13f80 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   is eventually f
13f90 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  reed using sqlit
13fa0 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  e3DbFree()..*/.s
13fb0 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 72  tatic char *expr
13fc0 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73 65  INAffinity(Parse
13fd0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
13fe0 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a  pExpr){.  Expr *
13ff0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
14000 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  Left;.  int nVal
14010 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
14020 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
14030 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
14040 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61  ct = (pExpr->fla
14050 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
14060 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53  t) ? pExpr->x.pS
14070 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68 61  elect : 0;.  cha
14080 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65  r *zRet;..  asse
14090 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
140a0 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d  K_IN );.  zRet =
140b0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
140c0 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Raw(pParse->db, 
140d0 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a  nVal+1);.  if( z
140e0 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Ret ){.    int i
140f0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
14100 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
14110 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73 71     Expr *pA = sq
14120 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
14130 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69  Subexpr(pLeft, i
14140 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 20  );.      char a 
14150 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
14160 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20 20  inity(pA);.     
14170 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
14180 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20          zRet[i] 
14190 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
141a0 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63 74  Affinity(pSelect
141b0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
141c0 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20 20  Expr, a);.      
141d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
141e0 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20  Ret[i] = a;.    
141f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52    }.    }.    zR
14200 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b  et[nVal] = '\0';
14210 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
14220 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  et;.}.#endif..#i
14230 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14240 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
14250 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65 20   Load the Parse 
14260 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
14270 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
14280 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ent with an erro
14290 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66  r .** message of
142a0 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
142b0 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72     "sub-select r
142c0 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73  eturns N columns
142d0 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a 2a   - expected M".*
142e0 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  /   .void sqlite
142f0 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
14300 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
14310 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20  nt nActual, int 
14320 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73  nExpect){.  cons
14330 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22  t char *zFmt = "
14340 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
14350 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20  ns %d columns - 
14360 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20 20  expected %d";.  
14370 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14380 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41  pParse, zFmt, nA
14390 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b  ctual, nExpect);
143a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
143b0 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   Expression pExp
143c0 72 20 69 73 20 61 20 76 65 63 74 6f 72 20 74 68  r is a vector th
143d0 61 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64  at has been used
143e0 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20 77 68   in a context wh
143f0 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  ere.** it is not
14400 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66 20 70   permitted. If p
14410 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73 65  Expr is a sub-se
14420 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74 68 69  lect vector, thi
14430 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f  s routine .** lo
14440 61 64 73 20 74 68 65 20 50 61 72 73 65 20 6f 62  ads the Parse ob
14450 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65 73 73  ject with a mess
14460 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  age of the form:
14470 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65  .**.**   "sub-se
14480 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63  lect returns N c
14490 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
144a0 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  d 1".**.** Or, i
144b0 66 20 69 74 20 69 73 20 61 20 72 65 67 75 6c 61  f it is a regula
144c0 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f 72 3a  r scalar vector:
144d0 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61  .**.**   "row va
144e0 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20  lue misused".*/ 
144f0 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56    .void sqlite3V
14500 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 50 61  ectorErrorMsg(Pa
14510 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
14520 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e 64  r *pExpr){.#ifnd
14530 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
14540 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 70 45  UBQUERY.  if( pE
14550 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
14560 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  xIsSelect ){.   
14570 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
14580 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
14590 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
145a0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
145b0 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  1);.  }else.#end
145c0 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  if.  {.    sqlit
145d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
145e0 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
145f0 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  sused");.  }.}..
14600 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
14610 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73  ode for scalar s
14620 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61  ubqueries used a
14630 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70  s a subquery exp
14640 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c  ression, EXISTS,
14650 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74  .** or IN operat
14660 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  ors.  Examples:.
14670 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
14680 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
14690 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
146a0 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
146b0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
146c0 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
146d0 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49  query.**     x I
146e0 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20  N (4,5,11)      
146f0 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70          -- IN op
14700 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74  erator with list
14710 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
14720 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ide.**     x IN 
14730 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
14740 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72  )     -- IN oper
14750 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65  ator with subque
14760 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a  ry on the right.
14770 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20  **.** The pExpr 
14780 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69  parameter descri
14790 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  bes the expressi
147a0 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  on that contains
147b0 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61   the IN.** opera
147c0 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e  tor or subquery.
147d0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
147e0 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e  ter isRowid is n
147f0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78  on-zero, then ex
14800 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
14810 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
14820 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  to be of the for
14830 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f  m "<rowid> IN (?
14840 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20  , ?, ?)", where 
14850 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66  <rowid> is a ref
14860 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d  erence.** to som
14870 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f  e integer key co
14880 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20  lumn of a table 
14890 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20  B-Tree. In this 
148a0 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20  case, use an.** 
148b0 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f  intkey B-Tree to
148c0 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
148d0 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73  f IN(...) values
148e0 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
148f0 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72  usual.** (slower
14900 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  ) variable lengt
14910 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a  h keys B-Tree..*
14920 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65  *.** If rMayHave
14930 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Null is non-zero
14940 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
14950 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  t the operation 
14960 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74  is an IN.** (not
14970 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49   a SELECT or EXI
14980 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74 68  STS) and that th
14990 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74  e RHS might cont
149a0 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41  ains NULLs..** A
149b0 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
149c0 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69  does is initiali
149d0 7a 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ze the register 
149e0 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76  given by rMayHav
149f0 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c  eNull.** to NULL
14a00 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69  .  Calling routi
14a10 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61  nes will take ca
14a20 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74  re of changing t
14a30 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  his register.** 
14a40 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c  value to non-NUL
14a50 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  L if the RHS is 
14a60 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a  NULL-free..**.**
14a70 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72   For a SELECT or
14a80 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
14a90 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67  , return the reg
14aa0 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73  ister that holds
14ab0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20   the.** result. 
14ac0 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c   For a multi-col
14ad0 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68 65 20  umn SELECT, the 
14ae0 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
14af0 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73   in a contiguous
14b00 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67  .** array of reg
14b10 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 72  isters and the r
14b20 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
14b30 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20 74  he register of t
14b40 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20  he left-most.** 
14b50 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20  result column.  
14b60 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49 4e 20  Return 0 for IN 
14b70 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20  operators or if 
14b80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
14b90 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
14ba0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
14bb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65  .int sqlite3Code
14bc0 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72  Subselect(.  Par
14bd0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
14be0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
14bf0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
14c00 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
14c10 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20       /* The IN, 
14c20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54  SELECT, or EXIST
14c30 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  S operator */.  
14c40 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  int rHasNullFlag
14c50 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ,       /* Regis
14c60 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73  ter that records
14c70 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65   whether NULLs e
14c80 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20  xist in RHS */. 
14c90 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20   int isRowid    
14ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
14cb0 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f  rue, LHS of IN o
14cc0 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77  perator is a row
14cd0 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  id */.){.  int j
14ce0 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31  mpIfDynamic = -1
14cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14d00 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69         /* One-ti
14d10 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20  me test address 
14d20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20  */.  int rReg = 
14d30 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
14d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14d50 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67  Register storing
14d60 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20   resulting */.  
14d70 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
14d80 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
14d90 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
14da0 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
14db0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
14dc0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
14dd0 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61  .  /* The evalua
14de0 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f 45  tion of the IN/E
14df0 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73  XISTS/SELECT mus
14e00 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65 76  t be repeated ev
14e10 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a  ery time it.  **
14e20 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
14e30 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
14e40 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
14e50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
14e60 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
14e70 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
14e80 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
14e90 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
14ea0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
14eb0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
14ec0 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
14ed0 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
14ee0 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
14ef0 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
14f00 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
14f10 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
14f20 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
14f30 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75  run this code ju
14f40 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76  st once.  ** sav
14f50 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61  e the results, a
14f60 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  nd reuse the sam
14f70 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  e result on subs
14f80 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
14f90 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
14fa0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
14fb0 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
14fc0 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49  ect) ){.    jmpI
14fd0 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74  fDynamic = sqlit
14fe0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
14ff0 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f  OP_Once); VdbeCo
15000 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
15010 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15020 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66  MIT_EXPLAIN.  if
15030 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
15040 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72  n==2 ){.    char
15050 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
15060 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
15070 64 62 2c 20 22 45 58 45 43 55 54 45 20 25 73 25  db, "EXECUTE %s%
15080 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a  s SUBQUERY %d",.
15090 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e          jmpIfDyn
150a0 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52  amic>=0?"":"CORR
150b0 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20  ELATED ",.      
150c0 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f    pExpr->op==TK_
150d0 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41  IN?"LIST":"SCALA
150e0 52 22 2c 0a 20 20 20 20 20 20 20 20 70 50 61 72  R",.        pPar
150f0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
15100 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
15110 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
15120 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
15130 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
15140 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f   0, 0, zMsg, P4_
15150 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65  DYNAMIC);.  }.#e
15160 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20  ndif..  switch( 
15170 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
15180 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
15190 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20       int addr;  
151a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151b0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f   /* Address of O
151c0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
151d0 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
151e0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
151f0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
15200 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74   /* the LHS of t
15210 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
15220 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  /.      KeyInfo 
15230 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20  *pKeyInfo = 0;  
15240 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72      /* Key infor
15250 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  mation */.      
15260 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20 20 20  int nVal;       
15270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
15280 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 20 70 4c  ize of vector pL
15290 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20  eft */.      .  
152a0 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74      nVal = sqlit
152b0 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
152c0 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  (pLeft);.      a
152d0 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20  ssert( !isRowid 
152e0 7c 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20  || nVal==1 );.. 
152f0 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
15300 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
15310 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
15320 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
15330 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
15340 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
15350 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
15360 20 77 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65   way.  An epheme
15370 72 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20  ral table is .  
15380 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69      ** filled wi
15390 74 68 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  th index keys re
153a0 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
153b0 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
153c0 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
153d0 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73   or the <exprlis
153e0 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  t>..      **.   
153f0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27     ** If the 'x'
15400 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
15410 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f   column value, o
15420 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a  r the SELECT....
15430 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
15440 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c  nt returns a col
15450 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  umn value, then 
15460 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
15470 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  that.      ** co
15480 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20  lumn is used to 
15490 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20  build the index 
154a0 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78  keys. If both 'x
154b0 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  ' and the.      
154c0 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  ** SELECT... sta
154d0 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
154e0 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
154f0 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65   affinity is use
15500 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69  d.      ** if ei
15510 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20  ther column has 
15520 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47  NUMERIC or INTEG
15530 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20  ER affinity. If 
15540 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  neither.      **
15550 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c   'x' nor the SEL
15560 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
15570 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
15580 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
15590 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ity.      ** is 
155a0 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  used..      */. 
155b0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
155c0 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  le = pParse->nTa
155d0 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20  b++;.      addr 
155e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
155f0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
15600 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20 20  hemeral, .      
15610 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
15620 65 2c 20 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56  e, (isRowid?0:nV
15630 61 6c 29 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  al));.      pKey
15640 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f  Info = isRowid ?
15650 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49   0 : sqlite3KeyI
15660 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
15670 3e 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a  >db, nVal, 1);..
15680 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
15690 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
156a0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
156b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
156c0 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 1:     expr IN
156d0 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20   (SELECT ...).  
156e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
156f0 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
15700 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
15710 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
15720 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65  lect into the te
15730 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
15740 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
15750 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
15760 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
15770 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
15780 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72 2d  pSelect = pExpr-
15790 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
157a0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
157b0 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
157c0 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20  pEList;..       
157d0 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69   assert( !isRowi
157e0 64 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d );.        /* 
157f0 49 66 20 74 68 65 20 4c 48 53 20 61 6e 64 20 52  If the LHS and R
15800 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
15810 72 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74  rator do not mat
15820 63 68 2c 20 74 68 61 74 0a 20 20 20 20 20 20 20  ch, that.       
15830 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c 20 68   ** error will h
15840 61 76 65 20 62 65 65 6e 20 63 61 75 67 68 74 20  ave been caught 
15850 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77 65 20 72  long before we r
15860 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2e  each this point.
15870 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
15880 41 4c 57 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e  ALWAYS(pEList->n
15890 45 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20  Expr==nVal) ){. 
158a0 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44           SelectD
158b0 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  est dest;.      
158c0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
158d0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
158e0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
158f0 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72  , SRT_Set, pExpr
15900 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
15910 20 20 20 20 20 64 65 73 74 2e 7a 41 66 66 53 64       dest.zAffSd
15920 73 74 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e  st = exprINAffin
15930 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78 70  ity(pParse, pExp
15940 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  r);.          pS
15950 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20  elect->iLimit = 
15960 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  0;.          tes
15970 74 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e  tcase( pSelect->
15980 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
15990 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
159a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b      testcase( pK
159b0 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20  eyInfo==0 ); /* 
159c0 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e  Caused by OOM in
159d0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
159e0 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20  lloc() */.      
159f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
15a00 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
15a10 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b  elect, &dest) ){
15a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
15a30 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
15a40 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66  e->db, dest.zAff
15a50 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Sdst);.         
15a60 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
15a70 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29  oUnref(pKeyInfo)
15a80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
15a90 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
15aa0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
15ab0 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
15ac0 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66  se->db, dest.zAf
15ad0 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20  fSdst);.        
15ae0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
15af0 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20  fo!=0 ); /* OOM 
15b00 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20  will cause exit 
15b10 61 66 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c  after sqlite3Sel
15b20 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20  ect() */.       
15b30 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
15b40 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
15b50 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
15b60 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
15b70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
15b80 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
15b90 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
15ba0 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o) );.          
15bb0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b  for(i=0; i<nVal;
15bc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
15bd0 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
15be0 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
15bf0 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29  ubexpr(pLeft, i)
15c00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4b  ;.            pK
15c10 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
15c20 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
15c30 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a  CompareCollSeq(.
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c50 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
15c60 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20  t->a[i].pExpr.  
15c70 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
15c80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15c90 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
15ca0 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
15cb0 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a  >x.pList!=0) ){.
15cc0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
15cd0 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  2:     expr IN (
15ce0 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20  exprlist).      
15cf0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
15d00 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  For each express
15d10 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e  ion, build an in
15d20 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  dex key from the
15d30 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a   evaluation and.
15d40 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
15d50 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
15d60 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
15d70 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
15d80 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
15d90 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75      ** that colu
15da0 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65  mns affinity whe
15db0 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78  n building index
15dc0 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e   keys. If <expr>
15dd0 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
15de0 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65  ** a column, use
15df0 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
15e00 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
15e10 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
15e20 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ity;            
15e30 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74  /* Affinity of t
15e40 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
15e50 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
15e60 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  i;.        ExprL
15e70 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
15e80 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
15e90 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
15ea0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
15eb0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  ;.        int r1
15ec0 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20  , r2, r3;..     
15ed0 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71     affinity = sq
15ee0 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
15ef0 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  y(pLeft);.      
15f00 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20    if( !affinity 
15f10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  ){.          aff
15f20 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
15f30 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20  FF_BLOB;.       
15f40 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
15f50 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
15f60 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
15f70 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
15f80 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29  teable(pKeyInfo)
15f90 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b   );.          pK
15fa0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
15fb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15fc0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
15fd0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
15fe0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
15ff0 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
16000 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
16010 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
16020 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  /.        r1 = s
16030 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
16040 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
16050 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
16060 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
16070 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
16080 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 56  Rowid ) sqlite3V
16090 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
160a0 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20  Null, 0, r2);.  
160b0 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73        for(i=pLis
160c0 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
160d0 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  pList->a; i>0; i
160e0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
160f0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
16100 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  2 = pItem->pExpr
16110 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
16120 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20  iValToIns;..    
16130 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
16140 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
16150 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20  t constant then 
16160 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a  we will need to.
16170 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73            ** dis
16180 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68  able the test th
16190 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  at was generated
161a0 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65   above that make
161b0 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20  s sure.         
161c0 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e   ** this code on
161d0 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65  ly executes once
161e0 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61  .  Because for a
161f0 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20   non-constant.  
16200 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
16210 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f  ssion we need to
16220 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65   rerun this code
16230 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20   each time..    
16240 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16250 20 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61     if( jmpIfDyna
16260 6d 69 63 3e 3d 30 20 26 26 20 21 73 71 6c 69 74  mic>=0 && !sqlit
16270 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
16280 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20  (pE2) ){.       
16290 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
162a0 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
162b0 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20  jmpIfDynamic);. 
162c0 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66             jmpIf
162d0 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20  Dynamic = -1;.  
162e0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
162f0 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
16300 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
16310 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e  and insert it in
16320 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c  to the temp tabl
16330 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
16340 66 28 20 69 73 52 6f 77 69 64 20 26 26 20 73 71  f( isRowid && sq
16350 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
16360 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49  er(pE2, &iValToI
16370 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ns) ){.         
16380 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16390 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
163a0 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  tInt, pExpr->iTa
163b0 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49  ble, r2, iValToI
163c0 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ns);.          }
163d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
163e0 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78    r3 = sqlite3Ex
163f0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
16400 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20  rse, pE2, r1);. 
16410 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
16420 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  sRowid ){.      
16430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16440 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16450 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20  MustBeInt, r3,. 
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
16480 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
16490 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20  tAddr(v)+2);.   
164a0 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
164b0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
164c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
164d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
164e0 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  P_Insert, pExpr-
164f0 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29  >iTable, r2, r3)
16500 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
16510 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
16520 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16530 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
16540 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32  ecord, r3, 1, r2
16550 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  , &affinity, 1);
16560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
16570 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
16580 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
16590 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20  arse, r3, 1);.  
165a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
165b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
165c0 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
165d0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
165e0 20 72 32 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20   r2, r3, 1);.   
165f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
16610 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16620 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
16630 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
16640 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
16650 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
16660 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
16670 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
16680 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  o ){.        sql
16690 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
166a0 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20  (v, addr, (void 
166b0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
166c0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d  EYINFO);.      }
166d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
166e0 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
166f0 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
16700 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
16710 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
16720 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 20 20    /* Case 3:    
16730 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
16740 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 20 20   ...).      **  
16750 20 20 20 6f 72 3a 20 20 20 20 45 58 49 53 54 53     or:    EXISTS
16760 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
16770 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 0a 20   ...).      **. 
16780 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 53 45       ** For a SE
16790 4c 45 43 54 2c 20 67 65 6e 65 72 61 74 65 20 63  LECT, generate c
167a0 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 20 76  ode to put the v
167b0 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f  alues for all co
167c0 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 20 20 2a  lumns of.      *
167d0 2a 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  * the first row 
167e0 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
167f0 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 72   registers and r
16800 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
16810 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
16820 66 69 72 73 74 20 72 65 67 69 73 74 65 72 2e 0a  first register..
16830 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
16840 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
16850 45 58 49 53 54 53 2c 20 77 72 69 74 65 20 61 6e  EXISTS, write an
16860 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20   integer 0 (not 
16870 65 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78  exists) or 1 (ex
16880 69 73 74 73 29 0a 20 20 20 20 20 20 2a 2a 20 69  ists).      ** i
16890 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61  nto a register a
168a0 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 20 72  nd return that r
168b0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a  egister number..
168c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
168d0 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 2c  * In both cases,
168e0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 75   the query is au
168f0 67 6d 65 6e 74 65 64 20 77 69 74 68 20 22 4c 49  gmented with "LI
16900 4d 49 54 20 31 22 2e 20 20 41 6e 79 20 0a 20 20  MIT 1".  Any .  
16910 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69      ** preexisti
16920 6e 67 20 6c 69 6d 69 74 20 69 73 20 64 69 73 63  ng limit is disc
16930 61 72 64 65 64 20 69 6e 20 70 6c 61 63 65 20 6f  arded in place o
16940 66 20 74 68 65 20 6e 65 77 20 4c 49 4d 49 54 20  f the new LIMIT 
16950 31 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  1..      */.    
16960 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
16970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16980 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
16990 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  T statement to e
169a0 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53  ncode */.      S
169b0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
169c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169d0 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
169e0 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 54 20  eal with SELECT 
169f0 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
16a00 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20  int nReg;       
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
16a30 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
16a40 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  /..      testcas
16a50 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
16a60 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
16a70 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
16a80 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
16a90 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16aa0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
16ab0 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e  XISTS || pExpr->
16ac0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
16ad0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
16ae0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16af0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
16b00 63 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 53  ct) );..      pS
16b10 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  el = pExpr->x.pS
16b20 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 6e 52 65  elect;.      nRe
16b30 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  g = pExpr->op==T
16b40 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d  K_SELECT ? pSel-
16b50 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  >pEList->nExpr :
16b60 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
16b70 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
16b80 26 64 65 73 74 2c 20 30 2c 20 70 50 61 72 73 65  &dest, 0, pParse
16b90 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20  ->nMem+1);.     
16ba0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
16bb0 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 69 66 28   nReg;.      if(
16bc0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
16bd0 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  ELECT ){.       
16be0 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
16bf0 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64  T_Mem;.        d
16c00 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74  est.iSdst = dest
16c10 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
16c20 20 20 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e    dest.nSdst = n
16c30 52 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Reg;.        sql
16c40 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16c50 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65  , OP_Null, 0, de
16c60 73 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74  st.iSDParm, dest
16c70 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29  .iSDParm+nReg-1)
16c80 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
16c90 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
16ca0 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22  subquery result"
16cb0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
16cc0 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
16cd0 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73  est = SRT_Exists
16ce0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16cf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16d00 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65  P_Integer, 0, de
16d10 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  st.iSDParm);.   
16d20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
16d30 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54  ((v, "Init EXIST
16d40 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  S result"));.   
16d50 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
16d60 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
16d70 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70  rse->db, pSel->p
16d80 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53  Limit);.      pS
16d90 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  el->pLimit = sql
16da0 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
16db0 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54  arse->db, TK_INT
16dc0 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  EGER,.          
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16de0 20 20 20 20 20 20 20 20 26 73 71 6c 69 74 65 33          &sqlite3
16df0 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29  IntTokens[1], 0)
16e00 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c  ;.      pSel->iL
16e10 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
16e20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
16e30 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65  = ~SF_MultiValue
16e40 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
16e50 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
16e60 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29  , pSel, &dest) )
16e70 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
16e80 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
16e90 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53    rReg = dest.iS
16ea0 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70  DParm;.      Exp
16eb0 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
16ec0 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
16ed0 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ce);.      break
16ee0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
16ef0 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20  f( rHasNullFlag 
16f00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
16f10 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20  tHasNullFlag(v, 
16f20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
16f30 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20  HasNullFlag);.  
16f40 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79  }..  if( jmpIfDy
16f50 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20  namic>=0 ){.    
16f60 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
16f70 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61  ere(v, jmpIfDyna
16f80 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mic);.  }.  sqli
16f90 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
16fa0 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75  pParse);..  retu
16fb0 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69  rn rReg;.}.#endi
16fc0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
16fd0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
16fe0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16ff0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
17000 20 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20   Expr pIn is an 
17010 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  IN(...) expressi
17020 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
17030 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  n checks that th
17040 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74  e .** sub-select
17050 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
17060 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72  he IN() operator
17070 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75   has the same nu
17080 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75  mber of .** colu
17090 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63 74 6f  mns as the vecto
170a0 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72  r on the LHS. Or
170b0 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  , if the RHS of 
170c0 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20  the IN() is not 
170d0 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c  .** a sub-query,
170e0 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 69 73   that the LHS is
170f0 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a   a vector of siz
17100 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 1..*/.int sqli
17110 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50  te3ExprCheckIN(P
17120 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
17130 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20  pr *pIn){.  int 
17140 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
17150 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
17160 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  pIn->pLeft);.  i
17170 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26  f( (pIn->flags &
17180 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
17190 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f  {.    if( nVecto
171a0 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63  r!=pIn->x.pSelec
171b0 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
171c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
171d0 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
171e0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70  pParse, pIn->x.p
171f0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
17200 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b  nExpr, nVector);
17210 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
17220 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
17230 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b  f( nVector!=1 ){
17240 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65 63 74  .    sqlite3Vect
17250 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  orErrorMsg(pPars
17260 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a  e, pIn->pLeft);.
17270 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
17280 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
17290 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
172a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
172b0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
172c0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
172d0 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  IN expression..*
172e0 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
172f0 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20  SELECT ...).**  
17300 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c      x IN (value,
17310 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a   value, ...).**.
17320 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  ** The left-hand
17330 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61   side (LHS) is a
17340 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f   scalar or vecto
17350 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  r expression.  T
17360 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e  he .** right-han
17370 64 20 73 69 64 65 20 28 52 48 53 29 20 69 73 20  d side (RHS) is 
17380 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
17390 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20   or more scalar 
173a0 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20  values, or a.** 
173b0 73 75 62 71 75 65 72 79 2e 20 20 49 66 20 74 68  subquery.  If th
173c0 65 20 52 48 53 20 69 73 20 61 20 73 75 62 71 75  e RHS is a subqu
173d0 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  ery, the number 
173e0 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
173f0 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20  s must.** match 
17400 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
17410 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63  lumns in the vec
17420 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
17430 20 49 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a   If the RHS is.*
17440 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  * a list of valu
17450 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74  es, the LHS must
17460 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a   be a scalar. .*
17470 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72  *.** The IN oper
17480 61 74 6f 72 20 69 73 20 74 72 75 65 20 69 66 20  ator is true if 
17490 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73  the LHS value is
174a0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
174b0 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68  n the RHS..** Th
174c0 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73  e result is fals
174d0 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
174e0 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69  definitely not i
174f0 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20  n the RHS.  The 
17500 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55  .** result is NU
17510 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73 65 6e  LL if the presen
17520 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e  ce of the LHS in
17530 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20   the RHS cannot 
17540 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  be .** determine
17550 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a  d due to NULLs..
17560 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
17570 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
17580 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20  e that jumps to 
17590 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74  destIfFalse if t
175a0 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a  he LHS is not .*
175b0 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
175c0 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
175d0 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20  due to NULLs we 
175e0 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
175f0 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69   if the LHS.** i
17600 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
17610 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70  he RHS then jump
17620 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20   to destIfNull. 
17630 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   If the LHS is c
17640 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68  ontained.** with
17650 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
17660 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a  fall through..**
17670 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70 61  .** See the sepa
17680 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72  rate in-operator
17690 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .md documentatio
176a0 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61  n file in the ca
176b0 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74  nonical.** SQLit
176c0 65 20 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f  e source tree fo
176d0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
176e0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
176f0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
17700 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61  ExprCodeIN(.  Pa
17710 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
17720 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
17730 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
17740 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
17750 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
17760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
17770 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
17780 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c  int destIfFalse,
17790 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
177a0 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74  re if LHS is not
177b0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
177c0 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64  e RHS */.  int d
177d0 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20  estIfNull       
177e0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
177f0 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
17800 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20   unknown due to 
17810 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  NULLs */.){.  in
17820 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  t rRhsHasNull = 
17830 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  0;  /* Register 
17840 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20  that is true if 
17850 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
17860 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  L values */.  in
17870 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
17880 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
17890 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
178a0 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  rLhs;           
178b0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29    /* Register(s)
178c0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53   holding the LHS
178d0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
178e0 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20   rLhsOrig;      
178f0 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73     /* LHS values
17900 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65   prior to reorde
17910 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20  ring by aiMap[] 
17920 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
17930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
17940 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
17950 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
17960 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20  int *aiMap = 0; 
17970 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f        /* Map fro
17980 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74  m vector field t
17990 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a  o index column *
179a0 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d  /.  char *zAff =
179b0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66   0;       /* Aff
179c0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72  inity string for
179d0 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a   comparisons */.
179e0 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20    int nVector;  
179f0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
17a00 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74  of vectors for t
17a10 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  his IN operator 
17a20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b  */.  int iDummy;
17a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75             /* Du
17a40 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f  mmy parameter to
17a50 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
17a60 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  ) */.  Expr *pLe
17a70 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ft;          /* 
17a80 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
17a90 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
17aa0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
17ab0 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f        /* loop co
17ac0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64  unter */.  int d
17ad0 65 73 74 53 74 65 70 32 3b 20 20 20 20 20 20 20  estStep2;       
17ae0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d   /* Where to jum
17af0 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65  p when NULLs see
17b00 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20  n in step 2 */. 
17b10 20 69 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d   int destStep6 =
17b20 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20   0;    /* Start 
17b30 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70  of code for Step
17b40 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72   6 */.  int addr
17b50 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a  TruthOp;      /*
17b60 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f   Address of opco
17b70 64 65 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  de that determin
17b80 65 73 20 74 68 65 20 49 4e 20 69 73 20 74 72 75  es the IN is tru
17b90 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e  e */.  int destN
17ba0 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20  otNull;      /* 
17bb0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 20 63  Jump here if a c
17bc0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74  omparison is not
17bd0 20 74 72 75 65 20 69 6e 20 73 74 65 70 20 36 20   true in step 6 
17be0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
17bf0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
17c00 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20  p of the step-6 
17c10 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c 65 66  loop */ ..  pLef
17c20 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
17c30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
17c40 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72 73  xprCheckIN(pPars
17c50 65 2c 20 70 45 78 70 72 29 20 29 20 72 65 74 75  e, pExpr) ) retu
17c60 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78 70  rn;.  zAff = exp
17c70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72  rINAffinity(pPar
17c80 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e 56  se, pExpr);.  nV
17c90 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45  ector = sqlite3E
17ca0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45  xprVectorSize(pE
17cb0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61  xpr->pLeft);.  a
17cc0 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c  iMap = (int*)sql
17cd0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
17ce0 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  (.      pParse->
17cf0 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a  db, nVector*(siz
17d00 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f  eof(int) + sizeo
17d10 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29  f(char)) + 1.  )
17d20 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
17d30 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17d40 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45   ) goto sqlite3E
17d50 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72  xprCodeIN_oom_er
17d60 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d  ror;..  /* Attem
17d70 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  pt to compute th
17d80 65 20 52 48 53 2e 20 41 66 74 65 72 20 74 68 69  e RHS. After thi
17d90 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68  s step, if anyth
17da0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20  ing other than. 
17db0 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f   ** IN_INDEX_NOO
17dc0 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  P is returned, t
17dd0 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20  he table opened 
17de0 69 74 68 20 63 75 72 73 6f 72 20 70 45 78 70 72  ith cursor pExpr
17df0 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63  ->iTable .  ** c
17e00 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
17e10 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
17e20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49  the RHS. If IN_I
17e30 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74  NDEX_NOOP is ret
17e40 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20  urned,.  ** the 
17e50 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20  RHS has not yet 
17e60 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a  been coded.  */.
17e70 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
17e80 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
17e90 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  !=0 );       /* 
17ea0 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69  OOM detected pri
17eb0 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
17ec0 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  ne */.  VdbeNoop
17ed0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
17ee0 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20  in IN expr"));. 
17ef0 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
17f00 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
17f10 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20  se, pExpr,.     
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f30 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58          IN_INDEX
17f40 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e  _MEMBERSHIP | IN
17f50 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a  _INDEX_NOOP_OK,.
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73               des
17f80 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
17f90 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73  Null ? 0 : &rRhs
17fa0 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b  HasNull, aiMap);
17fb0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
17fc0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63  se->nErr || nVec
17fd0 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d  tor==1 || eType=
17fe0 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20  =IN_INDEX_EPH.  
17ff0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49       || eType==I
18000 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
18010 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  C || eType==IN_I
18020 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
18030 0a 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  .  );.#ifdef SQL
18040 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43  ITE_DEBUG.  /* C
18050 6f 6e 66 69 72 6d 20 74 68 61 74 20 61 69 4d 61  onfirm that aiMa
18060 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65  p[] contains nVe
18070 63 74 6f 72 20 69 6e 74 65 67 65 72 20 76 61 6c  ctor integer val
18080 75 65 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ues between 0 an
18090 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31  d.  ** nVector-1
180a0 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
180b0 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
180c0 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b  .    int j, cnt;
180d0 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30  .    for(cnt=j=0
180e0 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b  ; j<nVector; j++
180f0 29 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d  ) if( aiMap[j]==
18100 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61  i ) cnt++;.    a
18110 73 73 65 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b  ssert( cnt==1 );
18120 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
18130 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20  * Code the LHS, 
18140 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20  the <expr> from 
18150 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29  "<expr> IN (...)
18160 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  ". If the LHS is
18170 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c   a .  ** vector,
18180 20 74 68 65 6e 20 69 74 20 69 73 20 73 74 6f 72   then it is stor
18190 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  ed in an array o
181a0 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69 73 74  f nVector regist
181b0 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a 20 20  ers starting .  
181c0 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20  ** at r1..  **. 
181d0 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 49   ** sqlite3FindI
181e0 6e 49 6e 64 65 78 28 29 20 6d 69 67 68 74 20 68  nIndex() might h
181f0 61 76 65 20 72 65 6f 72 64 65 72 65 64 20 74 68  ave reordered th
18200 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
18210 4c 48 53 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20  LHS vector.  ** 
18220 73 6f 20 74 68 61 74 20 74 68 65 20 66 69 65 6c  so that the fiel
18230 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 61  ds are in the sa
18240 6d 65 20 6f 72 64 65 72 20 61 73 20 61 6e 20 65  me order as an e
18250 78 69 73 74 69 6e 67 20 69 6e 64 65 78 2e 20 20  xisting index.  
18260 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b   The.  ** aiMap[
18270 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
18280 20 61 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20   a mapping from 
18290 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53  the original LHS
182a0 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a   field order to.
182b0 20 20 2a 2a 20 74 68 65 20 66 69 65 6c 64 20 6f    ** the field o
182c0 72 64 65 72 20 74 68 61 74 20 6d 61 74 63 68 65  rder that matche
182d0 73 20 74 68 65 20 52 48 53 20 69 6e 64 65 78 2e  s the RHS index.
182e0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
182f0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
18300 72 73 65 29 3b 0a 20 20 72 4c 68 73 4f 72 69 67  rse);.  rLhsOrig
18310 20 3d 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f   = exprCodeVecto
18320 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  r(pParse, pLeft,
18330 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72   &iDummy);.  for
18340 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20  (i=0; i<nVector 
18350 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20  && aiMap[i]==i; 
18360 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48  i++){} /* Are LH
18370 53 20 66 69 65 6c 64 73 20 72 65 6f 72 64 65 72  S fields reorder
18380 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d  ed? */.  if( i==
18390 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f  nVector ){.    /
183a0 2a 20 4c 48 53 20 66 69 65 6c 64 73 20 61 72 65  * LHS fields are
183b0 20 6e 6f 74 20 72 65 6f 72 64 65 72 65 64 20 2a   not reordered *
183c0 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 72 4c 68  /.    rLhs = rLh
183d0 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a  sOrig;.  }else{.
183e0 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
183f0 65 6f 72 64 65 72 20 74 68 65 20 4c 48 53 20 66  eorder the LHS f
18400 69 65 6c 64 73 20 61 63 63 6f 72 64 69 6e 67 20  ields according 
18410 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20  to aiMap */.    
18420 72 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 47 65  rLhs = sqlite3Ge
18430 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
18440 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20  e, nVector);.   
18450 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
18460 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tor; i++){.     
18470 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18480 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
18490 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b  LhsOrig+i, rLhs+
184a0 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20  aiMap[i], 0);.  
184b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
184c0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
184d0 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69  dex() did not fi
184e0 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20  nd or create an 
184f0 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20 20  index that is.  
18500 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
18510 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49  evaluating the I
18520 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e  N operator, then
18530 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20   evaluate using 
18540 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20  a.  ** sequence 
18550 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
18560 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69    **.  ** This i
18570 73 20 73 74 65 70 20 28 31 29 20 69 6e 20 74 68  s step (1) in th
18580 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64  e in-operator.md
18590 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72   optimized algor
185a0 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ithm..  */.  if(
185b0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
185c0 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70  _NOOP ){.    Exp
185d0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
185e0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
185f0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
18600 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
18610 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
18620 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
18630 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20    int labelOk = 
18640 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18650 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74  abel(v);.    int
18660 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a   r2, regToFree;.
18670 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c      int regCkNul
18680 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  l = 0;.    int i
18690 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  i;.    assert( !
186a0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
186b0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
186c0 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
186d0 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
186e0 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
186f0 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c   regCkNull = sql
18700 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
18710 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
18720 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
18730 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c  v, OP_BitAnd, rL
18740 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e  hs, rLhs, regCkN
18750 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ull);.    }.    
18760 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69  for(ii=0; ii<pLi
18770 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  st->nExpr; ii++)
18780 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  {.      r2 = sql
18790 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
187a0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
187b0 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65  a[ii].pExpr, &re
187c0 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  gToFree);.      
187d0 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26  if( regCkNull &&
187e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
187f0 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69  eNull(pList->a[i
18800 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
18810 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18820 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74  AddOp3(v, OP_Bit
18830 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  And, regCkNull, 
18840 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  r2, regCkNull);.
18850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
18860 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  ( ii<pList->nExp
18870 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c  r-1 || destIfNul
18880 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l!=destIfFalse )
18890 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
188a0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
188b0 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65  P_Eq, rLhs, labe
188c0 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lOk, r2,.       
188d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188e0 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
188f0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
18900 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
18910 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74  geIf(v, ii<pList
18920 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
18930 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
18940 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d  If(v, ii==pList-
18950 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20  >nExpr-1);.     
18960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
18970 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30  angeP5(v, zAff[0
18980 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
18990 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
189a0 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
189b0 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20  tIfFalse );.    
189c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
189d0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp4(v, OP_Ne, 
189e0 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61 6c 73  rLhs, destIfFals
189f0 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20  e, r2,.         
18a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a10 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
18a20 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65  4_COLLSEQ); Vdbe
18a30 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
18a40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18a50 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
18a60 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d  [0] | SQLITE_JUM
18a70 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
18a80 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
18a90 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
18aa0 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29  arse, regToFree)
18ab0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18ac0 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20  regCkNull ){.   
18ad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18ae0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
18af0 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65  l, regCkNull, de
18b00 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43  stIfNull); VdbeC
18b10 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
18b20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
18b30 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  o(v, destIfFalse
18b40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
18b50 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
18b60 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29  abel(v, labelOk)
18b70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
18b80 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18b90 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  se, regCkNull);.
18ba0 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33      goto sqlite3
18bb0 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73  ExprCodeIN_finis
18bc0 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  hed;.  }..  /* S
18bd0 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74 6f 20  tep 2: Check to 
18be0 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 63  see if the LHS c
18bf0 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c  ontains any NULL
18c00 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68   columns.  If th
18c10 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20  e.  ** LHS does 
18c20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68  contain NULLs th
18c30 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  en the result mu
18c40 73 74 20 62 65 20 65 69 74 68 65 72 20 46 41 4c  st be either FAL
18c50 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a  SE or NULL..  **
18c60 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b   We will then sk
18c70 69 70 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  ip the binary se
18c80 61 72 63 68 20 6f 66 20 74 68 65 20 52 48 53 2e  arch of the RHS.
18c90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
18ca0 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
18cb0 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73 74 53  lse ){.    destS
18cc0 74 65 70 32 20 3d 20 64 65 73 74 49 66 46 61 6c  tep2 = destIfFal
18cd0 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  se;.  }else{.   
18ce0 20 64 65 73 74 53 74 65 70 32 20 3d 20 64 65 73   destStep2 = des
18cf0 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74 65 33  tStep6 = sqlite3
18d00 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18d10 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
18d20 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29   i<nVector; i++)
18d30 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
18d40 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
18d50 6c 64 53 75 62 65 78 70 72 28 70 45 78 70 72 2d  ldSubexpr(pExpr-
18d60 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
18d70 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
18d80 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20  anBeNull(p) ){. 
18d90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18da0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
18db0 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73  ull, rLhs+i, des
18dc0 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20 20 56  tStep2);.      V
18dd0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
18de0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18df0 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c 48 53  Step 3.  The LHS
18e00 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f   is now known to
18e10 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44   be non-NULL.  D
18e20 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  o the binary sea
18e30 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  rch.  ** of the 
18e40 52 48 53 20 75 73 69 6e 67 20 74 68 65 20 4c 48  RHS using the LH
18e50 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20 20 49  S as a probe.  I
18e60 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72 65 73  f found, the res
18e70 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72 75 65  ult is.  ** true
18e80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
18e90 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
18ea0 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  ID ){.    /* In 
18eb0 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52  this case, the R
18ec0 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  HS is the ROWID 
18ed0 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  of table b-tree 
18ee0 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20  and so we also. 
18ef0 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20     ** know that 
18f00 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e  the RHS is non-N
18f10 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65 20  ULL.  Hence, we 
18f20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 33 20  combine steps 3 
18f30 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74  and 4.    ** int
18f40 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  o a single opcod
18f50 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
18f60 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
18f70 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70 45 78  P_SeekRowid, pEx
18f80 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
18f90 49 66 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a  IfFalse, rLhs);.
18fa0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
18fb0 28 76 29 3b 0a 20 20 20 20 61 64 64 72 54 72 75  (v);.    addrTru
18fc0 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  thOp = sqlite3Vd
18fd0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
18fe0 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e  oto);  /* Return
18ff0 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65   True */.  }else
19000 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
19010 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66  eAddOp4(v, OP_Af
19020 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56  finity, rLhs, nV
19030 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20  ector, 0, zAff, 
19040 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 69 66  nVector);.    if
19050 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64  ( destIfFalse==d
19060 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20  estIfNull ){.   
19070 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74     /* Combine St
19080 65 70 20 33 20 61 6e 64 20 53 74 65 70 20 35 20  ep 3 and Step 5 
19090 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70  into a single op
190a0 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  code */.      sq
190b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
190c0 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
190d0 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
190e0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 0a 20  , destIfFalse,. 
190f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19100 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20            rLhs, 
19110 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f  nVector); VdbeCo
19120 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
19130 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70   goto sqlite3Exp
19140 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64  rCodeIN_finished
19150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f  ;.    }.    /* O
19160 72 64 69 6e 61 72 79 20 53 74 65 70 20 33 2c 20  rdinary Step 3, 
19170 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
19180 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c  re FALSE and NUL
19190 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a  L are distinct *
191a0 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f  /.    addrTruthO
191b0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
191c0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
191d0 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
191e0 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ble, 0,.        
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c                rL
19210 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64  hs, nVector); Vd
19220 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19230 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 34 2e   }..  /* Step 4.
19240 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20    If the RHS is 
19250 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d  known to be non-
19260 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64 69 64 20  NULL and we did 
19270 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20 61 6e  not find.  ** an
19280 20 6d 61 74 63 68 20 6f 6e 20 74 68 65 20 73 65   match on the se
19290 61 72 63 68 20 61 62 6f 76 65 2c 20 74 68 65 6e  arch above, then
192a0 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74   the result must
192b0 20 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a   be FALSE..  */.
192c0 20 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c    if( rRhsHasNul
192d0 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d 31 20  l && nVector==1 
192e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
192f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
19300 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e  otNull, rRhsHasN
19310 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ull, destIfFalse
19320 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
19330 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f  age(v);.  }..  /
19340 2a 20 53 74 65 70 20 35 2e 20 20 49 66 20 77 65  * Step 5.  If we
19350 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
19360 75 74 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ut the differenc
19370 65 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c 20 61  e between NULL a
19380 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c 20 74  nd.  ** FALSE, t
19390 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
193a0 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69  false. .  */.  i
193b0 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d  f( destIfFalse==
193c0 64 65 73 74 49 66 4e 75 6c 6c 20 29 20 73 71 6c  destIfNull ) sql
193d0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
193e0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20  destIfFalse);.. 
193f0 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f 6f 70   /* Step 6: Loop
19400 20 74 68 72 6f 75 67 68 20 72 6f 77 73 20 6f 66   through rows of
19410 20 74 68 65 20 52 48 53 2e 20 20 43 6f 6d 70 61   the RHS.  Compa
19420 72 65 20 65 61 63 68 20 72 6f 77 20 74 6f 20 74  re each row to t
19430 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49 66 20  he LHS..  ** If 
19440 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  any comparison i
19450 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
19460 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
19470 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f    If all.  ** co
19480 6d 70 61 72 69 73 6f 6e 73 20 61 72 65 20 46 41  mparisons are FA
19490 4c 53 45 20 74 68 65 6e 20 74 68 65 20 66 69 6e  LSE then the fin
194a0 61 6c 20 72 65 73 75 6c 74 20 69 73 20 46 41 4c  al result is FAL
194b0 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  SE..  **.  ** Fo
194c0 72 20 61 20 73 63 61 6c 61 72 20 4c 48 53 2c 20  r a scalar LHS, 
194d0 69 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  it is sufficient
194e0 20 74 6f 20 63 68 65 63 6b 20 6a 75 73 74 20 74   to check just t
194f0 68 65 20 66 69 72 73 74 20 72 6f 77 0a 20 20 2a  he first row.  *
19500 2a 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20  * of the RHS..  
19510 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 53 74 65  */.  if( destSte
19520 70 36 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  p6 ) sqlite3Vdbe
19530 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
19540 64 65 73 74 53 74 65 70 36 29 3b 0a 20 20 61 64  destStep6);.  ad
19550 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
19560 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19570 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69  Rewind, pExpr->i
19580 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
19590 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  se);.  VdbeCover
195a0 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 6e 56  age(v);.  if( nV
195b0 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64  ector>1 ){.    d
195c0 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c  estNotNull = sql
195d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
195e0 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  l(v);.  }else{. 
195f0 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74 6f     /* For nVecto
19600 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73 74  r==1, combine st
19610 65 70 73 20 36 20 61 6e 64 20 37 20 62 79 20 69  eps 6 and 7 by i
19620 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
19630 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c 53  ning.    ** FALS
19640 45 20 69 66 20 74 68 65 20 66 69 72 73 74 20 63  E if the first c
19650 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74  omparison is not
19660 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65 73   NULL */.    des
19670 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74 49  tNotNull = destI
19680 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66 6f  fFalse;.  }.  fo
19690 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
196a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
196b0 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71   *p;.    CollSeq
196c0 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74   *pColl;.    int
196d0 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r3 = sqlite3Get
196e0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
196f0 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
19700 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
19710 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  pr(pLeft, i);.  
19720 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
19730 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
19740 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c  rse, p);.    sql
19750 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19760 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78  , OP_Column, pEx
19770 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c 20 72  pr->iTable, i, r
19780 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
19790 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
197a0 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74  Ne, rLhs+i, dest
197b0 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20  NotNull, r3,.   
197c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197d0 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
197e0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
197f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
19800 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
19810 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19820 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20  rse, r3);.  }.  
19830 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19840 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
19850 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
19860 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b  if( nVector>1 ){
19870 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19880 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
19890 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20  destNotNull);.  
198a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
198b0 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
198c0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61  pExpr->iTable, a
198d0 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56  ddrTop+1);.    V
198e0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
198f0 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37 3a 20  .    /* Step 7: 
19900 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
19910 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77  s point, we know
19920 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
19930 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
19940 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71  false. */.    sq
19950 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19960 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
19970 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d  estIfFalse);.  }
19980 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72  ..  /* Jumps her
19990 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65  e in order to re
199a0 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20  turn true. */.  
199b0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
199c0 65 72 65 28 76 2c 20 61 64 64 72 54 72 75 74 68  ere(v, addrTruth
199d0 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70  Op);..sqlite3Exp
199e0 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64  rCodeIN_finished
199f0 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d 72 4c  :.  if( rLhs!=rL
19a00 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74 65 33  hsOrig ) sqlite3
19a10 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
19a20 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20  Parse, rLhs);.  
19a30 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
19a40 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 56  Pop(pParse);.  V
19a50 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
19a60 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  end IN expr"));.
19a70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
19a80 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73  N_oom_error:.  s
19a90 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
19aa0 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b  rse->db, aiMap);
19ab0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
19ac0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66  (pParse->db, zAf
19ad0 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  f);.}.#endif /* 
19ae0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
19af0 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
19b00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
19b10 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a  ATING_POINT./*.*
19b20 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
19b30 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
19b40 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61  ill put the floa
19b50 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
19b60 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79  lue described by
19b70 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
19b80 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
19b90 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72  *.** The z[] str
19ba0 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ing will probabl
19bb0 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65  y not be zero-te
19bc0 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
19bd0 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72  he .** z[n] char
19be0 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74  acter is guarant
19bf0 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  eed to be someth
19c00 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ing that does no
19c10 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74  t look.** like t
19c20 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
19c30 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a  of the number..*
19c40 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
19c50 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20  deReal(Vdbe *v, 
19c60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
19c70 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69  nt negateFlag, i
19c80 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20  nt iMem){.  if( 
19c90 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a  ALWAYS(z!=0) ){.
19ca0 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65      double value
19cb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  ;.    sqlite3Ato
19cc0 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c  F(z, &value, sql
19cd0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
19ce0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
19cf0 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69     assert( !sqli
19d00 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20  te3IsNaN(value) 
19d10 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74  ); /* The new At
19d20 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73  oF never returns
19d30 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20   NaN */.    if( 
19d40 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c  negateFlag ) val
19d50 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20  ue = -value;.   
19d60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19d70 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61  p4Dup8(v, OP_Rea
19d80 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28  l, 0, iMem, 0, (
19d90 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52  u8*)&value, P4_R
19da0 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  EAL);.  }.}.#end
19db0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  if.../*.** Gener
19dc0 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
19dd0 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
19de0 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
19df0 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
19e00 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
19e10 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
19e20 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  *.** Expr.u.zTok
19e30 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46  en is always UTF
19e40 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69  8 and zero-termi
19e50 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  nated..*/.static
19e60 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65   void codeIntege
19e70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
19e80 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
19e90 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69  t negFlag, int i
19ea0 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Mem){.  Vdbe *v 
19eb0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
19ec0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
19ed0 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
19ee0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  e ){.    int i =
19ef0 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
19f00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ;.    assert( i>
19f10 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  =0 );.    if( ne
19f20 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a  gFlag ) i = -i;.
19f30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19f40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
19f50 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20  ger, i, iMem);. 
19f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
19f70 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65  c;.    i64 value
19f80 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
19f90 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a   *z = pExpr->u.z
19fa0 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  Token;.    asser
19fb0 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63  t( z!=0 );.    c
19fc0 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48   = sqlite3DecOrH
19fd0 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75  exToI64(z, &valu
19fe0 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 31  e);.    if( c==1
19ff0 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20 21 6e 65   || (c==2 && !ne
1a000 67 46 6c 61 67 29 20 7c 7c 20 28 6e 65 67 46 6c  gFlag) || (negFl
1a010 61 67 20 26 26 20 76 61 6c 75 65 3d 3d 53 4d 41  ag && value==SMA
1a020 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b 0a 23  LLEST_INT64)){.#
1a030 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
1a040 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
1a050 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1a060 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a070 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65  oversized intege
1a080 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61  r: %s%s", negFla
1a090 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29  g ? "-" : "", z)
1a0a0 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20  ;.#else.#ifndef 
1a0b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f  SQLITE_OMIT_HEX_
1a0c0 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69 66  INTEGER.      if
1a0d0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
1a0e0 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20  mp(z,"0x",2)==0 
1a0f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a100 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1a110 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20  e, "hex literal 
1a120 74 6f 6f 20 62 69 67 3a 20 25 73 25 73 22 2c 20  too big: %s%s", 
1a130 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a  negFlag?"-":"",z
1a140 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
1a150 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
1a160 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1a170 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d  , z, negFlag, iM
1a180 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  em);.      }.#en
1a190 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
1a1a0 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
1a1b0 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32   ){ value = c==2
1a1c0 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36   ? SMALLEST_INT6
1a1d0 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20  4 : -value; }.  
1a1e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a1f0 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
1a200 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20  Int64, 0, iMem, 
1a210 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20  0, (u8*)&value, 
1a220 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d  P4_INT64);.    }
1a230 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  .  }.}../*.** Er
1a240 61 73 65 20 63 6f 6c 75 6d 6e 2d 63 61 63 68 65  ase column-cache
1a250 20 65 6e 74 72 79 20 6e 75 6d 62 65 72 20 69 0a   entry number i.
1a260 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
1a270 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50  acheEntryClear(P
1a280 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1a290 74 20 69 29 7b 0a 20 20 69 66 28 20 70 50 61 72  t i){.  if( pPar
1a2a0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
1a2b0 2e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20  .tempReg ){.    
1a2c0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
1a2d0 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
1a2e0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
1a2f0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
1a300 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
1a310 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
1a320 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
1a330 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20  he[i].iReg;.    
1a340 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  }.  }.  pParse->
1a350 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 69  nColCache--;.  i
1a360 66 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  f( i<pParse->nCo
1a370 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20 70 50  lCache ){.    pP
1a380 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1a390 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  i] = pParse->aCo
1a3a0 6c 43 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e  lCache[pParse->n
1a3b0 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20 7d 0a 7d  ColCache];.  }.}
1a3c0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  .../*.** Record 
1a3d0 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  in the column ca
1a3e0 63 68 65 20 74 68 61 74 20 61 20 70 61 72 74 69  che that a parti
1a3f0 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f  cular column fro
1a400 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  m a.** particula
1a410 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65  r table is store
1a420 64 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d in a particula
1a430 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76  r register..*/.v
1a440 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1a450 61 63 68 65 53 74 6f 72 65 28 50 61 72 73 65 20  acheStore(Parse 
1a460 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
1a470 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74  b, int iCol, int
1a480 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   iReg){.  int i;
1a490 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20  .  int minLru;. 
1a4a0 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73   int idxLru;.  s
1a4b0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1a4c0 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73  *p;..  /* Unless
1a4d0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   an error has oc
1a4e0 63 75 72 72 65 64 2c 20 72 65 67 69 73 74 65 72  curred, register
1a4f0 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77   numbers are alw
1a500 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f  ays positive. */
1a510 0a 20 20 61 73 73 65 72 74 28 20 69 52 65 67 3e  .  assert( iReg>
1a520 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
1a530 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
1a540 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1a550 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
1a560 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36  =-1 && iCol<3276
1a570 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20  8 );  /* Finite 
1a580 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a  column numbers *
1a590 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49  /..  /* The SQLI
1a5a0 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66  TE_ColumnCache f
1a5b0 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74 68 65  lag disables the
1a5c0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20   column cache.  
1a5d0 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a  This is used.  *
1a5e0 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e  * for testing on
1a5f0 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74  ly - to verify t
1a600 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79  hat SQLite alway
1a610 73 20 67 65 74 73 20 74 68 65 20 73 61 6d 65 20  s gets the same 
1a620 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68  answer.  ** with
1a630 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65   and without the
1a640 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
1a650 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
1a660 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70  zationDisabled(p
1a670 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
1a680 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29  E_ColumnCache) )
1a690 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46   return;..  /* F
1a6a0 69 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79  irst replace any
1a6b0 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e   existing entry.
1a6c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
1a6d0 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68 65  lly, the way the
1a6e0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73   column cache is
1a6f0 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c   currently used,
1a700 20 77 65 20 61 72 65 20 67 75 61 72 61 6e 74 65   we are guarante
1a710 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ed.  ** that the
1a720 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76   object will nev
1a730 65 72 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e  er already be in
1a740 20 63 61 63 68 65 2e 20 20 56 65 72 69 66 79 20   cache.  Verify 
1a750 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a  this guarantee..
1a760 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45    */.#ifndef NDE
1a770 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  BUG.  for(i=0, p
1a780 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1a790 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  he; i<pParse->nC
1a7a0 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b  olCache; i++, p+
1a7b0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
1a7c0 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  p->iTable!=iTab 
1a7d0 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  || p->iColumn!=i
1a7e0 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Col );.  }.#endi
1a7f0 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  f..  /* If the c
1a800 61 63 68 65 20 69 73 20 61 6c 72 65 61 64 79 20  ache is already 
1a810 66 75 6c 6c 2c 20 64 65 6c 65 74 65 20 74 68 65  full, delete the
1a820 20 6c 65 61 73 74 20 72 65 63 65 6e 74 6c 79 20   least recently 
1a830 75 73 65 64 20 65 6e 74 72 79 20 2a 2f 0a 20 20  used entry */.  
1a840 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  if( pParse->nCol
1a850 43 61 63 68 65 3e 3d 53 51 4c 49 54 45 5f 4e 5f  Cache>=SQLITE_N_
1a860 43 4f 4c 43 41 43 48 45 20 29 7b 0a 20 20 20 20  COLCACHE ){.    
1a870 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66  minLru = 0x7ffff
1a880 66 66 66 3b 0a 20 20 20 20 69 64 78 4c 72 75 20  fff;.    idxLru 
1a890 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = -1;.    for(i=
1a8a0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1a8b0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
1a8c0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
1a8d0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  , p++){.      if
1a8e0 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20  ( p->lru<minLru 
1a8f0 29 7b 0a 20 20 20 20 20 20 20 20 69 64 78 4c 72  ){.        idxLr
1a900 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 6d  u = i;.        m
1a910 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a  inLru = p->lru;.
1a920 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a930 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
1a940 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d  ColCache[idxLru]
1a950 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a960 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
1a970 43 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43  Cache[pParse->nC
1a980 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a 20 20 7d 0a  olCache++];.  }.
1a990 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65  .  /* Add the ne
1a9a0 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 65  w entry to the e
1a9b0 6e 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  nd of the cache 
1a9c0 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d  */.  p->iLevel =
1a9d0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1a9e0 65 76 65 6c 3b 0a 20 20 70 2d 3e 69 54 61 62 6c  evel;.  p->iTabl
1a9f0 65 20 3d 20 69 54 61 62 3b 0a 20 20 70 2d 3e 69  e = iTab;.  p->i
1aa00 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
1aa10 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
1aa20 0a 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20  .  p->tempReg = 
1aa30 30 3b 0a 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50  0;.  p->lru = pP
1aa40 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
1aa50 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  +;.}../*.** Indi
1aa60 63 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74  cate that regist
1aa70 65 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67  ers between iReg
1aa80 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72  ..iReg+nReg-1 ar
1aa90 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  e being overwrit
1aaa0 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68  ten..** Purge th
1aab0 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  e range of regis
1aac0 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f  ters from the co
1aad0 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76  lumn cache..*/.v
1aae0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1aaf0 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65  acheRemove(Parse
1ab00 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
1ab10 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
1ab20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68   int i = 0;.  wh
1ab30 69 6c 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e  ile( i<pParse->n
1ab40 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20  ColCache ){.    
1ab50 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1ab60 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61   *p = &pParse->a
1ab70 43 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20  ColCache[i];.   
1ab80 20 69 66 28 20 70 2d 3e 69 52 65 67 20 3e 3d 20   if( p->iReg >= 
1ab90 69 52 65 67 20 26 26 20 70 2d 3e 69 52 65 67 20  iReg && p->iReg 
1aba0 3c 20 69 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20  < iReg+nReg ){. 
1abb0 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
1abc0 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b  lear(pParse, i);
1abd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1abe0 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    i++;.    }.  }
1abf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
1ac00 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  er the current c
1ac10 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74  olumn cache cont
1ac20 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e  ext.  Any new en
1ac30 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61  tries added.** a
1ac40 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75  dded to the colu
1ac50 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74  mn cache after t
1ac60 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d  his call are rem
1ac70 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  oved when the.**
1ac80 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
1ac90 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  op occurs..*/.vo
1aca0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1acb0 63 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70  chePush(Parse *p
1acc0 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65  Parse){.  pParse
1acd0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b  ->iCacheLevel++;
1ace0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1acf0 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
1ad00 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1ad10 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
1ad20 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
1ad30 74 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e  tf("PUSH to %d\n
1ad40 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  ", pParse->iCach
1ad50 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e  eLevel);.  }.#en
1ad60 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  dif.}../*.** Rem
1ad70 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ove from the col
1ad80 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e  umn cache any en
1ad90 74 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  tries that were 
1ada0 61 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a  added since the.
1adb0 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ** the previous 
1adc0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1add0 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20  Push operation. 
1ade0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1adf0 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20   restore.** the 
1ae00 63 61 63 68 65 20 74 6f 20 74 68 65 20 73 74 61  cache to the sta
1ae10 74 65 20 69 74 20 77 61 73 20 69 6e 20 70 72 69  te it was in pri
1ae20 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
1ae30 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64  nt Push..*/.void
1ae40 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1ae50 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72  ePop(Parse *pPar
1ae60 73 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30  se){.  int i = 0
1ae70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1ae80 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e  se->iCacheLevel>
1ae90 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =1 );.  pParse->
1aea0 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23  iCacheLevel--;.#
1aeb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1aec0 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
1aed0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1aee0 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
1aef0 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
1af00 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c  ("POP  to %d\n",
1af10 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1af20 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
1af30 66 0a 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61  f.  while( i<pPa
1af40 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29  rse->nColCache )
1af50 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
1af60 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69  ->aColCache[i].i
1af70 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43  Level>pParse->iC
1af80 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20  acheLevel ){.   
1af90 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
1afa0 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20  ar(pParse, i);. 
1afb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1afc0 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  i++;.    }.  }.}
1afd0 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63  ../*.** When a c
1afe0 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20  ached column is 
1aff0 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72  reused, make sur
1b000 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73  e that its regis
1b010 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e  ter is.** no lon
1b020 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73  ger available as
1b030 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72   a temp register
1b040 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a  .  ticket #3879:
1b050 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72    that same.** r
1b060 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65  egister might be
1b070 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e   in the cache in
1b080 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
1b090 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a  , so be sure to.
1b0a0 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e  ** get them all.
1b0b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b0c0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1b0d0 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73  PinRegister(Pars
1b0e0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1b0f0 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
1b100 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1b110 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
1b120 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
1b130 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e  ache; i<pParse->
1b140 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20  nColCache; i++, 
1b150 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
1b160 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20  >iReg==iReg ){. 
1b170 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
1b180 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
1b190 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
1b1a0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61  de that will loa
1b1b0 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  d into register 
1b1c0 72 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74  regOut a value t
1b1d0 68 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70  hat is.** approp
1b1e0 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49  riate for the iI
1b1f0 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20  dxCol-th column 
1b200 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
1b210 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1b220 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43  prCodeLoadIndexC
1b230 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
1b240 70 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20  pParse,  /* The 
1b250 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1b260 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
1b270 2c 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  ,    /* The inde
1b280 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69  x whose column i
1b290 73 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a  s to be loaded *
1b2a0 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
1b2b0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
1b2c0 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  inting to a tabl
1b2d0 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  e row */.  int i
1b2e0 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68  IdxCol,    /* Th
1b2f0 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
1b300 69 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64  index to be load
1b310 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ed */.  int regO
1b320 75 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  ut      /* Store
1b330 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
1b340 6e 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  n value in this 
1b350 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1b360 20 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70   i16 iTabCol = p
1b370 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49  Idx->aiColumn[iI
1b380 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54  dxCol];.  if( iT
1b390 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29  abCol==XN_EXPR )
1b3a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
1b3b0 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a  dx->aColExpr );.
1b3c0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1b3d0 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70  ->aColExpr->nExp
1b3e0 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20  r>iIdxCol );.   
1b3f0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
1b400 62 20 3d 20 69 54 61 62 43 75 72 3b 0a 20 20 20  b = iTabCur;.   
1b410 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b420 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 64  Copy(pParse, pId
1b430 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69  x->aColExpr->a[i
1b440 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72  IdxCol].pExpr, r
1b450 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  egOut);.  }else{
1b460 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1b470 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1b480 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64  able(pParse->pVd
1b490 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  be, pIdx->pTable
1b4a0 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20  , iTabCur,.     
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1b4d0 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  TabCol, regOut);
1b4e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1b4f0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
1b500 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1b510 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   of the iCol-th 
1b520 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
1b530 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1b540 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1b550 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64  umnOfTable(.  Vd
1b560 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a  be *v,        /*
1b570 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20   The VDBE under 
1b580 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1b590 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
1b5a0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63    /* The table c
1b5b0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
1b5c0 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  lue */.  int iTa
1b5d0 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20  bCur,    /* The 
1b5e0 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f  table cursor.  O
1b5f0 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20  r the PK cursor 
1b600 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
1b610 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  D */.  int iCol,
1b620 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1b630 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f  of the column to
1b640 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e   extract */.  in
1b650 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a  t regOut      /*
1b660 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
1b670 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ue into this reg
1b680 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  ister */.){.  if
1b690 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
1b6a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b6b0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1b6c0 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20   iTabCur, iCol, 
1b6d0 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 72 65 74  regOut);.    ret
1b6e0 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  urn;.  }.  if( i
1b6f0 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70  Col<0 || iCol==p
1b700 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
1b710 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b720 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
1b730 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74   iTabCur, regOut
1b740 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1b750 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75  int op = IsVirtu
1b760 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43  al(pTab) ? OP_VC
1b770 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d  olumn : OP_Colum
1b780 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69  n;.    int x = i
1b790 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61  Col;.    if( !Ha
1b7a0 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20  sRowid(pTab) && 
1b7b0 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
1b7c0 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71   ){.      x = sq
1b7d0 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
1b7e0 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72  ex(sqlite3Primar
1b7f0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c  yKeyIndex(pTab),
1b800 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   iCol);.    }.  
1b810 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b820 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43  Op3(v, op, iTabC
1b830 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a  ur, x, regOut);.
1b840 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
1b850 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1b860 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c  ColumnDefault(v,
1b870 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67   pTab, iCol, reg
1b880 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
1b890 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1b8a0 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
1b8b0 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ct the iColumn-t
1b8c0 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  h column from.**
1b8d0 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
1b8e0 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
1b8f0 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69   value in a regi
1b900 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20  ster. .**.** An 
1b910 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
1b920 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  o store the colu
1b930 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  mn value in regi
1b940 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 69 73  ster iReg.  This
1b950 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72 61 6e  .** is not garan
1b960 74 65 65 65 64 20 66 6f 72 20 47 65 74 43 6f 6c  teeed for GetCol
1b970 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65 73 75  umn() - the resu
1b980 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  lt can be stored
1b990 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69 73   in.** any regis
1b9a0 74 65 72 2e 20 20 42 75 74 20 74 68 65 20 72 65  ter.  But the re
1b9b0 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74 65  sult is guarante
1b9c0 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72 65  ed to land in re
1b9d0 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a 20 66  gister iReg.** f
1b9e0 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65  or GetColumnToRe
1b9f0 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  g()..**.** There
1ba00 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
1ba10 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20   cursor to pTab 
1ba20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74  in iTable when t
1ba30 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
1ba40 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43  s called.  If iC
1ba50 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64  olumn<0 then cod
1ba60 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  e is generated t
1ba70 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65  hat extracts the
1ba80 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73   rowid..*/.int s
1ba90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1baa0 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  tColumn(.  Parse
1bab0 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
1bac0 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
1bad0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
1bae0 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
1baf0 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Tab,     /* Desc
1bb00 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
1bb10 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64  able we are read
1bb20 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ing from */.  in
1bb30 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f  t iColumn,     /
1bb40 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
1bb50 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  able column */. 
1bb60 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1bb70 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1bb80 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1bb90 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1bba0 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53  Reg,        /* S
1bbb0 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72  tore results her
1bbc0 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  e */.  u8 p5    
1bbd0 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61          /* P5 va
1bbe0 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d  lue for OP_Colum
1bbf0 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a  n + FLAGS */.){.
1bc00 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1bc10 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1bc20 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1bc30 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f  lCache *p;..  fo
1bc40 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
1bc50 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50  >aColCache; i<pP
1bc60 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
1bc70 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
1bc80 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69  if( p->iTable==i
1bc90 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c  Table && p->iCol
1bca0 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn==iColumn ){.
1bcb0 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
1bcc0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
1bcd0 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
1bce0 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67  3ExprCachePinReg
1bcf0 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d  ister(pParse, p-
1bd00 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65  >iReg);.      re
1bd10 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20  turn p->iReg;.  
1bd20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65    }.  }  .  asse
1bd30 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
1bd40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1bd50 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
1bd60 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69   pTab, iTable, i
1bd70 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
1bd80 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73   if( p5 ){.    s
1bd90 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1bda0 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c  P5(v, p5);.  }el
1bdb0 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74  se{   .    sqlit
1bdc0 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
1bdd0 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c  (pParse, iTable,
1bde0 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
1bdf0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
1be00 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  eg;.}.void sqlit
1be10 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1be20 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61 72 73  umnToReg(.  Pars
1be30 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
1be40 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
1be50 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
1be60 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
1be70 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
1be80 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1be90 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
1bea0 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
1beb0 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
1bec0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1bed0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
1bee0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1bef0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1bf00 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
1bf10 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1bf20 69 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20  iReg         /* 
1bf30 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
1bf40 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
1bf50 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1bf60 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1bf70 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75  rse, pTab, iColu
1bf80 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52 65 67  mn, iTable, iReg
1bf90 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 31 21 3d  , 0);.  if( r1!=
1bfa0 69 52 65 67 20 29 20 73 71 6c 69 74 65 33 56 64  iReg ) sqlite3Vd
1bfb0 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
1bfc0 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79  >pVdbe, OP_SCopy
1bfd0 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a  , r1, iReg);.}..
1bfe0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c  ./*.** Clear all
1bff0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e   column cache en
1c000 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tries..*/.void s
1c010 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
1c020 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72  lear(Parse *pPar
1c030 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  se){.  int i;..#
1c040 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1c050 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
1c060 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1c070 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
1c080 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
1c090 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d  ("CLEAR\n");.  }
1c0a0 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
1c0b0 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  0; i<pParse->nCo
1c0c0 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20  lCache; i++){.  
1c0d0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43    if( pParse->aC
1c0e0 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52  olCache[i].tempR
1c0f0 65 67 0a 20 20 20 20 20 26 26 20 70 50 61 72 73  eg.     && pPars
1c100 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
1c110 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
1c120 65 6d 70 52 65 67 29 0a 20 20 20 20 29 7b 0a 20  empReg).    ){. 
1c130 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54        pParse->aT
1c140 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
1c150 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50 61  TempReg++] = pPa
1c160 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
1c170 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ].iReg;.    }.  
1c180 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  }.  pParse->nCol
1c190 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Cache = 0;.}../*
1c1a0 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66  .** Record the f
1c1b0 61 63 74 20 74 68 61 74 20 61 6e 20 61 66 66 69  act that an affi
1c1c0 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20  nity change has 
1c1d0 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75  occurred on iCou
1c1e0 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20  nt.** registers 
1c1f0 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 53  starting with iS
1c200 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tart..*/.void sq
1c210 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1c220 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72  finityChange(Par
1c230 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1c240 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75  iStart, int iCou
1c250 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78  nt){.  sqlite3Ex
1c260 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
1c270 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43  arse, iStart, iC
1c280 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ount);.}../*.** 
1c290 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1c2a0 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72   move content fr
1c2b0 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72  om registers iFr
1c2c0 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d  om...iFrom+nReg-
1c2d0 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f  1.** over to iTo
1c2e0 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65  ..iTo+nReg-1. Ke
1c2f0 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ep the column ca
1c300 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a  che up-to-date..
1c310 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1c320 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73  xprCodeMove(Pars
1c330 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1c340 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69  From, int iTo, i
1c350 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65  nt nReg){.  asse
1c360 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e  rt( iFrom>=iTo+n
1c370 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65  Reg || iFrom+nRe
1c380 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69  g<=iTo );.  sqli
1c390 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50  te3VdbeAddOp3(pP
1c3a0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1c3b0 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f  Move, iFrom, iTo
1c3c0 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69 74  , nReg);.  sqlit
1c3d0 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1c3e0 65 28 70 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c  e(pParse, iFrom,
1c3f0 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64   nReg);.}..#if d
1c400 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
1c410 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
1c420 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
1c430 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
1c440 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 72  rn true if any r
1c450 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72  egister in the r
1c460 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20  ange iFrom..iTo 
1c470 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69  (inclusive).** i
1c480 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
1c490 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  f the column cac
1c4a0 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  he..**.** This r
1c4b0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 77  outine is used w
1c4c0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 61  ithin assert() a
1c4d0 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61  nd testcase() ma
1c4e0 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64  cros only.** and
1c4f0 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
1c500 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69   in a normal bui
1c510 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ld..*/.static in
1c520 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  t usedAsColumnCa
1c530 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
1c540 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
1c550 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  t iTo){.  int i;
1c560 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1c570 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
1c580 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1c590 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65  lCache; i<pParse
1c5a0 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
1c5b0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
1c5c0 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  r = p->iReg;.   
1c5d0 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26   if( r>=iFrom &&
1c5e0 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e   r<=iTo ) return
1c5f0 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54   1;    /*NO_TEST
1c600 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
1c610 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
1c620 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53  QLITE_DEBUG || S
1c630 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
1c640 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43  EST */.../*.** C
1c650 6f 6e 76 65 72 74 20 61 20 73 63 61 6c 61 72 20  onvert a scalar 
1c660 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1c670 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52  to a TK_REGISTER
1c680 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20   referencing.** 
1c690 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 20  register iReg.  
1c6a0 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1c6b0 65 6e 73 75 72 65 20 74 68 61 74 20 69 52 65 67  ensure that iReg
1c6c0 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
1c6d0 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  s.** the correct
1c6e0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 65   value for the e
1c6f0 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74  xpression..*/.st
1c700 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f  atic void exprTo
1c710 52 65 67 69 73 74 65 72 28 45 78 70 72 20 2a 70  Register(Expr *p
1c720 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70  , int iReg){.  p
1c730 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20  ->op2 = p->op;. 
1c740 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49   p->op = TK_REGI
1c750 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c  STER;.  p->iTabl
1c760 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72  e = iReg;.  Expr
1c770 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c  ClearProperty(p,
1c780 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a   EP_Skip);.}../*
1c790 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61 6e 20  .** Evaluate an 
1c7a0 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69 74 68  expression (eith
1c7b0 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61  er a vector or a
1c7c0 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
1c7d0 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a  on) and store.**
1c7e0 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 63   the result in c
1c7f0 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f  ontinguous tempo
1c800 72 61 72 79 20 72 65 67 69 73 74 65 72 73 2e 20  rary registers. 
1c810 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1c820 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  x of.** the firs
1c830 74 20 72 65 67 69 73 74 65 72 20 75 73 65 64 20  t register used 
1c840 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  to store the res
1c850 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ult..**.** If th
1c860 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c  e returned resul
1c870 74 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20  t register is a 
1c880 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c 61 72  temporary scalar
1c890 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74  , then also writ
1c8a0 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69 73 74  e.** that regist
1c8b0 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  er number into *
1c8c0 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49 66 20  piFreeable.  If 
1c8d0 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73  the returned res
1c8e0 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  ult register.** 
1c8f0 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
1c900 72 79 20 6f 72 20 69 66 20 74 68 65 20 65 78 70  ry or if the exp
1c910 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 65 63  ression is a vec
1c920 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65 65 61  tor set *piFreea
1c930 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a  ble.** to 0..*/.
1c940 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43  static int exprC
1c950 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73 65 20  odeVector(Parse 
1c960 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1c970 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61 62 6c  , int *piFreeabl
1c980 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73 75 6c  e){.  int iResul
1c990 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  t;.  int nResult
1c9a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
1c9b0 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20 69  ctorSize(p);.  i
1c9c0 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b  f( nResult==1 ){
1c9d0 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73  .    iResult = s
1c9e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1c9f0 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 69  mp(pParse, p, pi
1ca00 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c  Freeable);.  }el
1ca10 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65 65 61  se{.    *piFreea
1ca20 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ble = 0;.    if(
1ca30 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43   p->op==TK_SELEC
1ca40 54 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73 75  T ){.      iResu
1ca50 6c 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  lt = sqlite3Code
1ca60 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
1ca70 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , p, 0, 0);.    
1ca80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1ca90 20 69 3b 0a 20 20 20 20 20 20 69 52 65 73 75 6c   i;.      iResul
1caa0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  t = pParse->nMem
1cab0 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  +1;.      pParse
1cac0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
1cad0 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  t;.      for(i=0
1cae0 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b  ; i<nResult; i++
1caf0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1cb00 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72  e3ExprCodeFactor
1cb10 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  able(pParse, p->
1cb20 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
1cb30 78 70 72 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b  xpr, i+iResult);
1cb40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cb50 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73   }.  return iRes
1cb60 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ult;.}.../*.** G
1cb70 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
1cb80 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
1cb90 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
1cba0 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
1cbb0 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74  ession.  Attempt
1cbc0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
1cbd0 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
1cbe0 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52  r "target"..** R
1cbf0 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
1cc00 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73  er where results
1cc10 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
1cc20 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75  ** With this rou
1cc30 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e  tine, there is n
1cc40 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  o guarantee that
1cc50 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a   results will.**
1cc60 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61   be stored in ta
1cc70 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
1cc80 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65  t might be store
1cc90 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d in some other.
1cca0 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69  ** register if i
1ccb0 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20  t is convenient 
1ccc0 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63  to do so.  The c
1ccd0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
1cce0 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  ** must check th
1ccf0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
1cd00 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c  d move the resul
1cd10 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65  ts to the desire
1cd20 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a  d.** register..*
1cd30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
1cd40 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73  rCodeTarget(Pars
1cd50 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1cd60 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
1cd70 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
1cd80 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
1cd90 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72   /* The VM under
1cda0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1cdb0 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cdd0 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67  The opcode being
1cde0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
1cdf0 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20  inReg = target; 
1ce00 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
1ce10 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
1ce20 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69  ter inReg */.  i
1ce30 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
1ce40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
1ce50 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
1ce60 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
1ce70 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
1ce80 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20  gFree2 = 0;     
1ce90 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1cea0 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1ceb0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1cec0 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  */.  int r1, r2;
1ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cee0 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74  * Various regist
1cef0 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20  er numbers */.  
1cf00 45 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20  Expr tempX;     
1cf10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
1cf20 70 6f 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  porary expressio
1cf30 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n node */.  int 
1cf40 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  p5 = 0;..  asser
1cf50 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
1cf60 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
1cf70 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d  Mem );.  if( v==
1cf80 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
1cf90 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1cfa0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1cfb0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1cfc0 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1cfd0 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
1cfe0 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
1cff0 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
1d000 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
1d010 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1d020 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
1d030 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
1d040 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
1d050 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1d060 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
1d070 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
1d080 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
1d090 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
1d0a0 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
1d0b0 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
1d0c0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
1d0d0 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20  ->iMem>0 );.    
1d0e0 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d      return pCol-
1d0f0 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  >iMem;.      }el
1d100 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  se if( pAggInfo-
1d110 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29  >useSortingIdx )
1d120 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d130 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1d140 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e  P_Column, pAggIn
1d150 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54  fo->sortingIdxPT
1d160 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
1d170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d180 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1d190 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
1d1a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
1d1b0 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
1d1c0 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73       /* Otherwis
1d1d0 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74  e, fall thru int
1d1e0 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20  o the TK_COLUMN 
1d1f0 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
1d200 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
1d210 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  : {.      int iT
1d220 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  ab = pExpr->iTab
1d230 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54  le;.      if( iT
1d240 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ab<0 ){.        
1d250 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  if( pParse->ckBa
1d260 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  se>0 ){.        
1d270 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20    /* Generating 
1d280 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
1d290 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69  s or inserting i
1d2a0 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65  nto partial inde
1d2b0 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  x */.          r
1d2c0 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f  eturn pExpr->iCo
1d2d0 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63  lumn + pParse->c
1d2e0 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 7d  kBase;.        }
1d2f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1d300 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70  /* Coding an exp
1d310 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
1d320 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  part of an index
1d330 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61   where column na
1d340 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  mes.          **
1d350 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65   in the index re
1d360 66 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65  fer to the table
1d370 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e   to which the in
1d380 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  dex belongs */. 
1d390 20 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20           iTab = 
1d3a0 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1d3b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d3c0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1d3d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d3e0 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
1d3f0 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20  , pExpr->pTab,. 
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1d420 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54  xpr->iColumn, iT
1d430 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  ab, target,.    
1d440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d450 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1d460 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20  ->op2);.    }.  
1d470 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
1d480 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49  R: {.      codeI
1d490 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
1d4a0 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29  Expr, 0, target)
1d4b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1d4c0 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66  arget;.    }.#if
1d4d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d4e0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1d4f0 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
1d500 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
1d510 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1d520 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1d530 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1d540 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78   codeReal(v, pEx
1d550 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
1d560 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1d570 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1d580 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1d590 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
1d5a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1d5b0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1d5c0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1d5d0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71  lue) );.      sq
1d5e0 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
1d5f0 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 70  ing(v, target, p
1d600 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1d610 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1d620 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rget;.    }.    
1d630 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a  case TK_NULL: {.
1d640 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d650 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1d660 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
1d670 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1d680 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  get;.    }.#ifnd
1d690 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
1d6a0 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
1d6b0 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
1d6c0 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
1d6d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1d6e0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  ;.      char *zB
1d6f0 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  lob;.      asser
1d700 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1d710 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1d720 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1d730 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1d740 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27  u.zToken[0]=='x'
1d750 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   || pExpr->u.zTo
1d760 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20  ken[0]=='X' );. 
1d770 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1d780 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d  pr->u.zToken[1]=
1d790 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
1d7a0 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   = &pExpr->u.zTo
1d7b0 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20  ken[2];.      n 
1d7c0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1d7d0 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  0(z) - 1;.      
1d7e0 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c  assert( z[n]=='\
1d7f0 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f  '' );.      zBlo
1d800 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f  b = sqlite3HexTo
1d810 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65  Blob(sqlite3Vdbe
1d820 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Db(v), z, n);.  
1d830 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d840 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62  ddOp4(v, OP_Blob
1d850 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30  , n/2, target, 0
1d860 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41  , zBlob, P4_DYNA
1d870 4d 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75  MIC);.      retu
1d880 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1d890 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1d8a0 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
1d8b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1d8c0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1d8d0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1d8e0 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
1d8f0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1d900 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ken!=0 );.      
1d910 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1d920 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b  .zToken[0]!=0 );
1d930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d940 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56  beAddOp2(v, OP_V
1d950 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  ariable, pExpr->
1d960 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29  iColumn, target)
1d970 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
1d980 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d  r->u.zToken[1]!=
1d990 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
1d9a0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  st char *z = sql
1d9b0 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61  ite3VListNumToNa
1d9c0 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  me(pParse->pVLis
1d9d0 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  t, pExpr->iColum
1d9e0 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
1d9f0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1da00 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73  ken[0]=='?' || s
1da10 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  trcmp(pExpr->u.z
1da20 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a  Token, z)==0 );.
1da30 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
1da40 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b 20 2f  pVList[0] = 0; /
1da50 2a 20 49 6e 64 69 63 61 74 65 20 56 4c 69 73 74  * Indicate VList
1da60 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   may no longer b
1da70 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20  e enlarged */.  
1da80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1da90 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 63 68  eAppendP4(v, (ch
1daa0 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54 49 43  ar*)z, P4_STATIC
1dab0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1dac0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1dad0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1dae0 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
1daf0 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
1db00 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  ->iTable;.    }.
1db10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1db20 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73  MIT_CAST.    cas
1db30 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20  e TK_CAST: {.   
1db40 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
1db50 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
1db60 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74   CAST(pLeft AS t
1db70 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69  oken) */.      i
1db80 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
1db90 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1dba0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1dbb0 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
1dbc0 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
1dbd0 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  get ){.        s
1dbe0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dbf0 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  (v, OP_SCopy, in
1dc00 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
1dc10 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
1dc20 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
1dc30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1dc40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74  ddOp2(v, OP_Cast
1dc50 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc70 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74    sqlite3Affinit
1dc80 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
1dc90 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20  Token, 0));.    
1dca0 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64    testcase( used
1dcb0 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
1dcc0 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52  arse, inReg, inR
1dcd0 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  eg) );.      sql
1dce0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
1dcf0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
1dd00 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20  se, inReg, 1);. 
1dd10 20 20 20 20 20 72 65 74 75 72 6e 20 69 6e 52 65       return inRe
1dd20 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  g;.    }.#endif 
1dd30 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
1dd40 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
1dd50 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
1dd60 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20  TK_ISNOT:.      
1dd70 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
1dd80 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
1dd90 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c  ;.      p5 = SQL
1dda0 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20  ITE_NULLEQ;.    
1ddb0 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67    /* fall-throug
1ddc0 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  h */.    case TK
1ddd0 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
1dde0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
1ddf0 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
1de00 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
1de10 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
1de20 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  _EQ: {.      Exp
1de30 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
1de40 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69  ->pLeft;.      i
1de50 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
1de60 56 65 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b  Vector(pLeft) ){
1de70 0a 20 20 20 20 20 20 20 20 63 6f 64 65 56 65 63  .        codeVec
1de80 74 6f 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  torCompare(pPars
1de90 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1dea0 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20  , op, p5);.     
1deb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1dec0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1ded0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1dee0 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65   pLeft, &regFree
1def0 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  1);.        r2 =
1df00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1df10 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1df20 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1df30 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20  Free2);.        
1df40 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1df50 73 65 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72  se, pLeft, pExpr
1df60 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1df70 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1df80 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f  , inReg, SQLITE_
1df90 53 54 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20  STOREP2 | p5);. 
1dfa0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1dfb0 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
1dfc0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
1dfd0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1dfe0 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
1dff0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1e000 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
1e010 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
1e020 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1e030 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
1e040 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1e050 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
1e060 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
1e070 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1e080 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
1e090 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1e0a0 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
1e0b0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
1e0c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1e0d0 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
1e0e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1e0f0 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
1e100 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
1e110 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1e120 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
1e130 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1e140 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
1e150 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
1e160 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1e170 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
1e180 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1e190 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1e1a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1e1b0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1e1c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1e1d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1e1e0 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
1e1f0 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
1e200 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20   case TK_PLUS:. 
1e210 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
1e220 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
1e230 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
1e240 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  REM:.    case TK
1e250 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73  _BITAND:.    cas
1e260 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20  e TK_BITOR:.    
1e270 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20  case TK_SLASH:. 
1e280 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
1e290 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
1e2a0 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65  SHIFT: .    case
1e2b0 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20   TK_CONCAT: {.  
1e2c0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41      assert( TK_A
1e2d0 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20  ND==OP_And );   
1e2e0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1e2f0 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  e( op==TK_AND );
1e300 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e310 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20  K_OR==OP_Or );  
1e320 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1e330 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20  case( op==TK_OR 
1e340 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e350 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64   TK_PLUS==OP_Add
1e360 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 74 65   );           te
1e370 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50  stcase( op==TK_P
1e380 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73  LUS );.      ass
1e390 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f  ert( TK_MINUS==O
1e3a0 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20 20  P_Subtract );   
1e3b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e3c0 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20  TK_MINUS );.    
1e3d0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d    assert( TK_REM
1e3e0 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29  ==OP_Remainder )
1e3f0 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
1e400 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20   op==TK_REM );. 
1e410 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e420 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e  BITAND==OP_BitAn
1e430 64 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  d );      testca
1e440 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e  se( op==TK_BITAN
1e450 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
1e460 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f  t( TK_BITOR==OP_
1e470 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20  BitOr );        
1e480 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1e490 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20  _BITOR );.      
1e4a0 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48  assert( TK_SLASH
1e4b0 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20  ==OP_Divide );  
1e4c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e4d0 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20  p==TK_SLASH );. 
1e4e0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e4f0 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  LSHIFT==OP_Shift
1e500 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74 63 61  Left );   testca
1e510 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46  se( op==TK_LSHIF
1e520 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
1e530 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50  t( TK_RSHIFT==OP
1e540 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 20 20  _ShiftRight );  
1e550 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1e560 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _RSHIFT );.     
1e570 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43   assert( TK_CONC
1e580 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b  AT==OP_Concat );
1e590 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e5a0 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b  op==TK_CONCAT );
1e5b0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1e5c0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1e5d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e5e0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1e5f0 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1e600 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e610 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e620 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1e630 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
1e640 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
1e650 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  p, r2, r1, targe
1e660 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
1e670 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1e680 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e690 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1e6a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e6b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e6c0 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
1e6d0 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
1e6e0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
1e6f0 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
1e700 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
1e710 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
1e720 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63  GER ){.        c
1e730 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73  odeInteger(pPars
1e740 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72  e, pLeft, 1, tar
1e750 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  get);.        re
1e760 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 69 66  turn target;.#if
1e770 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e780 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1e790 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e7a0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
1e7b0 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OAT ){.        a
1e7c0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1e7d0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e7e0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1e7f0 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
1e800 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  v, pLeft->u.zTok
1e810 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  en, 1, target);.
1e820 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
1e830 61 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20  arget;.#endif.  
1e840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e850 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b     tempX.op = TK
1e860 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
1e870 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20    tempX.flags = 
1e880 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54  EP_IntValue|EP_T
1e890 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20  okenOnly;.      
1e8a0 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65    tempX.u.iValue
1e8b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31   = 0;.        r1
1e8c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e8d0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
1e8e0 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31  tempX, &regFree1
1e8f0 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
1e900 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e910 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1e920 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1e930 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee2);.        sq
1e940 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1e950 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20  v, OP_Subtract, 
1e960 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
1e970 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1e980 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1e990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e9a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e9b0 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a   case TK_BITNOT:
1e9c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1e9d0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1e9e0 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f  ( TK_BITNOT==OP_
1e9f0 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74  BitNot );   test
1ea00 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
1ea10 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  NOT );.      ass
1ea20 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f  ert( TK_NOT==OP_
1ea30 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20 74  Not );         t
1ea40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1ea50 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
1ea60 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1ea70 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1ea80 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1ea90 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
1eaa0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1eab0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1eac0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ead0 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29  , op, r1, inReg)
1eae0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1eaf0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1eb00 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
1eb10 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
1eb20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
1eb30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1eb40 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
1eb50 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ll );   testcase
1eb60 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
1eb70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1eb80 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
1eb90 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63  NotNull ); testc
1eba0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
1ebb0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ULL );.      sql
1ebc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ebd0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
1ebe0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1ebf0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1ec00 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1ec10 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1ec20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1ec30 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1ec40 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1ec50 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
1ec60 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
1ec70 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
1ec80 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1ec90 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
1eca0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1ecb0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
1ecc0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
1ecd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ece0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
1ecf0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
1ed00 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1ed10 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
1ed20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ed30 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1ed40 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
1ed50 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f    AggInfo *pInfo
1ed60 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
1ed70 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
1ed80 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
1ed90 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1eda0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1edb0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1edc0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1edd0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1ede0 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
1edf0 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70  regate: %s()", p
1ee00 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1ee10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ee20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e        return pIn
1ee30 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d  fo->aFunc[pExpr-
1ee40 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20  >iAgg].iMem;.   
1ee50 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1ee60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ee70 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
1ee80 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
1ee90 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20  pFarg;       /* 
1eea0 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e  List of function
1eeb0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1eec0 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20      int nFarg;  
1eed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1eee0 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e  mber of function
1eef0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1ef00 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
1ef10 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  f;         /* Th
1ef20 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  e function defin
1ef30 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ition object */.
1ef40 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1ef50 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20   *zId;       /* 
1ef60 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
1ef70 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63  e */.      u32 c
1ef80 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20  onstMask = 0;   
1ef90 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e    /* Mask of fun
1efa0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
1efb0 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e  that are constan
1efc0 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  t */.      int i
1efd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1efe0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1eff0 72 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  r */.      sqlit
1f000 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1f010 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  >db;  /* The dat
1f020 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1f030 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63   */.      u8 enc
1f040 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20   = ENC(db);     
1f050 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63   /* The text enc
1f060 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  oding used by th
1f070 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
1f080 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
1f090 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41  oll = 0;    /* A
1f0a0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1f0b0 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  nce */..      if
1f0c0 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
1f0d0 70 50 61 72 73 65 29 20 26 26 20 73 71 6c 69 74  pParse) && sqlit
1f0e0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
1f0f0 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20 29  NotJoin(pExpr) )
1f100 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  {.        /* SQL
1f110 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62   functions can b
1f120 65 20 65 78 70 65 6e 73 69 76 65 2e 20 53 6f 20  e expensive. So 
1f130 74 72 79 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 73  try to move cons
1f140 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e 73 0a 20  tant functions. 
1f150 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 20 6f 66         ** out of
1f160 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2c   the inner loop,
1f170 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
1f180 61 6e 73 20 61 6e 20 65 78 74 72 61 20 4f 50 5f  ans an extra OP_
1f190 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  Copy. */.       
1f1a0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
1f1b0 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
1f1c0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29  arse, pExpr, -1)
1f1d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f1e0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1f1f0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1f200 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1f210 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
1f220 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1f230 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
1f240 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  ){.        pFarg
1f250 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
1f260 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  e{.        pFarg
1f270 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1f280 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1f290 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f   nFarg = pFarg ?
1f2a0 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20   pFarg->nExpr : 
1f2b0 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
1f2c0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1f2d0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1f2e0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a  alue) );.      z
1f2f0 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  Id = pExpr->u.zT
1f300 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44 65 66  oken;.      pDef
1f310 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
1f320 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20  nction(db, zId, 
1f330 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a  nFarg, enc, 0);.
1f340 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1f350 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c  ABLE_UNKNOWN_SQL
1f360 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20  _FUNCTION.      
1f370 69 66 28 20 70 44 65 66 3d 3d 30 20 26 26 20 70  if( pDef==0 && p
1f380 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
1f390 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
1f3a0 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
1f3b0 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77  tion(db, "unknow
1f3c0 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20  n", nFarg, enc, 
1f3d0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
1f3e0 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  if.      if( pDe
1f3f0 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46  f==0 || pDef->xF
1f400 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20  inalize!=0 ){.  
1f410 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1f420 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1f430 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a  nknown function:
1f440 20 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20   %s()", zId);.  
1f450 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f460 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41     }..      /* A
1f470 74 74 65 6d 70 74 20 61 20 64 69 72 65 63 74 20  ttempt a direct 
1f480 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1f490 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43  f the built-in C
1f4a0 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20  OALESCE() and.  
1f4b0 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20      ** IFNULL() 
1f4c0 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73  functions.  This
1f4d0 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73   avoids unnecess
1f4e0 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f  ary evaluation o
1f4f0 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d  f.      ** argum
1f500 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66 69  ents past the fi
1f510 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67  rst non-NULL arg
1f520 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ument..      */.
1f530 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
1f540 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
1f550 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45  TE_FUNC_COALESCE
1f560 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1f570 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71  endCoalesce = sq
1f580 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1f590 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61  el(v);.        a
1f5a0 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20  ssert( nFarg>=2 
1f5b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1f5c0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1f5d0 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  e, pFarg->a[0].p
1f5e0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
1f5f0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
1f600 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20  i<nFarg; i++){. 
1f610 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1f620 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f630 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74  _NotNull, target
1f640 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a  , endCoalesce);.
1f650 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
1f660 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1f670 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f680 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
1f690 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a  se, target, 1);.
1f6a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f6b0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1f6c0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
1f6d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1f6e0 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  e(pParse, pFarg-
1f6f0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[i].pExpr, tar
1f700 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  get);.          
1f710 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f720 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1f730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1f740 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1f750 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61  eLabel(v, endCoa
1f760 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20  lesce);.        
1f770 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1f780 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c        /* The UNL
1f790 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e  IKELY() function
1f7a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68   is a no-op.  Th
1f7b0 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20  e result is the 
1f7c0 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f  value.      ** o
1f7d0 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
1f7e0 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
1f7f0 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
1f800 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
1f810 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20  E_FUNC_UNLIKELY 
1f820 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1f830 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20  t( nFarg>=1 );. 
1f840 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
1f850 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1f860 67 65 74 28 70 50 61 72 73 65 2c 20 70 46 61 72  get(pParse, pFar
1f870 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74  g->a[0].pExpr, t
1f880 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
1f890 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1f8a0 45 42 55 47 0a 20 20 20 20 20 20 2f 2a 20 54 68  EBUG.      /* Th
1f8b0 65 20 41 46 46 49 4e 49 54 59 28 29 20 66 75 6e  e AFFINITY() fun
1f8c0 63 74 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ction evaluates 
1f8d0 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  to a string that
1f8e0 20 64 65 73 63 72 69 62 65 73 0a 20 20 20 20 20   describes.     
1f8f0 20 2a 2a 20 74 68 65 20 74 79 70 65 20 61 66 66   ** the type aff
1f900 69 6e 69 74 79 20 6f 66 20 74 68 65 20 61 72 67  inity of the arg
1f910 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20  ument.  This is 
1f920 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
1f930 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
1f940 20 53 51 4c 69 74 65 20 74 79 70 65 20 6c 6f 67   SQLite type log
1f950 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
1f960 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
1f970 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
1f980 46 55 4e 43 5f 41 46 46 49 4e 49 54 59 20 29 7b  FUNC_AFFINITY ){
1f990 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1f9a0 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b  har *azAff[] = {
1f9b0 20 22 62 6c 6f 62 22 2c 20 22 74 65 78 74 22 2c   "blob", "text",
1f9c0 20 22 6e 75 6d 65 72 69 63 22 2c 20 22 69 6e 74   "numeric", "int
1f9d0 65 67 65 72 22 2c 20 22 72 65 61 6c 22 20 7d 3b  eger", "real" };
1f9e0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66  .        char af
1f9f0 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  f;.        asser
1fa00 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20  t( nFarg==1 );. 
1fa10 20 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c         aff = sql
1fa20 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1fa30 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78  (pFarg->a[0].pEx
1fa40 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pr);.        sql
1fa50 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
1fa60 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 0a 20  ng(v, target, . 
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66               aff
1fa90 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c   ? azAff[aff-SQL
1faa0 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a 20  ITE_AFF_BLOB] : 
1fab0 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20 20 20  "none");.       
1fac0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1fad0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
1fae0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1faf0 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
1fb00 20 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26        if( i<32 &
1fb10 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
1fb20 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61  onstant(pFarg->a
1fb30 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
1fb40 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1fb50 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  ( i==31 );.     
1fb60 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c       constMask |
1fb70 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a  = MASKBIT32(i);.
1fb80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fb90 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e    if( (pDef->fun
1fba0 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
1fbb0 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d  FUNC_NEEDCOLL)!=
1fbc0 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20  0 && !pColl ){. 
1fbd0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
1fbe0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1fbf0 53 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72  Seq(pParse, pFar
1fc00 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  g->a[i].pExpr);.
1fc10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fc20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72  }.      if( pFar
1fc30 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  g ){.        if(
1fc40 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20   constMask ){.  
1fc50 20 20 20 20 20 20 20 20 72 31 20 3d 20 70 50 61          r1 = pPa
1fc60 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
1fc70 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
1fc80 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20  Mem += nFarg;.  
1fc90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fca0 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
1fcb0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1fcc0 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a  pParse, nFarg);.
1fcd0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1fce0 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68     /* For length
1fcf0 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20  () and typeof() 
1fd00 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61  functions with a
1fd10 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74   column argument
1fd20 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  ,.        ** set
1fd30 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65   the P5 paramete
1fd40 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75  r to the OP_Colu
1fd50 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46  mn opcode to OPF
1fd60 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20  LAG_LENGTHARG.  
1fd70 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c        ** or OPFL
1fd80 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73  AG_TYPEOFARG res
1fd90 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76  pectively, to av
1fda0 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20  oid unnecessary 
1fdb0 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  data.        ** 
1fdc0 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20  loading..       
1fdd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1fde0 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
1fdf0 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f   & (SQLITE_FUNC_
1fe00 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55  LENGTH|SQLITE_FU
1fe10 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29  NC_TYPEOF))!=0 )
1fe20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  {.          u8 e
1fe30 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20  xprOp;.         
1fe40 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d   assert( nFarg==
1fe50 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  1 );.          a
1fe60 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b  ssert( pFarg->a[
1fe70 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  0].pExpr!=0 );. 
1fe80 20 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20           exprOp 
1fe90 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  = pFarg->a[0].pE
1fea0 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20  xpr->op;.       
1feb0 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54     if( exprOp==T
1fec0 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72  K_COLUMN || expr
1fed0 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  Op==TK_AGG_COLUM
1fee0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
1fef0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
1ff00 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46  FUNC_LENGTH==OPF
1ff10 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b  LAG_LENGTHARG );
1ff20 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
1ff30 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
1ff40 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f  _TYPEOF==OPFLAG_
1ff50 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20  TYPEOFARG );.   
1ff60 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1ff70 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  e( pDef->funcFla
1ff80 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47  gs & OPFLAG_LENG
1ff90 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  THARG );.       
1ffa0 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d       pFarg->a[0]
1ffb0 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20  .pExpr->op2 = . 
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffd0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
1ffe0 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54   & (OPFLAG_LENGT
1fff0 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45  HARG|OPFLAG_TYPE
20000 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20  OFARG);.        
20010 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
20020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20030 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
20040 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b  se);     /* Tick
20050 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20  et 2ea2425d34be 
20060 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
20070 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
20080 73 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  st(pParse, pFarg
20090 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20 20 20 20  , r1, 0,.       
200a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200b0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
200c0 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f  ECEL_DUP|SQLITE_
200d0 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20  ECEL_FACTOR);.  
200e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
200f0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
20100 29 3b 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65  );      /* Ticke
20110 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a  t 2ea2425d34be *
20120 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
20130 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20         r1 = 0;. 
20140 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
20150 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
20160 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a  ALTABLE.      /*
20170 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f   Possibly overlo
20180 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ad the function 
20190 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  if the first arg
201a0 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a  ument is.      *
201b0 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * a virtual tabl
201c0 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20  e column..      
201d0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
201e0 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20  infix functions 
201f0 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47  (LIKE, GLOB, REG
20200 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20  EXP, and MATCH) 
20210 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  use the.      **
20220 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
20230 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c  , not the first,
20240 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
20250 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20   to test to.    
20260 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
20270 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  s a column in a 
20280 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
20290 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63  This is done bec
202a0 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  ause.      ** th
202b0 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f  e left operand o
202c0 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  f infix function
202d0 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77  s (the operand w
202e0 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20  e want to.      
202f0 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c  ** control overl
20300 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20  oading) ends up 
20310 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
20320 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  gument to the.  
20330 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
20340 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
20350 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65   "A glob B" is e
20360 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20  quivalent to .  
20370 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41      ** "glob(B,A
20380 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75  ).  We want to u
20390 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67  se the A in "A g
203a0 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20  lob B" to test. 
203b0 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63       ** for func
203c0 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67  tion overloading
203d0 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68  .  But we use th
203e0 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f  e B term in "glo
203f0 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a  b(B,A)"..      *
20400 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  /.      if( nFar
20410 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e  g>=2 && (pExpr->
20420 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78  flags & EP_Infix
20430 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
20440 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56   pDef = sqlite3V
20450 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74  tabOverloadFunct
20460 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46  ion(db, pDef, nF
20470 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d  arg, pFarg->a[1]
20480 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
20490 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30  else if( nFarg>0
204a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
204b0 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
204c0 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
204d0 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
204e0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
204f0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  r);.      }.#end
20500 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  if.      if( pDe
20510 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
20520 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
20530 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  OLL ){.        i
20540 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
20550 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
20560 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l; .        sqli
20570 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
20580 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
20590 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
205a0 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
205b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
205c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
205d0 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  4(v, OP_Function
205e0 30 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31  0, constMask, r1
205f0 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
20600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20610 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50    (char*)pDef, P
20620 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
20630 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
20640 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61  ngeP5(v, (u8)nFa
20650 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  rg);.      if( n
20660 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73  Farg && constMas
20670 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
20680 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
20690 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
206a0 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  r1, nFarg);.    
206b0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
206c0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
206d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
206e0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
206f0 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
20700 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
20710 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  CT: {.      int 
20720 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74  nCol;.      test
20730 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49  case( op==TK_EXI
20740 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  STS );.      tes
20750 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45  tcase( op==TK_SE
20760 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66  LECT );.      if
20770 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
20780 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72  && (nCol = pExpr
20790 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
207a0 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29  ist->nExpr)!=1 )
207b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
207c0 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
207d0 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29  pParse, nCol, 1)
207e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
207f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
20800 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
20810 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
20820 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
20830 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20840 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
20850 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b  SELECT_COLUMN: {
20860 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
20870 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
20880 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  Left->iTable==0 
20890 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
208a0 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20  ->pLeft->iTable 
208b0 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  = sqlite3CodeSub
208c0 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
208d0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 2c 20  Expr->pLeft, 0, 
208e0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
208f0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
20900 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45  >iTable==0 || pE
20910 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  xpr->pLeft->op==
20920 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
20930 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
20940 61 62 6c 65 0a 20 20 20 20 20 20 20 26 26 20 70  able.       && p
20950 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 28 6e  Expr->iTable!=(n
20960 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
20970 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
20980 70 4c 65 66 74 29 29 20 0a 20 20 20 20 20 20 29  pLeft)) .      )
20990 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
209a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
209b0 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73  , "%d columns as
209c0 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73  signed %d values
209d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
209e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209f0 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
20a00 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
20a10 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
20a20 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20  ->pLeft->iTable 
20a30 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
20a40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20a50 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
20a60 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20  int destIfFalse 
20a70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
20a80 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
20a90 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
20aa0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
20ab0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
20ac0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20ad0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
20ae0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
20af0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20b00 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
20b10 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
20b20 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
20b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20b40 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
20b50 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
20b60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20b70 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
20b80 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
20b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20ba0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
20bb0 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a  mm, target, 0);.
20bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20bd0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
20be0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
20bf0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
20c00 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  t;.    }.#endif 
20c10 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
20c20 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20  UBQUERY */...   
20c30 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20   /*.    **    x 
20c40 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
20c50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
20c60 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
20c70 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   to.    **.    *
20c80 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
20c90 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  =z.    **.    **
20ca0 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   X is stored in 
20cb0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
20cc0 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64    ** Y is stored
20cd0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
20ce0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[0].pExpr..  
20cf0 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64    ** Z is stored
20d00 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
20d10 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[1].pExpr..  
20d20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
20d30 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
20d40 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
20d50 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
20d60 20 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a   target, 0, 0);.
20d70 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
20d80 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
20d90 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20  ase TK_SPAN:.   
20da0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45   case TK_COLLATE
20db0 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  : .    case TK_U
20dc0 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65  PLUS: {.      re
20dd0 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
20de0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
20df0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
20e00 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a   target);.    }.
20e10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49  .    case TK_TRI
20e20 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  GGER: {.      /*
20e30 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69   If the opcode i
20e40 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68  s TK_TRIGGER, th
20e50 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
20e60 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  n is a reference
20e70 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63  .      ** to a c
20e80 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
20e90 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75  .* or old.* pseu
20ea0 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61  do-tables availa
20eb0 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
20ec0 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
20ed0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45  . In this case E
20ee0 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65  xpr.iTable is se
20ef0 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20  t to 1 for the. 
20f00 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73       ** new.* ps
20f10 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30  eudo-table, or 0
20f20 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70   for the old.* p
20f30 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70  seudo-table. Exp
20f40 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  r.iColumn.      
20f50 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
20f60 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70   column of the p
20f70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72  seudo-table to r
20f80 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f  ead, or to -1 to
20f90 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74  .      ** read t
20fa0 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a  he rowid field..
20fb0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
20fc0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
20fd0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
20fe0 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61  using an OP_Para
20ff0 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31  m opcode. The p1
21000 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65  .      ** parame
21010 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
21020 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64  for an old.rowid
21030 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74   reference, or t
21040 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a  o (i+1).      **
21050 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e   to reference an
21060 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20  other column of 
21070 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
21080 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20  -table, where . 
21090 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65       ** i is the
210a0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   index of the co
210b0 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e  lumn. For a new.
210c0 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c  rowid reference,
210d0 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   p1 is.      ** 
210e0 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68  set to (n+1), wh
210f0 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d  ere n is the num
21100 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
21110 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61  n each pseudo-ta
21120 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f  ble..      ** Fo
21130 72 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  r a reference to
21140 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d   any other colum
21150 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70  n in the new.* p
21160 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a  seudo-table, p1.
21170 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
21180 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72  to (n+2+i), wher
21190 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73  e n and i are as
211a0 20 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75   defined previou
211b0 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a  sly. For.      *
211c0 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
211d0 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68  e table on which
211e0 20 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65   triggers are be
211f0 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20  ing fired is.   
21200 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61     ** declared a
21210 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
21220 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
21230 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
21240 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21250 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72  Then p1 is inter
21260 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  preted as follow
21270 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
21280 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d    **   p1==0   -
21290 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20  >    old.rowid  
212a0 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20     p1==3   ->   
212b0 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20   new.rowid.     
212c0 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e   **   p1==1   ->
212d0 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20      old.a       
212e0 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20    p1==4   ->    
212f0 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20  new.a.      **  
21300 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f   p1==2   ->    o
21310 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d  ld.b         p1=
21320 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62  =5   ->    new.b
21330 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f         .      */
21340 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
21350 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
21360 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d  ;.      int p1 =
21370 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a   pExpr->iTable *
21380 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20   (pTab->nCol+1) 
21390 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f  + 1 + pExpr->iCo
213a0 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73  lumn;..      ass
213b0 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62  ert( pExpr->iTab
213c0 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e  le==0 || pExpr->
213d0 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
213e0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
213f0 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26  ->iColumn>=-1 &&
21400 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
21410 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
21420 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
21430 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78  ->iPKey<0 || pEx
21440 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61  pr->iColumn!=pTa
21450 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20  b->iPKey );.    
21460 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20    assert( p1>=0 
21470 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f  && p1<(pTab->nCo
21480 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20  l*2+2) );..     
21490 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
214a0 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20  p2(v, OP_Param, 
214b0 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  p1, target);.   
214c0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
214d0 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64  v, "%s.%s -> $%d
214e0 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70  ",.        (pExp
214f0 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77  r->iTable ? "new
21500 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20  " : "old"),.    
21510 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c      (pExpr->iCol
21520 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20  umn<0 ? "rowid" 
21530 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61  : pExpr->pTab->a
21540 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
21550 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20  mn].zName),.    
21560 20 20 20 20 74 61 72 67 65 74 0a 20 20 20 20 20      target.     
21570 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51   ));..#ifndef SQ
21580 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
21590 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f  NG_POINT.      /
215a0 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
215b0 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74  has REAL affinit
215c0 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e  y, it may curren
215d0 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  tly be stored as
215e0 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74   an.      ** int
215f0 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61  eger. Use OP_Rea
21600 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b  lAffinity to mak
21610 65 20 73 75 72 65 20 69 74 20 69 73 20 72 65 61  e sure it is rea
21620 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20 20 20  lly real..      
21630 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
21640 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35  ENCE-OF: R-60985
21650 2d 35 37 36 36 32 20 53 51 4c 69 74 65 20 77 69  -57662 SQLite wi
21660 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 20 76  ll convert the v
21670 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20 20 20  alue back to.   
21680 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70     ** floating p
21690 6f 69 6e 74 20 77 68 65 6e 20 65 78 74 72 61 63  oint when extrac
216a0 74 69 6e 67 20 69 74 20 66 72 6f 6d 20 74 68 65  ting it from the
216b0 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20   record.  */.   
216c0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
216d0 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20  olumn>=0 .      
216e0 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   && pTab->aCol[p
216f0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61  Expr->iColumn].a
21700 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
21710 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29  AFF_REAL.      )
21720 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21730 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
21740 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20  P_RealAffinity, 
21750 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
21760 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
21770 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
21780 63 61 73 65 20 54 4b 5f 56 45 43 54 4f 52 3a 20  case TK_VECTOR: 
21790 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
217a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
217b0 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
217c0 65 64 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ed");.      brea
217d0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
217e0 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
217f0 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
21800 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
21810 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
21820 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
21830 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
21840 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
21850 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
21860 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
21870 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
21880 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
21890 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
218a0 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
218b0 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
218c0 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
218d0 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
218e0 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
218f0 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
21900 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
21910 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
21920 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
21930 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
21940 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
21950 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
21960 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
21970 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
21980 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
21990 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20   is in the last 
219a0 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72  element of pExpr
219b0 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78  ->x.pList if pEx
219c0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
219d0 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64  pr is.    ** odd
219e0 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f  .  The Y is also
219f0 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74   optional.  If t
21a00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
21a10 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74  ments in x.pList
21a20 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c  .    ** is even,
21a30 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74   then Y is omitt
21a40 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65  ed and the "othe
21a50 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73  rwise" result is
21a60 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
21a70 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
21a80 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
21a90 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
21aa0 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
21ab0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
21ac0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
21ad0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
21ae0 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
21af0 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
21b00 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
21b10 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
21b20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
21b30 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
21b40 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
21b50 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
21b60 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
21b70 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
21b80 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
21b90 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
21ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bb0 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
21bc0 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
21bd0 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
21be0 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
21bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c00 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
21c10 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
21c20 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
21c30 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
21c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c50 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
21c60 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
21c70 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
21c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c90 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
21ca0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
21cb0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
21cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cd0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
21ce0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
21cf0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
21d00 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
21d10 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
21d20 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
21d30 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
21d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21d50 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
21d60 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
21d70 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
21d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20         /* The X 
21da0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
21db0 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20      Expr *pTest 
21dc0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
21dd0 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28        /* X==Ei (
21de0 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20  form A) or just 
21df0 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20  Ei (form B) */. 
21e00 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69       VVA_ONLY( i
21e10 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d  nt iCacheLevel =
21e20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
21e30 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61  evel; )..      a
21e40 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
21e50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
21e60 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20  P_xIsSelect) && 
21e70 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29  pExpr->x.pList )
21e80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
21e90 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
21ea0 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20  Expr > 0);.     
21eb0 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
21ec0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
21ed0 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
21ee0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
21ef0 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
21f00 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62  pr;.      endLab
21f10 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
21f20 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
21f30 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45      if( (pX = pE
21f40 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
21f50 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 20  {.        tempX 
21f60 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74  = *pX;.        t
21f70 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d  estcase( pX->op=
21f80 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
21f90 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69        exprToRegi
21fa0 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65 78 70  ster(&tempX, exp
21fb0 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72  rCodeVector(pPar
21fc0 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67  se, &tempX, &reg
21fd0 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20  Free1));.       
21fe0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
21ff0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
22000 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d 70    memset(&opComp
22010 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f  are, 0, sizeof(o
22020 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20 20  pCompare));.    
22030 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70      opCompare.op
22040 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   = TK_EQ;.      
22050 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66    opCompare.pLef
22060 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20  t = &tempX;.    
22070 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43      pTest = &opC
22080 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20  ompare;.        
22090 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64 39  /* Ticket b351d9
220a0 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64 62  5f9cd5ef17e9d9db
220b0 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30 30  ae18f5ca86111900
220c0 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  01:.        ** T
220d0 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46  he value in regF
220e0 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20 53  ree1 might get S
220f0 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65  Copy-ed into the
22100 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20   file result..  
22110 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65        ** So make
22120 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72   sure that the r
22130 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65 72  egFree1 register
22140 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66   is not reused f
22150 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20  or other.       
22160 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64   ** purposes and
22170 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72   possibly overwr
22180 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20  itten.  */.     
22190 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b     regFree1 = 0;
221a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
221b0 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d  or(i=0; i<nExpr-
221c0 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20  1; i=i+2){.     
221d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
221e0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
221f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20  .        if( pX 
22200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
22210 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b  ert( pTest!=0 );
22220 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  .          opCom
22230 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c  pare.pRight = aL
22240 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
22250 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
22260 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74  .          pTest
22270 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e   = aListelem[i].
22280 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  pExpr;.        }
22290 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73  .        nextCas
222a0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
222b0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
222c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
222d0 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Test->op==TK_COL
222e0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
222f0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
22300 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c  e(pParse, pTest,
22310 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54   nextCase, SQLIT
22320 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
22330 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
22340 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
22350 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
22360 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
22370 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
22380 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
22390 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61  m[i+1].pExpr, ta
223a0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
223b0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
223c0 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
223d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
223e0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
223f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
22400 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
22410 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a  l(v, nextCase);.
22420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22430 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29  ( (nExpr&1)!=0 )
22440 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22450 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
22460 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
22470 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
22480 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
22490 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72  a[nExpr-1].pExpr
224a0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
224b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
224c0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
224d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
224e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
224f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
22500 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
22510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
22520 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
22530 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
22540 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
22550 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
22560 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
22570 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20  el==iCacheLevel 
22580 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22590 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
225a0 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
225b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
225c0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
225d0 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
225e0 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
225f0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
22600 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
22610 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20  ==OE_Rollback . 
22620 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
22630 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
22640 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20  _Abort.         
22650 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
22660 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20  nity==OE_Fail.  
22670 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
22680 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
22690 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a  Ignore.      );.
226a0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
226b0 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29  e->pTriggerTab )
226c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
226d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
226e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
226f0 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
22700 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
22710 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
22720 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
22730 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
22740 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
22750 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
22760 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  ty==OE_Abort ){.
22770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
22780 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
22790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
227a0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
227b0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
227c0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
227d0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
227e0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
227f0 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ore ){.        s
22800 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
22810 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c  (.            v,
22820 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
22830 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  _OK, OE_Ignore, 
22840 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
22850 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56  en,0);.        V
22860 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
22870 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22880 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74       sqlite3Halt
22890 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
228a0 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  e, SQLITE_CONSTR
228b0 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20  AINT_TRIGGER,.  
228c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228d0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
228e0 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78  r->affinity, pEx
228f0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
22900 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
22910 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
22920 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
22930 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
22940 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
22950 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
22960 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
22970 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
22980 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  ;.  return inReg
22990 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f  ;.}../*.** Facto
229a0 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f  r out the code o
229b0 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
229c0 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61  ession to initia
229d0 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
229e0 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65 73 74 3e  *.** If regDest>
229f0 3d 30 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  =0 then the resu
22a00 6c 74 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f  lt is always sto
22a10 72 65 64 20 69 6e 20 74 68 61 74 20 72 65 67 69  red in that regi
22a20 73 74 65 72 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ster and the.** 
22a30 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 72 65  result is not re
22a40 75 73 61 62 6c 65 2e 20 20 49 66 20 72 65 67 44  usable.  If regD
22a50 65 73 74 3c 30 20 74 68 65 6e 20 74 68 69 73 20  est<0 then this 
22a60 72 6f 75 74 69 6e 65 20 69 73 20 66 72 65 65 20  routine is free 
22a70 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65  to .** store the
22a80 20 76 61 6c 75 65 20 77 68 65 72 65 65 76 65 72   value whereever
22a90 20 69 74 20 77 61 6e 74 73 2e 20 20 54 68 65 20   it wants.  The 
22aa0 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20 74  register where t
22ab0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a  he expression .*
22ac0 2a 20 69 73 20 73 74 6f 72 65 64 20 69 73 20 72  * is stored is r
22ad0 65 74 75 72 6e 65 64 2e 20 20 57 68 65 6e 20 72  eturned.  When r
22ae0 65 67 44 65 73 74 3c 30 2c 20 74 77 6f 20 69 64  egDest<0, two id
22af0 65 6e 74 69 63 61 6c 20 65 78 70 72 65 73 73 69  entical expressi
22b00 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65  ons will.** code
22b10 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65 67   to the same reg
22b20 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
22b30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
22b40 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nit(.  Parse *pP
22b50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
22b60 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
22b70 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
22b80 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
22b90 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65  sion to code whe
22ba0 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69 74 69  n the VDBE initi
22bb0 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20  alizes */.  int 
22bc0 72 65 67 44 65 73 74 20 20 20 20 20 20 20 2f 2a  regDest       /*
22bd0 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   Store the value
22be0 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
22bf0 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  r */.){.  ExprLi
22c00 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  st *p;.  assert(
22c10 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
22c20 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20  Parse) );.  p = 
22c30 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
22c40 70 72 3b 0a 20 20 69 66 28 20 72 65 67 44 65 73  pr;.  if( regDes
22c50 74 3c 30 20 26 26 20 70 20 29 7b 0a 20 20 20 20  t<0 && p ){.    
22c60 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
22c70 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
22c80 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
22c90 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d  pItem=p->a, i=p-
22ca0 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74  >nExpr; i>0; pIt
22cb0 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20  em++, i--){.    
22cc0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75    if( pItem->reu
22cd0 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33  sable && sqlite3
22ce0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
22cf0 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d  m->pExpr,pExpr,-
22d00 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
22d10 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75   return pItem->u
22d20 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a  .iConstExprReg;.
22d30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22d40 7d 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  }.  pExpr = sqli
22d50 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
22d60 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29  e->db, pExpr, 0)
22d70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45  ;.  p = sqlite3E
22d80 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
22d90 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b  arse, p, pExpr);
22da0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
22db0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
22dc0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
22dd0 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
22de0 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  ;.     pItem->re
22df0 75 73 61 62 6c 65 20 3d 20 72 65 67 44 65 73 74  usable = regDest
22e00 3c 30 3b 0a 20 20 20 20 20 69 66 28 20 72 65 67  <0;.     if( reg
22e10 44 65 73 74 3c 30 20 29 20 72 65 67 44 65 73 74  Dest<0 ) regDest
22e20 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
22e30 6d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75  m;.     pItem->u
22e40 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d  .iConstExprReg =
22e50 20 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a 20 20   regDest;.  }.  
22e60 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
22e70 70 72 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e  pr = p;.  return
22e80 20 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a   regDest;.}../*.
22e90 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
22ea0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
22eb0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73  expression and s
22ec0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
22ed0 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73  .** into a regis
22ee0 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ter.  Return the
22ef0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
22f00 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c   where the resul
22f10 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  ts.** are stored
22f20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
22f30 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d  egister is a tem
22f40 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
22f50 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c  that can be deal
22f60 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e  located,.** then
22f70 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65   write its numbe
22f80 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49  r into *pReg.  I
22f90 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67  f the result reg
22fa0 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20  ister is not.** 
22fb0 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65  a temporary, the
22fc0 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a  n set *pReg to z
22fd0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ero..**.** If pE
22fe0 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  xpr is a constan
22ff0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  t, then this rou
23000 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72  tine might gener
23010 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65  ate this.** code
23020 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67   to fill the reg
23030 69 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69  ister in the ini
23040 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74  tialization sect
23050 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44  ion of the.** VD
23060 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f  BE program, in o
23070 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69  rder to factor i
23080 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61  t out of the eva
23090 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f  luation loop..*/
230a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
230b0 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a  CodeTemp(Parse *
230c0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
230d0 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b  xpr, int *pReg){
230e0 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78  .  int r2;.  pEx
230f0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
23100 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70  SkipCollate(pExp
23110 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46  r);.  if( ConstF
23120 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a  actorOk(pParse).
23130 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21     && pExpr->op!
23140 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20  =TK_REGISTER.   
23150 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
23160 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
23170 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20  pExpr).  ){.    
23180 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20  *pReg  = 0;.    
23190 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
231a0 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
231b0 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20  e, pExpr, -1);. 
231c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
231d0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
231e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
231f0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
23200 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
23210 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
23220 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72  );.    if( r2==r
23230 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67  1 ){.      *pReg
23240 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = r1;.    }else
23250 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
23260 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
23270 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
23280 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20   *pReg = 0;.    
23290 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
232a0 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  2;.}../*.** Gene
232b0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
232c0 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
232d0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
232e0 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
232f0 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
23300 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
23310 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
23320 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
23330 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
23340 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  target..*/.void 
23350 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
23360 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
23370 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
23380 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69  target){.  int i
23390 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nReg;..  assert(
233a0 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
233b0 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
233c0 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  m );.  if( pExpr
233d0 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   && pExpr->op==T
233e0 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
233f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23400 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
23410 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70  e, OP_Copy, pExp
23420 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
23430 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
23440 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
23450 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
23460 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
23470 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72  rget);.    asser
23480 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
23490 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
234a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
234b0 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67  );.    if( inReg
234c0 21 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72  !=target && pPar
234d0 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
234e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
234f0 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
23500 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  be, OP_SCopy, in
23510 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
23520 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
23530 20 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e   Make a transien
23540 74 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73  t copy of expres
23550 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74  sion pExpr and t
23560 68 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e  hen code it usin
23570 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72  g.** sqlite3Expr
23580 43 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f  Code().  This ro
23590 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74  utine works just
235a0 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   like sqlite3Exp
235b0 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70  rCode().** excep
235c0 74 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74  t that the input
235d0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67   expression is g
235e0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
235f0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f  unchanged..*/.vo
23600 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
23610 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50  deCopy(Parse *pP
23620 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
23630 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
23640 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
23650 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45  pParse->db;.  pE
23660 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
23670 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
23680 30 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  0);.  if( !db->m
23690 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71  allocFailed ) sq
236a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
236b0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
236c0 67 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  get);.  sqlite3E
236d0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
236e0 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  xpr);.}../*.** G
236f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
23700 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
23710 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
23720 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
23730 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
23740 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
23750 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
23760 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
23770 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
23780 65 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74  er target.  If t
23790 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
237a0 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
237b0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
237c0 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20  might choose to 
237d0 63 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73  code the express
237e0 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a  ion at initializ
237f0 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76  ation time..*/.v
23800 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
23810 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61  odeFactorable(Pa
23820 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
23830 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
23840 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61  rget){.  if( pPa
23850 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
23860 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  or && sqlite3Exp
23870 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70  rIsConstant(pExp
23880 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
23890 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
238a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
238b0 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  arget);.  }else{
238c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
238d0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
238e0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  pr, target);.  }
238f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
23900 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61  te code that eva
23910 6c 75 61 74 65 73 20 74 68 65 20 67 69 76 65 6e  luates the given
23920 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
23930 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a  puts the result.
23940 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
23950 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  arget..**.** Als
23960 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  o make a copy of
23970 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
23980 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f  results into ano
23990 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67  ther "cache" reg
239a0 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64  ister.** and mod
239b0 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69  ify the expressi
239c0 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  on so that the n
239d0 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  ext time it is e
239e0 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65  valuated,.** the
239f0 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70   result is a cop
23a00 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72  y of the cache r
23a10 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  egister..**.** T
23a20 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
23a30 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69  sed for expressi
23a40 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65  ons that are use
23a50 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
23a60 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20  imes.  They are 
23a70 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61  evaluated once a
23a80 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  nd the results o
23a90 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
23aa0 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a  .** are reused..
23ab0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
23ac0 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28  xprCodeAndCache(
23ad0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
23ae0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
23af0 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
23b00 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
23b10 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a  be;.  int iMem;.
23b20 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
23b30 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
23b40 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
23b50 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c  EGISTER );.  sql
23b60 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
23b70 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
23b80 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b  et);.  iMem = ++
23b90 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
23ba0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23bb0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61  2(v, OP_Copy, ta
23bc0 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65  rget, iMem);.  e
23bd0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45  xprToRegister(pE
23be0 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f  xpr, iMem);.}../
23bf0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
23c00 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74  de that pushes t
23c10 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72  he value of ever
23c20 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  y element of the
23c30 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
23c40 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61  sion list into a
23c50 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
23c60 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  isters beginning
23c70 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a   at target..**.*
23c80 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
23c90 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
23ca0 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  evaluated..**.**
23cb0 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c   The SQLITE_ECEL
23cc0 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e  _DUP flag preven
23cd0 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  ts the arguments
23ce0 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66   from being.** f
23cf0 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53  illed using OP_S
23d00 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d  Copy.  OP_Copy m
23d10 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  ust be used inst
23d20 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ead..**.** The S
23d30 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
23d40 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77  R argument allow
23d50 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  s constant argum
23d60 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61  ents to be.** fa
23d70 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20  ctored out into 
23d80 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63  initialization c
23d90 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ode..**.** The S
23da0 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 66  QLITE_ECEL_REF f
23db0 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 65  lag means that e
23dc0 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
23dd0 65 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 45  e list with.** E
23de0 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e  xprList.a[].u.x.
23df0 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 68 61  iOrderByCol>0 ha
23e00 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
23e10 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 73 74  evaluated and st
23e20 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73  ored.** in regis
23e30 74 65 72 73 20 61 74 20 73 72 63 52 65 67 2c 20  ters at srcReg, 
23e40 61 6e 64 20 73 6f 20 74 68 65 20 76 61 6c 75 65  and so the value
23e50 20 63 61 6e 20 62 65 20 63 6f 70 69 65 64 20 66   can be copied f
23e60 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f 0a 69 6e  rom there..*/.in
23e70 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
23e80 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  eExprList(.  Par
23e90 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
23ea0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
23eb0 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
23ec0 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68   *pList,   /* Th
23ed0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
23ee0 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  t to be coded */
23ef0 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20  .  int target,  
23f00 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
23f10 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20  o write results 
23f20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67 2c  */.  int srcReg,
23f30 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
23f40 65 20 72 65 67 69 73 74 65 72 73 20 69 66 20 53  e registers if S
23f50 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a  QLITE_ECEL_REF *
23f60 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20 20  /.  u8 flags    
23f70 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
23f80 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f  _ECEL_* flags */
23f90 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
23fa0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
23fb0 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  m;.  int i, j, n
23fc0 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20  ;.  u8 copyOp = 
23fd0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
23fe0 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43  ECEL_DUP) ? OP_C
23ff0 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a  opy : OP_SCopy;.
24000 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
24010 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
24020 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
24030 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
24040 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
24050 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d   pParse->pVdbe!=
24060 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67  0 );  /* Never g
24070 65 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68  ets this far oth
24080 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20  erwise */.  n = 
24090 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
240a0 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72  if( !ConstFactor
240b0 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c 61  Ok(pParse) ) fla
240c0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43  gs &= ~SQLITE_EC
240d0 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72  EL_FACTOR;.  for
240e0 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
240f0 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20   i=0; i<n; i++, 
24100 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pItem++){.    Ex
24110 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65  pr *pExpr = pIte
24120 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  m->pExpr;.    if
24130 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( (flags & SQLIT
24140 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30 20 26  E_ECEL_REF)!=0 &
24150 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e 75 2e  & (j = pItem->u.
24160 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30  x.iOrderByCol)>0
24170 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c   ){.      if( fl
24180 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
24190 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20 20 20  L_OMITREF ){.   
241a0 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20       i--;.      
241b0 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c    n--;.      }el
241c0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
241d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
241e0 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65   copyOp, j+srcRe
241f0 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  g-1, target+i);.
24200 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
24210 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53  e if( (flags & S
24220 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
24230 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  R)!=0 && sqlite3
24240 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
24250 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73  Expr) ){.      s
24260 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
24270 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
24280 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  pr, target+i);. 
24290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
242a0 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  int inReg = sqli
242b0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
242c0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
242d0 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
242e0 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
242f0 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20  get+i ){.       
24300 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
24310 20 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f 70        if( copyOp
24320 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20  ==OP_Copy.      
24330 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69 74     && (pOp=sqlit
24340 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d  e3VdbeGetOp(v, -
24350 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  1))->opcode==OP_
24360 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26  Copy.         &&
24370 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33   pOp->p1+pOp->p3
24380 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20 20  +1==inReg.      
24390 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f     && pOp->p2+pO
243a0 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b  p->p3+1==target+
243b0 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  i.        ){.   
243c0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b         pOp->p3++
243d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
243e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
243f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
24400 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74  copyOp, inReg, t
24410 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
24420 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24430 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
24440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
24450 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42  ate code for a B
24460 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e  ETWEEN operator.
24470 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57  .**.**    x BETW
24480 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a  EEN y AND z.**.*
24490 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 65  * The above is e
244a0 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a  quivalent to .**
244b0 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20  .**    x>=y AND 
244c0 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20  x<=z.**.** Code 
244d0 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69  it as such, taki
244e0 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68  ng care to do th
244f0 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72  e common subexpr
24500 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e  ession.** elimin
24510 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a  ation of x..**.*
24520 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20 70 61  * The xJumpIf pa
24530 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
24540 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a  es details:.**.*
24550 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20 20  *    NULL:      
24560 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f               Sto
24570 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  re the boolean r
24580 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64 65 73  esult in reg[des
24590 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  t].**    sqlite3
245a0 45 78 70 72 49 66 54 72 75 65 3a 20 20 20 20 20  ExprIfTrue:     
245b0 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66   Jump to dest if
245c0 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c 69   true.**    sqli
245d0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 3a 20  te3ExprIfFalse: 
245e0 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74      Jump to dest
245f0 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20   if false.**.** 
24600 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 70  The jumpIfNull p
24610 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
24620 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66 20 69  red if xJumpIf i
24630 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  s NULL..*/.stati
24640 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42  c void exprCodeB
24650 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20  etween(.  Parse 
24660 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
24670 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
24680 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
24690 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
246a0 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
246b0 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73   BETWEEN express
246c0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
246d0 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
246e0 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f  mp destination o
246f0 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61 74 69  r storage locati
24700 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  on */.  void (*x
24710 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45 78 70  Jump)(Parse*,Exp
24720 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20  r*,int,int), /* 
24730 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 2a  Action to take *
24740 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  /.  int jumpIfNu
24750 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68  ll    /* Take th
24760 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45  e jump if the BE
24770 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f  TWEEN is NULL */
24780 0a 29 7b 0a 20 45 78 70 72 20 65 78 70 72 41 6e  .){. Expr exprAn
24790 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e  d;     /* The AN
247a0 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78  D operator in  x
247b0 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f  >=y AND x<=z  */
247c0 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74  .  Expr compLeft
247d0 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d  ;    /* The  x>=
247e0 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70  y  term */.  Exp
247f0 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f  r compRight;   /
24800 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72  * The  x<=z  ter
24810 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72  m */.  Expr expr
24820 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  X;       /* The 
24830 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69 6f   x  subexpressio
24840 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  n */.  int regFr
24850 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70  ee1 = 0; /* Temp
24860 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
24870 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73 65 74  er */...  memset
24880 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20 73  (&compLeft, 0, s
24890 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
248a0 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67 68  memset(&compRigh
248b0 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  t, 0, sizeof(Exp
248c0 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65  r));.  memset(&e
248d0 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65 6f  xprAnd, 0, sizeo
248e0 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73 73  f(Expr));..  ass
248f0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
24900 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
24910 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
24920 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e  exprX = *pExpr->
24930 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
24940 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
24950 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20  exprAnd.pLeft = 
24960 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70  &compLeft;.  exp
24970 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63  rAnd.pRight = &c
24980 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70  ompRight;.  comp
24990 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b  Left.op = TK_GE;
249a0 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66  .  compLeft.pLef
249b0 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
249c0 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20  mpLeft.pRight = 
249d0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
249e0 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f  a[0].pExpr;.  co
249f0 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f  mpRight.op = TK_
24a00 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  LE;.  compRight.
24a10 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
24a20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
24a30 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
24a40 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
24a50 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65  .  exprToRegiste
24a60 72 28 26 65 78 70 72 58 2c 20 65 78 70 72 43 6f  r(&exprX, exprCo
24a70 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c  deVector(pParse,
24a80 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65   &exprX, &regFre
24a90 65 31 29 29 3b 0a 20 20 69 66 28 20 78 4a 75 6d  e1));.  if( xJum
24aa0 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70 28 70  p ){.    xJump(p
24ab0 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
24ac0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
24ad0 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
24ae0 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 65 78 70   /* Mark the exp
24af0 72 65 73 73 69 6f 6e 20 69 73 20 62 65 69 6e 67  ression is being
24b00 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20   from the ON or 
24b10 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
24b20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a 20 73 6f  a join.    ** so
24b30 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
24b40 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
24b50 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e  ) routine will n
24b60 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 6f  ot attempt to mo
24b70 76 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74  ve.    ** it int
24b80 6f 20 74 68 65 20 50 61 72 73 65 2e 70 43 6f 6e  o the Parse.pCon
24b90 73 74 45 78 70 72 20 6c 69 73 74 2e 20 20 57 65  stExpr list.  We
24ba0 20 73 68 6f 75 6c 64 20 75 73 65 20 61 20 6e 65   should use a ne
24bb0 77 20 62 69 74 20 66 6f 72 20 74 68 69 73 2c 0a  w bit for this,.
24bc0 20 20 20 20 2a 2a 20 66 6f 72 20 63 6c 61 72 69      ** for clari
24bd0 74 79 2c 20 62 75 74 20 77 65 20 61 72 65 20 6f  ty, but we are o
24be0 75 74 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  ut of bits in th
24bf0 65 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65  e Expr.flags fie
24c00 6c 64 20 73 6f 20 77 65 0a 20 20 20 20 2a 2a 20  ld so we.    ** 
24c10 68 61 76 65 20 74 6f 20 72 65 75 73 65 20 74 68  have to reuse th
24c20 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69  e EP_FromJoin bi
24c30 74 2e 20 20 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20  t.  Bummer. */. 
24c40 20 20 20 65 78 70 72 58 2e 66 6c 61 67 73 20 7c     exprX.flags |
24c50 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20  = EP_FromJoin;. 
24c60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
24c70 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
24c80 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 29   &exprAnd, dest)
24c90 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  ;.  }.  sqlite3R
24ca0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
24cb0 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
24cc0 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64  ..  /* Ensure ad
24cd0 65 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65  equate test cove
24ce0 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61  rage */.  testca
24cf0 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
24d00 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26  e3ExprIfTrue  &&
24d10 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
24d20 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
24d30 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
24d40 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
24d50 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66  fTrue  && jumpIf
24d60 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
24d70 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
24d80 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
24d90 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
24da0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
24db0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
24dc0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
24dd0 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
24de0 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
24df0 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
24e00 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
24e10 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
24e20 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
24e30 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
24e40 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
24e50 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
24e60 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
24e70 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75  xprIfFalse && ju
24e80 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
24e90 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
24ea0 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
24eb0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
24ec0 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
24ed0 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
24ee0 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
24ef0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
24f00 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
24f10 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
24f20 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
24f30 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
24f40 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p==0 );.}../*.**
24f50 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
24f60 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
24f70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
24f80 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
24f90 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
24fa0 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
24fb0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
24fc0 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
24fd0 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
24fe0 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
24ff0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
25000 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  false..**.** If 
25010 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
25020 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
25030 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
25040 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a  or false), then.
25050 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
25060 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75   if the jumpIfNu
25070 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54  ll flag is SQLIT
25080 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a  E_JUMPIFNULL..**
25090 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65  .** This code de
250a0 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
250b0 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74  t that certain t
250c0 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a  oken values (ex:
250d0 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74   TK_EQ).** are t
250e0 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64  he same as opcod
250f0 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50  e values (ex: OP
25100 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d  _Eq) that implem
25110 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ent the correspo
25120 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  nding.** operati
25130 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d  on.  Special com
25140 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20  ments in vdbe.c 
25150 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65  and the mkopcode
25160 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a  h.awk script in.
25170 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63  ** the make proc
25180 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20  ess cause these 
25190 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e  values to align.
251a0 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74    Assert()s in t
251b0 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77  he code.** below
251c0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
251d0 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69   numbers are ali
251e0 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  gned correctly..
251f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
25200 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20  xprIfTrue(Parse 
25210 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
25220 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
25230 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
25240 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
25250 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
25260 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
25270 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
25280 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
25290 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
252a0 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
252b0 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
252c0 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
252d0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
252e0 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
252f0 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a       return;  /*
25300 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44   Existence of VD
25310 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
25320 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ller */.  if( NE
25330 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20  VER(pExpr==0) ) 
25340 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77  return;  /* No w
25350 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ay this can happ
25360 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78  en */.  op = pEx
25370 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68  pr->op;.  switch
25380 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
25390 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
253a0 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
253b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
253c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
253d0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
253e0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
253f0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
25400 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
25410 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c  t, d2,jumpIfNull
25420 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  ^SQLITE_JUMPIFNU
25430 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
25440 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
25450 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
25460 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
25470 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
25480 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
25490 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
254a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
254b0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
254c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
254d0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
254e0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
254f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
25500 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74  TK_OR: {.      t
25510 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
25520 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
25530 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
25540 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
25550 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
25560 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
25570 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
25580 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
25590 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
255a0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
255b0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
255c0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
255d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
255e0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
255f0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
25600 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
25610 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
25620 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
25630 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
25640 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
25650 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
25660 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
25670 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
25680 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
25690 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
256a0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
256b0 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  T:.      testcas
256c0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  e( op==TK_IS );.
256d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
256e0 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
256f0 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
25700 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
25710 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75   TK_NE;.      ju
25720 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54  mpIfNull = SQLIT
25730 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
25740 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
25750 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
25760 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
25770 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
25780 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
25790 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
257a0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
257b0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
257c0 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
257d0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20  pExpr->pLeft) ) 
257e0 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70  goto default_exp
257f0 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  r;.      testcas
25800 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
25810 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
25820 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
25830 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
25840 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
25850 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
25860 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
25870 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
25880 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
25890 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
258a0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
258b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
258c0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
258d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
258e0 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
258f0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
25900 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
25910 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
25920 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
25930 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
25940 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
25950 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
25960 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
25970 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
25980 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
25990 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
259a0 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
259b0 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
259c0 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
259d0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
259e0 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Gt);.      a
259f0 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
25a00 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
25a10 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
25a20 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
25a30 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Ge);.      ass
25a40 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
25a50 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
25a60 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64  OP_Eq);.      Vd
25a70 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
25a80 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
25a90 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
25aa0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
25ab0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
25ac0 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
25ad0 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
25ae0 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
25af0 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50  assert(TK_NE==OP
25b00 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ne); testcase(o
25b10 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
25b20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
25b30 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
25b40 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
25b50 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
25b60 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
25b70 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
25b80 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
25b90 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
25ba0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
25bb0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
25bc0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
25bd0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
25be0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
25bf0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
25c00 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
25c10 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61  TNULL: {.      a
25c20 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
25c30 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20  ==OP_IsNull );  
25c40 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
25c50 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
25c60 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
25c70 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
25c80 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70   ); testcase( op
25c90 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
25ca0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
25cb0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
25cc0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
25cd0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
25ce0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
25cf0 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
25d00 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
25d10 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
25d20 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
25d30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
25d40 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
25d50 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
25d60 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
25d70 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
25d80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
25d90 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
25da0 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
25db0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
25dc0 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
25dd0 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
25de0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
25df0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
25e00 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  ue, jumpIfNull);
25e10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
25e20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
25e30 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
25e40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
25e50 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
25e60 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
25e70 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
25e80 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
25e90 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49  stIfNull = jumpI
25ea0 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64  fNull ? dest : d
25eb0 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20  estIfFalse;.    
25ec0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
25ed0 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
25ee0 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  r, destIfFalse, 
25ef0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
25f00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
25f10 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20  to(v, dest);.   
25f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
25f30 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
25f40 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
25f50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
25f60 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
25f70 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74  t: {.    default
25f80 5f 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28  _expr:.      if(
25f90 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   exprAlwaysTrue(
25fa0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
25fb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
25fc0 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
25fd0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
25fe0 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70  AlwaysFalse(pExp
25ff0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
26000 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   No-op */.      
26010 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
26020 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
26030 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
26040 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
26050 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
26060 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
26070 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c  OP_If, r1, dest,
26080 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
26090 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
260a0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
260b0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
260c0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
260d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
260e0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
260f0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
26100 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
26110 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
26120 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
26130 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
26140 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
26150 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
26160 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  );  .}../*.** Ge
26170 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
26180 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
26190 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
261a0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
261b0 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
261c0 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
261d0 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
261e0 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
261f0 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
26200 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
26210 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
26220 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
26230 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
26240 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
26250 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
26260 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
26270 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
26280 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  l is SQLITE_JUMP
26290 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74  IFNULL or fall t
262a0 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
262b0 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f  Null.** is 0..*/
262c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
262d0 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
262e0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
262f0 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
26300 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
26310 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
26320 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
26330 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
26340 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
26350 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
26360 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
26370 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
26380 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
26390 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
263a0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
263b0 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
263c0 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74  return; /* Exist
263d0 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ence of VDBE che
263e0 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
263f0 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  /.  if( pExpr==0
26400 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20   )    return;.. 
26410 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
26420 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
26430 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
26440 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
26450 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
26460 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
26470 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
26480 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
26490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
264a0 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
264b0 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
264c0 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
264d0 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
264e0 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
264f0 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
26500 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
26510 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
26520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
26530 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
26540 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
26550 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
26560 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
26570 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
26580 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
26590 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
265a0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
265b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
265c0 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
265d0 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
265e0 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
265f0 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
26600 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
26610 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
26620 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
26630 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
26640 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
26650 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
26660 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
26670 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
26680 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
26690 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
266a0 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
266b0 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
266c0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
266d0 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
266e0 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
266f0 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
26700 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
26710 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
26720 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
26730 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
26740 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
26750 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
26760 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
26770 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
26780 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
26790 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
267a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
267b0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
267c0 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
267d0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
267e0 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
267f0 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
26800 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
26810 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
26820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
26830 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
26840 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
26850 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
26860 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
26870 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
26880 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
26890 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
268a0 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
268b0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
268c0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
268d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
268e0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
268f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
26900 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
26910 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
26920 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
26930 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26940 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
26950 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
26960 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
26970 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
26980 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
26990 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
269a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
269b0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
269c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
269d0 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
269e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
269f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
26a00 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
26a10 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
26a20 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
26a30 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
26a40 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
26a50 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d  ->pLeft, d2, jum
26a60 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
26a70 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
26a80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
26a90 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
26aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26ab0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
26ac0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
26ad0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
26ae0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26af0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
26b00 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
26b10 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
26b20 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
26b30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26b40 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
26b50 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
26b60 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26b70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26b80 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
26b90 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
26ba0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
26bb0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
26bc0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
26bd0 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
26be0 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20  TK_ISNOT:.      
26bf0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
26c00 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
26c10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
26c20 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
26c30 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  T );.      op = 
26c40 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
26c50 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f  S) ? TK_NE : TK_
26c60 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66  EQ;.      jumpIf
26c70 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55  Null = SQLITE_NU
26c80 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46  LLEQ;.      /* F
26c90 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20  all thru */.    
26ca0 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
26cb0 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
26cc0 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
26cd0 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
26ce0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
26cf0 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
26d00 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
26d10 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70  xprIsVector(pExp
26d20 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f  r->pLeft) ) goto
26d30 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20   default_expr;. 
26d40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
26d50 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26d60 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
26d70 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
26d80 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
26d90 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
26da0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
26db0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
26dc0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
26dd0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
26de0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
26df0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
26e00 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
26e10 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
26e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e30 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
26e40 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
26e50 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
26e60 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
26e70 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
26e80 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
26e90 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
26ea0 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
26eb0 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
26ec0 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
26ed0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
26ee0 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
26ef0 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
26f00 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
26f10 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
26f20 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
26f30 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
26f40 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
26f50 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
26f60 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
26f70 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
26f80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26f90 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
26fa0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
26fb0 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  q);.      VdbeCo
26fc0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
26fd0 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
26fe0 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull!=SQLITE_NULL
26ff0 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
27000 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
27010 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
27020 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null==SQLITE_NUL
27030 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LEQ);.      asse
27040 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
27050 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
27060 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Ne);.      Vdb
27070 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
27080 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
27090 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
270a0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
270b0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
270c0 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
270d0 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
270e0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74  NULLEQ);.      t
270f0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
27100 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
27110 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
27120 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
27130 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
27140 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
27150 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
27160 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  L: {.      r1 = 
27170 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
27180 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
27190 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
271a0 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
271b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
271c0 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
271d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
271e0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
271f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
27200 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  f(v, op==TK_ISNU
27210 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  LL);.      testc
27220 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
27230 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65  ULL );  VdbeCove
27240 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
27250 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
27260 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
27270 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
27280 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
27290 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
272a0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
272b0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
272c0 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
272d0 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
272e0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
272f0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
27300 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  se, jumpIfNull);
27310 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27320 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
27330 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
27340 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
27350 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d   {.      if( jum
27360 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  pIfNull ){.     
27370 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
27380 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
27390 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b  pr, dest, dest);
273a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
273b0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
273c0 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
273d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
273e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
273f0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
27400 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
27410 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
27420 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
27430 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
27440 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
27450 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
27460 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
27470 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
27480 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a   default_expr: .
27490 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c        if( exprAl
274a0 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29  waysFalse(pExpr)
274b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
274c0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
274d0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
274e0 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73  e if( exprAlways
274f0 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
27500 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20         /* no-op 
27510 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
27520 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
27530 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
27540 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
27550 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
27560 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27570 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
27580 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  t, r1, dest, jum
27590 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
275a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
275b0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e(v);.        te
275c0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
275d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
275e0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
275f0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
27600 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
27610 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
27620 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
27630 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
27640 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
27650 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
27660 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d  se, regFree2);.}
27670 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c  ../*.** Like sql
27680 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
27690 29 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20  ) except that a 
276a0 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
276b0 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20  pExpr before.** 
276c0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c  code generation,
276d0 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69   and that copy i
276e0 73 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20  s deleted after 
276f0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e  code generation.
27700 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73   This.** ensures
27710 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
27720 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68  al pExpr is unch
27730 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  anged..*/.void s
27740 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
27750 65 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  eDup(Parse *pPar
27760 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
27770 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75   int dest,int ju
27780 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c  mpIfNull){.  sql
27790 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
277a0 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
277b0 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78  Copy = sqlite3Ex
277c0 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c  prDup(db, pExpr,
277d0 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
277e0 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
277f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
27800 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
27810 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75   pCopy, dest, ju
27820 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  mpIfNull);.  }. 
27830 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
27840 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d  te(db, pCopy);.}
27850 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  .../*.** Do a de
27860 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
27870 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
27880 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30  trees.  Return 0
27890 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
278a0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63  xpressions are c
278b0 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69  ompletely identi
278c0 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69  cal.  Return 1 i
278d0 66 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e  f they differ on
278e0 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41  ly.** by a COLLA
278f0 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74  TE operator at t
27900 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52  he top level.  R
27910 65 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65  eturn 2 if there
27920 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73   are differences
27930 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74  .** other than t
27940 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c  he top-level COL
27950 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LATE operator..*
27960 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
27970 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
27980 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
27990 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
279a0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
279b0 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
279c0 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
279d0 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
279e0 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
279f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69  .**.** The pA si
27a00 64 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e  de might be usin
27a10 67 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20  g TK_REGISTER.  
27a20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
27a30 61 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a  ase and pB is.**
27a40 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45   not using TK_RE
27a50 47 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74  GISTER but is ot
27a60 68 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65  herwise equivale
27a70 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72  nt, then still r
27a80 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53  eturn 0..**.** S
27a90 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f  ometimes this ro
27aa0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
27ab0 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20  n 2 even if the 
27ac0 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  two expressions.
27ad0 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71  ** really are eq
27ae0 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65  uivalent.  If we
27af0 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68   cannot prove th
27b00 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
27b10 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69  ns are.** identi
27b20 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32  cal, we return 2
27b30 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
27b40 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  .  So if this ro
27b50 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
27b60 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20   2, then you do 
27b70 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20  not really know 
27b80 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74  for certain if t
27b90 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
27ba0 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
27bb0 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20  me.  But if you 
27bc0 67 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74  get a 0 or 1 ret
27bd0 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a  urn, then you.**
27be0 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65   can be sure the
27bf0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
27c00 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74   the same.  In t
27c10 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a  he places where.
27c20 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
27c30 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73  is used, it does
27c40 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74   not hurt to get
27c50 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68   an extra 2 - th
27c60 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74  at.** just might
27c70 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20   result in some 
27c80 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20  slightly slower 
27c90 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72  code.  But retur
27ca0 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72  ning.** an incor
27cb0 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c  rect 0 or 1 coul
27cc0 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66  d lead to a malf
27cd0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
27ce0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
27cf0 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  re(Expr *pA, Exp
27d00 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29  r *pB, int iTab)
27d10 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64  {.  u32 combined
27d20 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d  Flags;.  if( pA=
27d30 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20  =0 || pB==0 ){. 
27d40 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41     return pB==pA
27d50 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20   ? 0 : 2;.  }.  
27d60 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20  combinedFlags = 
27d70 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e  pA->flags | pB->
27d80 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d  flags;.  if( com
27d90 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
27da0 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
27db0 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70  if( (pA->flags&p
27dc0 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56  B->flags&EP_IntV
27dd0 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e  alue)!=0 && pA->
27de0 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e  u.iValue==pB->u.
27df0 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  iValue ){.      
27e00 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
27e10 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
27e20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
27e30 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66  pB->op ){.    if
27e40 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pA->op==TK_COL
27e50 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
27e60 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
27e70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61 62 29 3c  Left, pB, iTab)<
27e80 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
27e90 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
27ea0 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pB->op==TK_CO
27eb0 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
27ec0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2c 20  ExprCompare(pA, 
27ed0 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  pB->pLeft, iTab)
27ee0 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <2 ){.      retu
27ef0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
27f00 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
27f10 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43  if( pA->op!=TK_C
27f20 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21  OLUMN && pA->op!
27f30 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26  =TK_AGG_COLUMN &
27f40 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  & pA->u.zToken )
27f50 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  {.    if( pA->op
27f60 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  ==TK_FUNCTION ){
27f70 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
27f80 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e  e3StrICmp(pA->u.
27f90 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f  zToken,pB->u.zTo
27fa0 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ken)!=0 ) return
27fb0 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   2;.    }else if
27fc0 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a  ( strcmp(pA->u.z
27fd0 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
27fe0 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  en)!=0 ){.      
27ff0 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54  return pA->op==T
28000 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20  K_COLLATE ? 1 : 
28010 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
28020 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
28030 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
28040 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
28050 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
28060 20 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   2;.  if( ALWAYS
28070 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ((combinedFlags 
28080 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d  & EP_TokenOnly)=
28090 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63  =0) ){.    if( c
280a0 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
280b0 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65  P_xIsSelect ) re
280c0 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
280d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
280e0 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
280f0 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29  ->pLeft, iTab) )
28100 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
28110 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
28120 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74  mpare(pA->pRight
28130 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54  , pB->pRight, iT
28140 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
28150 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
28160 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
28170 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e  A->x.pList, pB->
28180 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29  x.pList, iTab) )
28190 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
281a0 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69  f( ALWAYS((combi
281b0 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65  nedFlags & EP_Re
281c0 64 75 63 65 64 29 3d 3d 30 29 20 26 26 20 70 41  duced)==0) && pA
281d0 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op!=TK_STRING 
281e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  ){.      if( pA-
281f0 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43  >iColumn!=pB->iC
28200 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32  olumn ) return 2
28210 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  ;.      if( pA->
28220 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62  iTable!=pB->iTab
28230 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70  le .       && (p
28240 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  A->iTable!=iTab 
28250 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61  || NEVER(pB->iTa
28260 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72  ble>=0)) ) retur
28270 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 2;.    }.  }. 
28280 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
28290 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
282a0 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
282b0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
282c0 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
282d0 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65  l and .** non-ze
282e0 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65  ro if they diffe
282f0 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a  r in any way..**
28300 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
28310 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
28320 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
28330 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
28340 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
28350 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
28360 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
28370 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
28380 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
28390 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
283a0 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  ne might return 
283b0 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75  non-zero for equ
283c0 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74  ivalent ExprList
283d0 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20  s.  The.** only 
283e0 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c  consequence will
283f0 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74   be disabled opt
28400 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74  imizations.  But
28410 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
28420 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75   must never retu
28430 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20  rn 0 if the two 
28440 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
28450 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20   are different, 
28460 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74  or.** a malfunct
28470 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e  ion will result.
28480 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
28490 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e  pointers are con
284a0 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68  sidered to be th
284b0 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e  e same.  But a N
284c0 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61  ULL pointer.** a
284d0 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72  lways differs fr
284e0 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f  om a non-NULL po
284f0 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
28500 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
28510 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70  pare(ExprList *p
28520 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c  A, ExprList *pB,
28530 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e   int iTab){.  in
28540 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  t i;.  if( pA==0
28550 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75   && pB==0 ) retu
28560 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d  rn 0;.  if( pA==
28570 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74  0 || pB==0 ) ret
28580 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d  urn 1;.  if( pA-
28590 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70  >nExpr!=pB->nExp
285a0 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
285b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e  for(i=0; i<pA->n
285c0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
285d0 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70  Expr *pExprA = p
285e0 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  A->a[i].pExpr;. 
285f0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20     Expr *pExprB 
28600 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pB->a[i].pExpr
28610 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b  ;.    if( pA->a[
28620 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42  i].sortOrder!=pB
28630 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
28640 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
28650 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
28660 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20  Compare(pExprA, 
28670 70 45 78 70 72 42 2c 20 69 54 61 62 29 20 29 20  pExprB, iTab) ) 
28680 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
28690 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
286a0 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45  ** Like sqlite3E
286b0 78 70 72 43 6f 6d 70 61 72 65 28 29 20 65 78 63  xprCompare() exc
286c0 65 70 74 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  ept COLLATE oper
286d0 61 74 6f 72 73 20 61 74 20 74 68 65 20 74 6f 70  ators at the top
286e0 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67  -level.** are ig
286f0 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nored..*/.int sq
28700 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
28710 53 6b 69 70 28 45 78 70 72 20 2a 70 41 2c 20 45  Skip(Expr *pA, E
28720 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61  xpr *pB, int iTa
28730 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  b){.  return sql
28740 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
28750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
28760 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
28770 6c 61 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20  late(pA),.      
28780 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
28790 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42  prSkipCollate(pB
287a0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
287b0 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iTab);.}../*.** 
287c0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77  Return true if w
287d0 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20  e can prove the 
287e0 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  pE2 will always 
287f0 62 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69  be true if pE1 i
28800 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75  s.** true.  Retu
28810 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63  rn false if we c
28820 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74  annot complete t
28830 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70  he proof or if p
28840 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66  E2 might.** be f
28850 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a  alse.  Examples:
28860 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  .**.**     pE1: 
28870 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20  x==5       pE2: 
28880 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
28890 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
288a0 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20       pE1: x>0   
288b0 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20       pE2: x==5  
288c0 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c             Resul
288d0 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
288e0 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20  pE1: x=21       
288f0 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34  pE2: x=21 OR y=4
28900 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  3     Result: tr
28910 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
28920 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78  !=123     pE2: x
28930 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
28940 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
28950 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20      pE1: x!=?1  
28960 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
28970 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
28980 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
28990 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45  1: x IS NULL  pE
289a0 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
289b0 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73      Result: fals
289c0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20  e.**     pE1: x 
289d0 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20  IS ?2    pE2: x 
289e0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
289f0 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a  euslt: false.**.
28a00 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e  ** When comparin
28a10 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  g TK_COLUMN node
28a20 73 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e  s between pE1 an
28a30 64 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61  d pE2, if pE2 ha
28a40 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65  s.** Expr.iTable
28a50 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61  <0 then assume a
28a60 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69   table number gi
28a70 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a  ven by iTab..**.
28a80 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  ** When in doubt
28a90 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20  , return false. 
28aa0 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20   Returning true 
28ab0 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72  might give a per
28ac0 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72  formance.** impr
28ad0 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  ovement.  Return
28ae0 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20  ing false might 
28af0 63 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61  cause a performa
28b00 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62  nce reduction, b
28b10 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c  ut.** it will al
28b20 77 61 79 73 20 67 69 76 65 20 74 68 65 20 63 6f  ways give the co
28b30 72 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64  rrect answer and
28b40 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73   is hence always
28b50 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   safe..*/.int sq
28b60 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
28b70 45 78 70 72 28 45 78 70 72 20 2a 70 45 31 2c 20  Expr(Expr *pE1, 
28b80 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69  Expr *pE2, int i
28b90 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  Tab){.  if( sqli
28ba0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
28bb0 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d  E1, pE2, iTab)==
28bc0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
28bd0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32  1;.  }.  if( pE2
28be0 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26  ->op==TK_OR.   &
28bf0 26 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d  & (sqlite3ExprIm
28c00 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70  pliesExpr(pE1, p
28c10 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  E2->pLeft, iTab)
28c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
28c30 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
28c40 69 65 73 45 78 70 72 28 70 45 31 2c 20 70 45 32  iesExpr(pE1, pE2
28c50 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
28c60 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
28c70 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
28c80 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  E2->op==TK_NOTNU
28c90 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54  LL && pE1->op!=T
28ca0 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d  K_ISNULL && pE1-
28cb0 3e 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20  >op!=TK_IS ){.  
28cc0 20 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c    Expr *pX = sql
28cd0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
28ce0 61 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b  ate(pE1->pLeft);
28cf0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
28d00 58 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b  X!=pE1->pLeft );
28d10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
28d20 45 78 70 72 43 6f 6d 70 61 72 65 28 70 58 2c 20  ExprCompare(pX, 
28d30 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
28d40 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
28d50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
28d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
28d70 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
28d80 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
28d90 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
28da0 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74  tree walker.** t
28db0 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  o determine if a
28dc0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  n expression can
28dd0 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 62 79   be evaluated by
28de0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
28df0 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c  e.** index only,
28e00 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
28e10 74 6f 20 64 6f 20 61 20 73 65 61 72 63 68 20 66  to do a search f
28e20 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  or the correspon
28e30 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e  ding.** table en
28e40 74 72 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76  try.  The IdxCov
28e50 65 72 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73  er.pIdx field is
28e60 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78   the index.  Idx
28e70 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73  Cover.iCur.** is
28e80 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
28e90 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
28ea0 72 75 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a  ruct IdxCover {.
28eb0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
28ec0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
28ed0 74 6f 20 62 65 20 74 65 73 74 65 64 20 66 6f 72  to be tested for
28ee0 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69   coverage */.  i
28ef0 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
28f00 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
28f10 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63   for the table c
28f20 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
28f30 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a  the index */.};.
28f40 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
28f50 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
28f60 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
28f70 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
28f80 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  .** pWalker->u.p
28f90 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63  IdxCover->iCur c
28fa0 61 6e 20 62 65 20 73 61 74 69 73 66 69 65 64 20  an be satisfied 
28fb0 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a  using the index.
28fc0 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  ** pWalker->u.pI
28fd0 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a  dxCover->pIdx..*
28fe0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
28ff0 72 49 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72  rIdxCover(Walker
29000 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
29010 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70  *pExpr){.  if( p
29020 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
29030 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d  UMN.   && pExpr-
29040 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72  >iTable==pWalker
29050 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69  ->u.pIdxCover->i
29060 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65  Cur.   && sqlite
29070 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70  3ColumnOfIndex(p
29080 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f  Walker->u.pIdxCo
29090 76 65 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72  ver->pIdx, pExpr
290a0 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29  ->iColumn)<0.  )
290b0 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65  {.    pWalker->e
290c0 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65  Code = 1;.    re
290d0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
290e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
290f0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
29100 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66  .** Determine if
29110 20 61 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f   an index pIdx o
29120 6e 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72  n table with cur
29130 73 6f 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e  sor iCur contain
29140 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78  s will.** the ex
29150 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
29160 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
29170 74 68 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63  the index does c
29180 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72  over the.** expr
29190 65 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65  ession and false
291a0 20 69 66 20 74 68 65 20 70 45 78 70 72 20 65 78   if the pExpr ex
291b0 70 72 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e  pression referen
291c0 63 65 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ces table column
291d0 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f  s.** that are no
291e0 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69  t found in the i
291f0 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
29200 20 41 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69   An index coveri
29210 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ng an expression
29220 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
29230 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
29240 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75  e.** evaluated u
29250 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e  sing only the in
29260 64 65 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20  dex and without 
29270 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70  having to lookup
29280 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
29290 6e 64 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72  nding table entr
292a0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
292b0 33 45 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e  3ExprCoveredByIn
292c0 64 65 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78  dex(.  Expr *pEx
292d0 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  pr,        /* Th
292e0 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65  e index to be te
292f0 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sted */.  int iC
29300 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ur,           /*
29310 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   The cursor numb
29320 65 72 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  er for the corre
29330 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a  sponding table *
29340 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
29350 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
29360 6e 64 65 78 20 74 68 61 74 20 6d 69 67 68 74 20  ndex that might 
29370 62 65 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65  be used for cove
29380 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c  rage */.){.  Wal
29390 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20  ker w;.  struct 
293a0 49 64 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20  IdxCover xcov;. 
293b0 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
293c0 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f  izeof(w));.  xco
293d0 76 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  v.iCur = iCur;. 
293e0 20 78 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64   xcov.pIdx = pId
293f0 78 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  x;.  w.xExprCall
29400 62 61 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f  back = exprIdxCo
29410 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43  ver;.  w.u.pIdxC
29420 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20  over = &xcov;.  
29430 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
29440 26 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65  &w, pExpr);.  re
29450 74 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d  turn !w.eCode;.}
29460 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  .../*.** An inst
29470 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
29480 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
29490 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74  is used by the t
294a0 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f  ree walker.** to
294b0 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65   count reference
294c0 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d  s to table colum
294d0 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ns in the argume
294e0 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67  nts of an .** ag
294f0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
29500 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d  , in order to im
29510 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73  plement the.** s
29520 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68  qlite3FunctionTh
29530 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e  isSrc() routine.
29540 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f  .*/.struct SrcCo
29550 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20  unt {.  SrcList 
29560 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20  *pSrc;   /* One 
29570 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20  particular FROM 
29580 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74  clause in a nest
29590 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ed query */.  in
295a0 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f  t nThis;       /
295b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
295c0 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
295d0 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f  s in pSrcList */
295e0 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20  .  int nOther;  
295f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29600 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
29610 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20  olumns in other 
29620 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a  FROM clauses */.
29630 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  };../*.** Count 
29640 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
29650 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
29660 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  mns..*/.static i
29670 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28  nt exprSrcCount(
29680 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
29690 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
296a0 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20   /* The NEVER() 
296b0 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65  on the second te
296c0 72 6d 20 69 73 20 62 65 63 61 75 73 65 20 73 71  rm is because sq
296d0 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
296e0 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20  sThisSrc().  ** 
296f0 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64  is always called
29700 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45   before sqlite3E
29710 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
29720 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68  ates() and so th
29730 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e  e.  ** TK_COLUMN
29740 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  s have not yet b
29750 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  een converted in
29760 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
29770 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74  .  If.  ** sqlit
29780 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
29790 69 73 53 72 63 28 29 20 69 73 20 75 73 65 64 20  isSrc() is used 
297a0 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74  differently in t
297b0 68 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20  he future, the. 
297c0 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c   ** NEVER() will
297d0 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f   need to be remo
297e0 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45  ved. */.  if( pE
297f0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
29800 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70  MN || NEVER(pExp
29810 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
29820 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74  LUMN) ){.    int
29830 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53   i;.    struct S
29840 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61  rcCount *p = pWa
29850 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e  lker->u.pSrcCoun
29860 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  t;.    SrcList *
29870 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
29880 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70      int nSrc = p
29890 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63  Src ? pSrc->nSrc
298a0 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   : 0;.    for(i=
298b0 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b  0; i<nSrc; i++){
298c0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
298d0 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e  ->iTable==pSrc->
298e0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62  a[i].iCursor ) b
298f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
29900 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20  if( i<nSrc ){.  
29910 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a      p->nThis++;.
29920 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29930 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20   p->nOther++;.  
29940 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
29950 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
29960 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
29970 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  e if any of the 
29980 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
29990 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20   pExpr Function 
299a0 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72  reference.** pSr
299b0 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74  cList.  Return t
299c0 72 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20  rue if they do. 
299d0 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75   Also return tru
299e0 65 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  e if the functio
299f0 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75  n.** has no argu
29a00 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c  ments or has onl
29a10 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  y constant argum
29a20 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61  ents.  Return fa
29a30 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20  lse if pExpr.** 
29a40 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d  references colum
29a50 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d  ns but not colum
29a60 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75  ns of tables fou
29a70 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a  nd in pSrcList..
29a80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75  */.int sqlite3Fu
29a90 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
29aa0 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53  c(Expr *pExpr, S
29ab0 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
29ac0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
29ad0 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74   struct SrcCount
29ae0 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20   cnt;.  assert( 
29af0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
29b00 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
29b10 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
29b20 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
29b30 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
29b40 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e  prSrcCount;.  w.
29b50 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63  u.pSrcCount = &c
29b60 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d  nt;.  cnt.pSrc =
29b70 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74   pSrcList;.  cnt
29b80 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e  .nThis = 0;.  cn
29b90 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20  t.nOther = 0;.  
29ba0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
29bb0 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78  ist(&w, pExpr->x
29bc0 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  .pList);.  retur
29bd0 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c  n cnt.nThis>0 ||
29be0 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a   cnt.nOther==0;.
29bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
29c00 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
29c10 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
29c20 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
29c30 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
29c40 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
29c50 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
29c60 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
29c70 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
29c80 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
29c90 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
29ca0 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
29cb0 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
29cc0 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
29cd0 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
29ce0 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
29cf0 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
29d00 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
29d10 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
29d20 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  ol[0]),.       &
29d30 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a  pInfo->nColumn,.
29d40 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
29d50 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
29d60 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
29d70 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
29d80 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
29d90 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
29da0 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
29db0 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
29dc0 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
29dd0 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
29de0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
29df0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
29e00 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74  ggInfoFunc(sqlit
29e10 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
29e20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
29e30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  ;.  pInfo->aFunc
29e40 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
29e50 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
29e60 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66  db, .       pInf
29e70 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->aFunc,.      
29e80 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
29e90 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20  Func[0]),.      
29ea0 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a   &pInfo->nFunc,.
29eb0 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
29ec0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
29ed0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
29ee0 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63  the xExprCallbac
29ef0 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c  k for a tree wal
29f00 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64  ker.  It is used
29f10 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
29f20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
29f30 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
29f40 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
29f50 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
29f60 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
29f70 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
29f80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29f90 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
29fa0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
29fb0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
29fc0 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
29fd0 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57  ontext *pNC = pW
29fe0 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
29ff0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
2a000 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53  pNC->pParse;.  S
2a010 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
2a020 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
2a030 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  ;.  AggInfo *pAg
2a040 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67  gInfo = pNC->pAg
2a050 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68  gInfo;..  switch
2a060 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
2a070 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
2a080 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
2a090 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
2a0a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2a0b0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
2a0c0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
2a0d0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2a0e0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
2a0f0 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
2a100 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f  to see if the co
2a110 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f  lumn is in one o
2a120 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  f the tables in 
2a130 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a  the FROM.      *
2a140 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
2a150 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
2a160 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  */.      if( ALW
2a170 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29  AYS(pSrcList!=0)
2a180 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
2a190 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2a1a0 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73  *pItem = pSrcLis
2a1b0 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f  t->a;.        fo
2a1c0 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73  r(i=0; i<pSrcLis
2a1d0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
2a1e0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2a1f0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2a200 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20  _col *pCol;.    
2a210 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2a220 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2a230 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
2a240 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
2a250 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a260 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
2a270 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b  Item->iCursor ){
2a280 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2a290 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
2a2a0 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
2a2b0 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65   that pExpr refe
2a2c0 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20  rs to a table.  
2a2d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
2a2e0 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  t is in the FROM
2a2f0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
2a300 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20  ggregate query. 
2a310 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
2a320 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2a330 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  Make an entry fo
2a340 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  r the column in 
2a350 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
2a360 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20   if there.      
2a370 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
2a380 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61  an entry there a
2a390 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20  lready..        
2a3a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2a3b0 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
2a3c0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67        pCol = pAg
2a3d0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20  gInfo->aCol;.   
2a3e0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
2a3f0 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; k<pAggInfo->nC
2a400 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c  olumn; k++, pCol
2a410 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2a420 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61     if( pCol->iTa
2a430 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
2a440 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
2a450 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
2a460 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
2a470 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
2a480 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2a4b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b            if( (k
2a4c0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  >=pAggInfo->nCol
2a4d0 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  umn).           
2a4e0 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67    && (k = addAgg
2a4f0 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  InfoColumn(pPars
2a500 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
2a510 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )>=0 .          
2a520 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2a530 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49     pCol = &pAggI
2a540 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20  nfo->aCol[k];.  
2a550 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2a560 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
2a570 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
2a580 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65      pCol->iTable
2a590 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
2a5a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a5b0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pCol->iColumn = 
2a5c0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
2a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2a5e0 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ol->iMem = ++pPa
2a5f0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2a600 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2a610 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d  SorterColumn = -
2a620 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
2a630 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70   pCol->pExpr = p
2a640 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
2a650 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
2a660 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
2a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
2a680 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t j, n;.        
2a690 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
2a6a0 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f   *pGB = pAggInfo
2a6b0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
2a6c0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
2a6d0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2a6e0 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61   *pTerm = pGB->a
2a6f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a700 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72    n = pGB->nExpr
2a710 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a720 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
2a730 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
2a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a750 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72   Expr *pE = pTer
2a760 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
2a770 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2a780 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pE->op==TK_COLUM
2a790 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d  N && pE->iTable=
2a7a0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
2a7b0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
2a7c0 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
2a7d0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
2a7e0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
2a7f0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2a800 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
2a810 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
2a820 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a840 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2a850 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2a860 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2a870 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
2a880 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  rterColumn<0 ){.
2a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8a0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2a8b0 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  umn = pAggInfo->
2a8c0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b  nSortingColumn++
2a8d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a8e0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2a8f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a900 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65  here is now an e
2a910 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69  ntry for pExpr i
2a920 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
2a930 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20  [] (either.     
2a940 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
2a950 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62  e it was there b
2a960 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65  efore or because
2a970 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64   we just created
2a980 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20   it)..          
2a990 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    ** Convert the
2a9a0 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54   pExpr to be a T
2a9b0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66  K_AGG_COLUMN ref
2a9c0 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20  erring to that. 
2a9d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41             ** pA
2a9e0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65  ggInfo->aCol[] e
2a9f0 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ntry..          
2aa00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
2aa10 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
2aa20 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
2aa30 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
2aa40 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
2aa50 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
2aa60 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
2aa70 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
2aa80 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
2aa90 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
2aaa0 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20  = (i16)k;.      
2aab0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2aac0 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69         } /* endi
2aad0 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  f pExpr->iTable=
2aae0 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
2aaf0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  */.        } /* 
2ab00 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53  end loop over pS
2ab10 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  rcList */.      
2ab20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  }.      return W
2ab30 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
2ab40 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
2ab50 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
2ab60 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c    if( (pNC->ncFl
2ab70 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75  ags & NC_InAggFu
2ab80 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  nc)==0.       &&
2ab90 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72   pWalker->walker
2aba0 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70  Depth==pExpr->op
2abb0 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  2.      ){.     
2abc0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
2abd0 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ee if pExpr is a
2abe0 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
2abf0 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20  other aggregate 
2ac00 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
2ac10 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72  tion that is alr
2ac20 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67  eady in the pAgg
2ac30 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  Info structure. 
2ac40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2ac50 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2ac60 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70  _func *pItem = p
2ac70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a  AggInfo->aFunc;.
2ac80 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2ac90 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
2aca0 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  nc; i++, pItem++
2acb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2acc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2acd0 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
2ace0 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20  , pExpr, -1)==0 
2acf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
2ad00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2ad10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2ad20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
2ad30 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20  nfo->nFunc ){.  
2ad40 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72          /* pExpr
2ad50 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d   is original.  M
2ad60 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ake a new entry 
2ad70 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  in pAggInfo->aFu
2ad80 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  nc[].          *
2ad90 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  /.          u8 e
2ada0 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
2adb0 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >db);.          
2adc0 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75  i = addAggInfoFu
2add0 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nc(pParse->db, p
2ade0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2adf0 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
2ae00 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
2ae10 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2ae20 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
2ae30 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2ae40 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d           pItem =
2ae50 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   &pAggInfo->aFun
2ae60 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  c[i];.          
2ae70 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
2ae80 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
2ae90 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20      pItem->iMem 
2aea0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2aeb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
2aec0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2aed0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2aee0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
2aef0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2af00 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >pFunc = sqlite3
2af10 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
2af20 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
2af30 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2af40 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20  r->u.zToken, .  
2af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af60 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
2af70 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ? pExpr->x.pList
2af80 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63  ->nExpr : 0, enc
2af90 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2afa0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
2afb0 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
2afc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2afd0 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
2afe0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
2aff0 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b++;.           
2b000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b010 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
2b020 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
2b030 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2b050 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
2b060 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20   pExpr point to 
2b070 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
2b080 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2b090 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20  ] entry.        
2b0a0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
2b0b0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2b0c0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
2b0d0 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
2b0e0 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45  ed) );.        E
2b0f0 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
2b100 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
2b110 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70  duce);.        p
2b120 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
2b130 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78  6)i;.        pEx
2b140 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
2b150 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
2b160 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2b170 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
2b180 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
2b190 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
2b1a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2b1b0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2b1c0 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
2b1d0 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
2b1e0 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c  atesInSelect(Wal
2b1f0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
2b200 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
2b210 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2b220 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55  ER(pWalker);.  U
2b230 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2b240 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75  pSelect);.  retu
2b250 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2b260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
2b270 65 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  e the pExpr expr
2b280 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
2b290 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
2b2a0 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
2b2b0 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
2b2c0 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
2b2d0 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a  d to AggInfo obj
2b2e0 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41  ect that pNC->pA
2b2f0 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73  ggInfo.** points
2b300 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c   to.  Additional
2b310 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64   entries are mad
2b320 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  e on the AggInfo
2b330 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65   object as.** ne
2b340 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  cessary..**.** T
2b350 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
2b360 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
2b370 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72  d after the expr
2b380 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a  ession has been.
2b390 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73  ** analyzed by s
2b3a0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
2b3b0 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69  rNames()..*/.voi
2b3c0 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
2b3d0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e  lyzeAggregates(N
2b3e0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
2b3f0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2b400 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
2b410 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
2b420 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
2b430 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
2b440 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77  zeAggregate;.  w
2b450 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2b460 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2b470 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20  atesInSelect;.  
2b480 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20  w.u.pNC = pNC;. 
2b490 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
2b4a0 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73  rcList!=0 );.  s
2b4b0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
2b4c0 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  w, pExpr);.}../*
2b4d0 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
2b4e0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2b4f0 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
2b500 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
2b510 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
2b520 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
2b530 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
2b540 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
2b550 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
2b560 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
2b570 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76   cut short..*/.v
2b580 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
2b590 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61  nalyzeAggList(Na
2b5a0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
2b5b0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
2b5c0 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
2b5d0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2b5e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
2b5f0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
2b600 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
2b610 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
2b620 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
2b630 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
2b640 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2b650 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74  regates(pNC, pIt
2b660 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
2b670 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
2b680 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65  llocate a single
2b690 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f   new register fo
2b6a0 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f  r use to hold so
2b6b0 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  me intermediate 
2b6c0 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73  result..*/.int s
2b6d0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2b6e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
2b6f0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2b700 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20  TempReg==0 ){.  
2b710 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73    return ++pPars
2b720 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72  e->nMem;.  }.  r
2b730 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54  eturn pParse->aT
2b740 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d  empReg[--pParse-
2b750 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f  >nTempReg];.}../
2b760 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2b770 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69  a register, maki
2b780 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ng available for
2b790 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20   reuse for some 
2b7a0 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65  other.** purpose
2b7b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
2b7c0 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74  ister is current
2b7d0 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79  ly being used by
2b7e0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
2b7f0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64  e, then.** the d
2b800 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64  eallocation is d
2b810 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
2b820 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c  e column cache l
2b830 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a  ine that uses.**
2b840 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62 65   the register be
2b850 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a  comes stale..*/.
2b860 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
2b870 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65  aseTempReg(Parse
2b880 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
2b890 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20  eg){.  if( iReg 
2b8a0 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  && pParse->nTemp
2b8b0 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
2b8c0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
2b8d0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2b8e0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
2b8f0 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69  he *p;.    for(i
2b900 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
2b910 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73  olCache; i<pPars
2b920 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
2b930 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69  +, p++){.      i
2b940 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
2b950 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74   ){.        p->t
2b960 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  empReg = 1;.    
2b970 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
2b980 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
2b990 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
2b9a0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
2b9b0 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  +] = iReg;.  }.}
2b9c0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2b9d0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61   or deallocate a
2b9e0 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63   block of nReg c
2b9f0 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
2ba00 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ters..*/.int sql
2ba10 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
2ba20 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2ba30 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
2ba40 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65   i, n;.  if( nRe
2ba50 67 3d 3d 31 20 29 20 72 65 74 75 72 6e 20 73 71  g==1 ) return sq
2ba60 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
2ba70 70 50 61 72 73 65 29 3b 0a 20 20 69 20 3d 20 70  pParse);.  i = p
2ba80 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2ba90 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  n = pParse->
2baa0 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28  nRangeReg;.  if(
2bab0 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20   nReg<=n ){.    
2bac0 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73 43  assert( !usedAsC
2bad0 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
2bae0 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a  e, i, i+n-1) );.
2baf0 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
2bb00 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20  geReg += nReg;. 
2bb10 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
2bb20 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20  eReg -= nReg;.  
2bb30 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70  }else{.    i = p
2bb40 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
2bb50 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
2bb60 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72  += nReg;.  }.  r
2bb70 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20  eturn i;.}.void 
2bb80 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2bb90 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
2bba0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
2bbb0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66   int nReg){.  if
2bbc0 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nReg==1 ){.   
2bbd0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2bbe0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
2bbf0 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Reg);.    return
2bc00 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
2bc10 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
2bc20 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65  Parse, iReg, nRe
2bc30 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70  g);.  if( nReg>p
2bc40 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2bc50 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
2bc60 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67  nRangeReg = nReg
2bc70 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
2bc80 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a  angeReg = iReg;.
2bc90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
2bca0 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  k all temporary 
2bcb0 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69  registers as bei
2bcc0 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66  ng unavailable f
2bcd0 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69  or reuse..*/.voi
2bce0 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65  d sqlite3ClearTe
2bcf0 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65  mpRegCache(Parse
2bd00 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
2bd10 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20  rse->nTempReg = 
2bd20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  0;.  pParse->nRa
2bd30 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f  ngeReg = 0;.}../
2bd40 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68  *.** Validate th
2bd50 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20  at no temporary 
2bd60 72 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77  register falls w
2bd70 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
2bd80 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c  of.** iFirst..iL
2bd90 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20  ast, inclusive. 
2bda0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2bdb0 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20   only call from 
2bdc0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a  within assert().
2bdd0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  ** statements..*
2bde0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2bdf0 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
2be00 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28  3NoTempsInRange(
2be10 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2be20 6e 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69  nt iFirst, int i
2be30 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Last){.  int i;.
2be40 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52    if( pParse->nR
2be50 61 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20  angeReg>0.   && 
2be60 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2be70 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g+pParse->nRange
2be80 52 65 67 3c 69 4c 61 73 74 0a 20 20 20 26 26 20  Reg<iLast.   && 
2be90 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2bea0 67 3e 3d 69 46 69 72 73 74 0a 20 20 29 7b 0a 20  g>=iFirst.  ){. 
2beb0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2bec0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
2bed0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b  Parse->nTempReg;
2bee0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
2bef0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2bf00 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50  i]>=iFirst && pP
2bf10 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69  arse->aTempReg[i
2bf20 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20  ]<=iLast ){.    
2bf30 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
2bf40 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
2bf50 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2bf60 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a        LITE_DEBUG */.